What is a campaign?
Batch send to an audience using a multi-channel template. Dashboard and API share the same queue, credits, and status. Analogy: template is the letter. Segment is the address list. Campaign is stamp and drop in the mailbox.Campaign × segment × direct send
When to use?
Great for newsletters, promotions to filtered audiences, and testing with few IDs before the full base. For a single alert via script, use direct channel or template send.Campaign channels
channels accepts: whatsapp, sms, email, telegram, push, rcs, instagram.
Each listed channel must be enabled on the template.
Missing phone, email, or peer → contact skipped for that channel (no per-person error).
Marketing: contact needs
receiveMarketing and topic subscription when template is linked. Others do not enter the queue.If a channel fails at send time
channelFailureMode controls what happens when a channel cannot send due to infra issues (unverified email domain, missing WhatsApp/Telegram instance, etc.).
Dashboard: If a channel fails at send. API:
channelFailureMode on create/patch. Valores: STRICT (padrão) ou PARTIAL.
With PARTIAL, you can save the campaign even with pending infra; at Run time, a channel only queues if infra is OK. With STRICT, create/patch already requires a verified email domain, WhatsApp sender in from (instance or pool), and telegramInstanceId when the channel is in the campaign.
How it works in practice
- Template with active channels and content
- New campaign, name, template, channels, audience (segment or IDs)
- Routing per channel table above
- Optional: schedule one or more dates → SCHEDULED runs
- Preview segment if used
- Immediate Run or fire at the scheduled time → RUNNING → COMPLETED or FAILED
Run again (re-dispatch)
You can run the same campaign more than once without editing the draft. In the Run confirmation dialog:
Analogy: the campaign is the envelope template; each Run is another trip to the mail queue. You pick which couriers (channels) go out this time and can skip who already received.
In the API:
GET /v1/campaigns/{id}/run-preview returns overlap, cost, and warnings; POST /v1/campaigns/{id}/run accepts channels[] and excludeAlreadySent. Each run stores effective channels in channelsUsed.
Schedule sends
In the Schedule panel, channel and resend options match Run:
Each scheduled Run persists
channelsOverride (or all channels if omitted/null) and excludeAlreadySent. At fire time, the scheduler uses the same Run flow with those values.
Already-scheduled runs are not editable for these fields — cancel and create again. The upcoming-sends list shows channels and whether exclude-already-sent is on.
Status
In the API
Run returns
sent and runId. Short links get utm_campaign and utm_content automatically.
Checklist before Run
- Campaign channels enabled on template?
- Segment Preview makes sense?
- Telegram peers on correct instance?
- Tested with few IDs?
- Credits, instances, and email sender OK?

