Skip to main content
Campaign = what (template) + where (channels) + who (segment or IDs). Run queues sends, not a separate engine from the send API.

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

  1. Template with active channels and content
  2. New campaign, name, template, channels, audience (segment or IDs)
  3. Routing per channel table above
  4. Optional: schedule one or more dates → SCHEDULED runs
  5. Preview segment if used
  6. Immediate Run or fire at the scheduled time → RUNNINGCOMPLETED 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

  1. Campaign channels enabled on template?
  2. Segment Preview makes sense?
  3. Telegram peers on correct instance?
  4. Tested with few IDs?
  5. Credits, instances, and email sender OK?

Next steps