Skip to main content
A campaign in Zexa lets you send one message to hundreds or thousands of recipients at once. You pick the channel, choose a contact list, compose your message, and Zexa handles delivery and tracking.

Create a campaign

1

Open New Campaign

In the Zexa dashboard, go to Campaigns > New Campaign.
2

Choose a channel

Select the delivery channel for this campaign: SMS, WhatsApp, Telegram, Email, or Slack.
3

Select a contact list

Pick an existing contact list or upload a new CSV file. Zexa will count the eligible recipients before you send.
4

Compose your message

Write your message body. If you selected WhatsApp, choose an approved template instead of typing freeform text. See Templates for details.
5

Set a Sender ID

Choose the Sender ID that recipients will see in the From field. The Sender ID must already be approved for the selected channel. See Sender IDs.
6

Schedule or send immediately

Optionally set a future send time using the date/time picker, or click Send Now to dispatch the campaign immediately.
7

Monitor the campaign report

After sending, open the campaign report to track delivery, failures, and opt-outs in real time.

Campaign via API

Send a POST request to /campaigns to create and launch a campaign programmatically.
curl --request POST \
  --url https://api.zexa.ao/v1/campaigns \
  --header "Authorization: Bearer <api_key>" \
  --header "Content-Type: application/json" \
  --data '{
    "name": "June Promo",
    "channel": "sms",
    "contact_list_id": "lst_abc123",
    "sender_id": "ZEXA",
    "body": "Enjoy 20% off this weekend! Reply STOP to opt out.",
    "scheduled_at": null
  }'
A successful response returns a campaign object:
{
  "id": "cmp_xyz789",
  "status": "processing",
  "name": "June Promo",
  "channel": "sms",
  "total_recipients": 1500,
  "created_at": "2026-06-24T10:00:00Z"
}

Check campaign status

Retrieve the current status and delivery metrics for any campaign with a GET request:
curl
curl --request GET \
  --url https://api.zexa.ao/v1/campaigns/cmp_xyz789 \
  --header "Authorization: Bearer <api_key>"
{
  "id": "cmp_xyz789",
  "name": "June Promo",
  "status": "sent",
  "total_recipients": 1500,
  "delivered": 1463,
  "failed": 37,
  "created_at": "2026-06-24T10:00:00Z",
  "sent_at": "2026-06-24T10:02:15Z"
}

Campaign statuses

StatusDescription
draftThe campaign has been created but not yet sent or scheduled.
scheduledThe campaign is queued and will be dispatched at the time set in scheduled_at.
processingZexa is actively dispatching messages to recipients.
sentAll messages have been submitted to the delivery network.
failedThe campaign encountered a fatal error and could not be sent. Contact support.

Scheduling

Set the scheduled_at field to an ISO 8601 timestamp to delay dispatch:
{
  "scheduled_at": "2026-07-01T08:00:00Z"
}
All times are interpreted as UTC. Pass null for scheduled_at to send immediately. You can update a scheduled campaign’s send time via PATCH /campaigns/{id} as long as its status is still scheduled.
Always include an opt-out instruction in SMS campaign messages — for example, “Reply STOP to unsubscribe.” This is a best practice in most markets and required by carriers in many regions.
Campaigns cannot be cancelled or modified once their status changes to processing. Review your recipient list, message body, and Sender ID carefully before sending.

Contacts

Import and manage the contact lists you target in campaigns.

Sender IDs

Register and get approval for the name shown to your recipients.

Templates

Create pre-approved WhatsApp message templates for outbound campaigns.