Campaigns are one-time broadcasts. They send the message and stop. When a recipient replies, the reply is handled by the SMS agent on that number - not by the campaign itself.
How replies work
A campaign only sends. When a recipient texts back, the reply is answered by the SMS agent on that number, using that number’s own SMS instructions (its sms_prompt) - the same agent that answers every inbound text. The campaign message is not carried into the reply automatically. If you want the agent to handle replies about a promotion, put the promotion details in the number’s sms_prompt before you launch. Otherwise the agent does not know the campaign went out. For example, add to the number’s sms_prompt:We are running a March promotion: 20 percent off cleanings, valid weekdays 9am-5pm next week. If a customer replies YES, confirm the offer and ask which day suits them. Then when someone replies YES - or asks about the offer - the SMS agent already knows what to say, and can even book them in if the number has a booking calendar connected. See the SMS agent page for the full reply behaviour.
Campaigns run from Twilio and Telnyx numbers alike. The From number decides which
of your carrier accounts sends the messages and which one bills you for them.
Create a campaign (API)
Personalization with placeholders
Use{{variable_name}} in your message_template. Each recipient’s variables object fills the placeholders.
Template:
Recipient:
Hi Sarah, your appointment is on Tuesday at 2pm.
If a placeholder has no matching variable, it renders as an empty string (no crash). Same pattern as Twilio, SendGrid, and Mailchimp.
From the dashboard
In the dashboard, Outbound → SMS Campaigns → New Campaign, you can add recipients two ways:- Paste numbers: drop in a list separated by commas, tabs, spaces, or newlines. The form auto-detects phones (E.164 format) and any extra columns become variables.
- Upload CSV: drag-and-drop or browse. The form auto-detects the phone column from headers (
phone,number,mobile,tel,telephone) and treats all other columns as variables.
Scheduling
Send later instead of now:status: scheduled until the time arrives. You can cancel it before then with DELETE /v1/sms/campaigns/:id.
Tracking delivery
Get campaign status:How counts are calculated
Counts come from per-recipient status, not from a cached field. Same logic in the dashboard and the API — they always match.Why does
sent count as failed? Twilio’s sent status only means Twilio handed the message off to the carrier — not that it reached the handset. Carrier confirmation comes as delivered. We treat anything that did not reach delivered as failed, so what you see in the dashboard matches what really happened.Campaign status
Per-recipient status
List campaigns
Cancel a campaign
scheduled or running campaign. Already-sent messages are not recalled. A done campaign cannot be cancelled.
Source tracking
Every campaign records where it came from in thesource field: "dashboard" or "api". The dashboard shows this as a badge so you can tell at a glance which campaigns came from automation versus manual sends.