Send an SMS Campaign
Get a short, time-sensitive message into every recipient's pocket —
an OTP, an appointment reminder, a flash promo — through your own
verified SMS provider (Twilio, MSG91, Exotel, or Kaleyra). SMS is the
fastest, highest-reach channel when you need people to read something
now. This page covers the SMS-specific choices: which provider you
send from and which approved template (with its {{variables}})
goes out. Audience, Schedule & Review, and Stats work the
same for every channel and are linked below.
Entry pointGrowth → Campaigns → New Campaign
| Article summary | Details |
|---|---|
| Requires | A connected and Verified SMS account (Twilio / MSG91 / Exotel / Kaleyra) and at least one approved SMS template. |
| Where to go | Growth → Campaigns → New Campaign → Setup → SMS. |
| Time to set up | 2-4 minutes for the SMS-specific steps, before audience selection. |
Who Can Do This
- Growth operators and marketing managers create SMS campaigns.
- Account admins are usually needed once — to connect and verify the SMS provider account and to approve the templates the team uses.
- Sales managers review the audience, the post-send delivery history, and any replies that come back.
What You Need
- A Verified SMS account under Automation → Integrations →
SMS. Without at least one Verified provider account, the SMS
sender panel on Setup stays empty and you can't continue. See:
- Connect Twilio
- Connect MSG91
- or the SMS overview at Integrations → SMS.
- At least one approved SMS template in the template library — Brixi does not let you compose an ad-hoc SMS body in the campaign creator. Every SMS campaign sends a pre-approved, versioned template (OTP, Transactional, or Promotional).
- A clean recipient list with first name, last name, and a valid
PhoneNumber column including the country ISD code
(
+919876543210, not9876543210). See Campaign Audience for the full CSV format. - A schedule decision — send now, or pick a date / time / timezone.
- For India sends: a DLT-registered Sender ID and DLT Template ID must already be configured on the SMS account (MSG91 connect covers this end-to-end).
Pick the Display Name on the SMS account so it
signals the use case, not the provider — e.g.,
India transactional rather than Twilio 1.
The campaign sender picker shows the Display Name, not the SID, so
whoever picks it later doesn't have to know which provider is
underneath.
SMS Campaign Flow At A Glance
Brixi uses the same 4-step creator for every campaign channel:
- Setup — name the campaign and pick the channel + sender. SMS sender is SMS-specific, the rest is shared.
- Content — pick the message. SMS templates are
SMS-specific — short body,
{{variables}}, and (for India) DLT-registered IDs. - Audience — choose Contact List, Dynamic Segment, or CSV / XLSX upload. Shared across all channels — see Campaign Audience.
- Schedule & Review — review the Launch Summary and send now or schedule. Shared across all channels — see Schedule & Review.
Only Setup and Content are SMS-specific. The rest of this page goes deep on those two, then links to the shared docs for the other two steps so the same instructions don't get repeated for every channel.
Step 1 · Setup — Name the Campaign and Pick the SMS Sender
Open Growth → Campaign → + New Campaign. The Setup step (titled Create the campaign shell) opens with three things to fill in:
- Campaign Name — used in the campaign list and the stats view.
Keep it descriptive — e.g.,
2026-06 OTP fallbackorbengaluru_may_23 reminder. - Delivery channel — pick SMS (the Fast text messaging card). The instant you tick SMS, the right-hand Sender account panel turns into SMS sender and lists every Verified SMS account in the workspace.
- SMS sender — search or scroll the list, click the SMS account you want to send from. An SMS sender selected badge appears, the sender row highlights, and a Setup ready badge replaces Setup incomplete in the top-right.
When the badge says Setup ready, Continue lights up. Click it.

