> For the complete documentation index, see [llms.txt](https://docs.codemash.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.codemash.io/cloud/push/campaigns.md).

# Campaigns

Bulk push sends to a chosen audience.

> One template, one audience, one send — split into batches and tracked message by message.

*Last updated 2026-09-11 · Applies to any project with the Push module enabled*

## Why it exists

Triggers are good at "when this happens, notify that person". A campaign is the other job: you decide who, you decide when, and you press Send. Because a send can be thousands of devices, Norbix breaks it into **batches** and records the state of every batch and every message, so a send is something you can watch and stop rather than something you fire and hope for.

## When you'd use it

* Announce a new release to every user with the `beta-tester` role on release morning.
* Remind the twelve people signed up for tomorrow's webinar, scheduled for 09:00 in each person's own time zone.
* Send a price-drop notice to recipients read from a database collection.

## Where to find it

Push → **Campaigns** · `/projects/<project>/push/campaigns`

<figure><img src="https://760328771-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LwSkuCpTNI_AerL8J2a%2Fuploads%2Fgit-blob-20cc9411dd8294911873a054630b507fe7eeb1ac%2Fpush.jpg?alt=media" alt=""><figcaption><p>Push → Campaigns.</p></figcaption></figure>

## How to use the list

Requires a role that carries `…:notifications:push:campaigns:read-all` to see the list and `…:campaigns:create` to start one.

1. Open **Push → Campaigns**. Each row shows **Recipients**, **Status**, **Integration**, **Template** and **Created On**.
2. The list refreshes itself every 15 seconds, so you can leave it open and watch a running campaign move through its statuses.
3. Narrow the list with the filters: **Template ID** (e.g. `tmpl_5Rf3EKWEKMsihdBkPAcK0`), **Date From** and **Date To**.
4. Click a row to open the [campaign details](/cloud/push/campaigns/details.md) — batches, per-message state and the **Stop** action.
5. Click **Create Campaign** to start a new one — see [Create a Campaign](/cloud/push/campaigns/new.md).

**What a finished send looks like:** the row's status settles on **Completed**, and the details page shows every batch as Completed.

## What the statuses mean

| Status                       | What is happening                                                             |
| ---------------------------- | ----------------------------------------------------------------------------- |
| **Pending**                  | Created, not yet accepted for processing                                      |
| **Registered**               | Accepted; recipients are being resolved                                       |
| **Scheduled**                | Waiting for the date and time you picked                                      |
| **Started** / **Processing** | Batches are being handed to the provider                                      |
| **Completed**                | Every batch finished                                                          |
| **Stopped**                  | You stopped it; remaining recipients were not notified                        |
| **Failed**                   | The send could not be completed — open the campaign to see which batch failed |

## Good to know

* A campaign is a snapshot of intent, not of content: it points at a template by id, so editing the template after a send does not rewrite messages that already went out, but it does change a campaign still waiting to be sent.
* Stopping is not undoing. Batches already handed to the provider finish; only the recipients not reached yet are dropped.
* Recipients with no registered device are simply not reachable by push. They will not appear as failures, so a "Completed" campaign can still have notified fewer people than you expected — check [Devices](/cloud/push/devices.md).
* A campaign needs a provider. If no integration is set as default for the environment and the template does not name one, the send cannot start.

## Do it in code

{% tabs %}
{% tab title="JavaScript / TypeScript" %}

```ts
const campaigns = await norbix.hub.notifications.getPushCampaigns({
  projectId: '<your-project-id>',
});

await norbix.hub.notifications.stopPushCampaign({
  projectId: '<your-project-id>',
  id: 'cmp_4RXMBq6T24SOIilOBtkao9',
});
```

{% endtab %}

{% tab title="Python" %}

```python
campaigns = norbix.notifications.get_push_campaigns(projectId="<your-project-id>")
```

{% endtab %}

{% tab title="Go" %}

```go
var campaigns map[string]any
err := c.Hub.Notifications.GetPushCampaigns(ctx, map[string]any{
	"projectId": "<your-project-id>",
}, &campaigns)
```

{% endtab %}

{% tab title=".NET" %}
Not available yet — the .NET SDK has no push client methods. Call the REST endpoints below.
{% endtab %}
{% endtabs %}

Stopping a campaign is in the TypeScript SDK today; Go and Python expose the read and create methods, so use the REST endpoint below to stop from those two.

Reference: [Get Push Campaigns](/sdks-and-cli/notifications/push/get-push-campaigns.md) · [Create Push Campaign](/sdks-and-cli/notifications/push/create-push-campaign.md) · [Stop Push Campaign](/sdks-and-cli/notifications/push/stop-push-campaign.md) CLI: `norbix push campaigns` · `norbix push campaign <id> --stats` · `norbix push stop <id> --yes`

## API reference

Endpoints: [Get Push Campaigns](/api-reference/notifications/push/get-push-campaigns.md), [Create Push Campaign](/api-reference/notifications/push/create-push-campaign.md), [Stop Push Campaign](/api-reference/notifications/push/stop-push-campaign.md), [Delete Push Campaign](/api-reference/notifications/push/delete-push-campaign.md).

## Related

[Create a Campaign](/cloud/push/campaigns/new.md) · [Campaign details](/cloud/push/campaigns/details.md) · [Templates](/cloud/push/templates.md) · [Devices](/cloud/push/devices.md)