The SMS channel is selected but the right-hand panel stays empty — that means no SMS account is Verified for this workspace. Connect one first (see Connect Twilio or Connect MSG91), make sure it shows Verified under SMS Accounts, then reload the creator. Draft / Failed accounts are not listed.
Why the sender choice matters
| Choice | What it affects |
|---|---|
| The Sender ID subscribers see | The provider's registered Sender ID is the literal sender on every send (a phone number for Twilio, an alphanumeric or short code for MSG91 / Exotel / Kaleyra). |
| Whose delivery / billing is used | Sends are billed to the underlying provider account — Brixi is a passthrough. |
| Which DLT entity / template IDs apply | India sends route through whichever DLT Entity ID is configured on the chosen account. Templates and Entity IDs must match. |
| Where replies land | Inbound SMS reply handling depends on the provider — see the provider's connect page for reply / webhook setup. |
Step 2 · Content — Pick an Approved SMS Template
The Content step (titled Message Design — Select a template) shows every SMS template the workspace owns. Each card has:
- Template name and version — e.g.,
MFA_PHONE_NUMBER_LOGIN_WEB_OTP_V1,ONBOARDING_MOBILE_NUMBER_VERIFICATION_V1,test_promotion. - Preview snippet of the body — e.g.,
{{otp}} is your OTP for signing in to Brixi. – Brixi. - Type badge — typically
OTP,TRANSACTIONAL, orPROMO.
Click the Search templates by name box to filter, then click a
card to load it on the right. The right pane switches from
"Choose a template to preview — The selected content preview will
appear here" to the rendered template body with the variables
left as literal {{name}} so you can see exactly what will be
substituted at send time.
Approved templates only — Brixi does not let you compose or paste an ad-hoc SMS in the campaign creator. Every SMS campaign uses a versioned, pre-approved template.
Open the preview before continuing. SMS templates render the
variables as literal {{otp}} /
{{code}} in preview — the live send substitutes
them per-recipient from the audience CSV (or the workflow that
triggered the send). If a variable is missing in the audience CSV,
the live send falls back to whatever the template's default
expression specifies — often a blank.
SMS templates vs Email templates
| SMS templates | Email templates | |
|---|---|---|
| Body length | Tight — typically one or two SMS segments | Full HTML body |
| Attachments | None (SMS doesn't support files) | Global attachments on the Content step |
| Variables | Inline {{variable}} only | Inline + template-side defaults |
| Approval | Workspace approval + (India) DLT Template ID | Workspace approval only |
| Per-recipient cost | Per-segment | Per-send |
When a template card is highlighted, click Continue → moves to Audience.
Step 3 · Audience — Pick Your Recipients
The Audience step is shared across all four channels — the same three options (Contact List / Dynamic Segment / File Upload) appear regardless of channel. SMS-specific details:
- Sample CSV header is
FirstName, LastName, PhoneNumber. - A row without a valid phone is skipped — phones are the join key.
- Phone numbers must include the country ISD code
(
+919876543210, not9876543210). Rows without+<country>prefixes are dropped. - The sample-contacts preview shows a Variables detected badge if
the CSV includes columns beyond the required three (e.g.,
otp,code,name) — those values become template variables on the matching template. - The mandatory compliance checkbox — "I confirm that I have acquired these contact details through explicit opt-in and have legal permission to send them marketing communications" — must be ticked before Continue lights up.

The full audience picker, dynamic segments, CSV format, and common upload errors are documented once for every channel on the shared audience page:
Step 4 · Schedule & Review — Schedule or Send Now
The Schedule & Review step is shared across all four channels. SMS's Launch Summary shows Connector = the SMS account (Display Name) and the Template preview block with the body and its variables.

The full schedule + launch behaviour — Send Now vs Schedule Later, timezone picker, Launch Summary, Preview / Test, Publish / Update / Reschedule — is documented once on:
After the Campaign Is Created
Once the campaign is created, the Campaigns list (Growth →
Campaign) shows it with the SMS channel tag, status, audience
count, schedule, and an Actions menu (...) on the right of
the row. The menu changes slightly based on the current status:
| Status | Available actions |
|---|---|
| Draft | View · Edit · Go to Publish · Schedule · Clone · Delete |
| Scheduled | View · Edit · Schedule · Pause · View Stats · Clone · Delete |
| Paused | View · Edit · Resume · View Stats · Clone · Delete |
| Sending / Sent | View · View Stats · Clone · Delete |

- View opens a read-only copy of the 4-step creator. Every field — sender, template, audience, schedule — is visible but the badge in the top-right reads Read only.
- Edit opens the creator with Update Campaign instead of Send / Schedule — change any step, then Update Campaign.
- Go to Publish opens the campaign at the Schedule & Review step with Publish ready (useful when you saved a Draft halfway through).
- Schedule (inline button or menu) opens the Schedule Campaign modal with Send Now / Schedule Later. On an already-Scheduled campaign, this is the same modal — it re-schedules.
- Pause stops a scheduled campaign before its send time. A Campaign paused toast appears and the status flips to Paused; the action becomes Resume in the menu.
- Clone copies the campaign into a new Draft with sender,
template, and audience pre-filled. The clone has
(Copy)appended to the name and a Campaign cloned as draft toast appears. Useful for recurring sends — clone the last campaign, swap the audience or template, reschedule. - Delete removes the campaign. Sent campaigns keep their stats — but the campaign row disappears from the list.
Review Campaign Stats
When an SMS campaign starts sending, View Stats opens the campaign's delivery history with the same 8 status tiles every channel uses. SMS-specific interpretation:
| Tile | What it means for SMS |
|---|---|
| Scheduled | Recipient is queued — campaign hasn't reached this row yet. |
| Paused | Recipient held mid-send by a Pause action. |
| Sending | Recipient handed to the SMS provider — awaiting accept. |
| Sent | Accepted by the provider (Twilio / MSG91 / etc.). Not yet confirmed delivered. |
| Delivered | Provider returned a DLR (Delivery Receipt) confirming the carrier accepted the message. |
| Engaged | Inbound reply received on the SMS account (only providers that support inbound). |
| Failed | Provider rejected, DLT mismatch (India), bad phone number, or carrier reject. |
| Cancelled | Skipped — audience pruned before send, Pause window expired, or a manual cancel. |
Below the tiles, Total audience records confirms how many rows came in from the audience step, and the per-recipient table breaks down each row's outcome. Use Export Result (top-right) to download the full delivery history as a CSV — the export includes the provider's message SID / DLR reason so you can correlate with Twilio / MSG91 logs.
The shared stats reference covers tile-by-tile definitions, the audience delivery history table, and Export Result in detail:
Common Issues
| Issue | What to check |
|---|---|
| SMS channel card greys out as soon as I select it | Page hasn't finished loading — wait for the sender panel to render, then click again. |
| SMS sender panel stays empty after picking SMS | No SMS account is Verified. Connect Twilio / MSG91 / Exotel / Kaleyra and verify the account first (see SMS integration), then reload the creator. |
| Continue stays disabled on Setup | Both Campaign Name and a selected SMS sender are required — confirm the Setup ready badge shows in the top-right. |
| Template list is empty | No approved SMS templates exist in this workspace. An admin needs to publish at least one in the template library. |
Template preview shows raw {variable} placeholders | Expected — preview keeps the variable expressions visible. The live send substitutes them per-recipient from the audience CSV. |
| Recipients get the SMS but variables are blank | The audience CSV is missing the variable column the template expects (e.g., otp, code). Re-upload with the column included, or pick a template that doesn't require it. |
| Sends rejected with DLT mismatch (India) | The template's DLT Template ID and the SMS account's DLT Entity ID don't match. Re-register the template against the same Entity ID, or pick a template registered against the right Entity. |
| Sends rejected with Invalid From number (Twilio) | The Sender ID isn't a number on the same Twilio account, or the number is in Twilio Trial mode and the recipient is unverified. |
| Recipients get the SMS from a wrong / unfamiliar number | An admin changed the Sender ID on the SMS account between scheduling and send. Re-verify the sender on the campaign before launch. |
| Campaign moves straight to Failed | The SMS account is no longer Verified (credentials rotated, account suspended) — re-verify under Automation → Integrations → SMS then Resume the campaign. |
| Sent count is lower than audience count | Rows without a valid phone (or rows missing the +<country> prefix) were skipped at send time. Open View Stats → Failed to see which rows. |
| Delivered count stays lower than Sent | Carrier never confirmed delivery — common for international sends. The provider console (Twilio / MSG91) usually has more granular DLR codes. |
| Engaged stays at 0 | Inbound SMS isn't enabled on the chosen account — the provider needs a reply webhook configured (Twilio Messaging Service inbound URL, MSG91 inbound number). |
An empty SMS sender panel, a missing template, or a DLT mismatch on India sends are all admin-side fixes — ask your admin to verify the provider account under Automation → Integrations → SMS and to confirm the template's DLT IDs match the account's Entity ID.
Contact Brixi support if the account shows Verified, the template is approved, and sends still fail without a provider-side reason in the Export Result CSV. Include the campaign name, the SMS account's Display Name, and a couple of failed rows from the export.