SMS and WhatsApp share the same broadcast pipeline as email. Same campaign record, same template variables, same delivery log — just a different channel. The wrinkle is carrier and Meta approval: SMS needs A2P 10DLC for US local numbers, and WhatsApp Business needs every template approved by Meta before it can be used.
SMS prerequisites
Before sending any volume of SMS:
- Connect Twilio — see Twilio integration.
- Buy or import the sending number — see Phone numbers.
- Register for SMS — see SMS. For US 10DLC this means brand vetting + campaign approval (~1-3 weeks). Toll-free verification is faster.
Until the registration is approved, the carriers throttle or block your messages — there is no workaround.
Sending SMS through a broadcast
Create a broadcast with channel: 'sms' and send the same way you would email. The pipeline reads the org's connected Twilio account, resolves the sender number (the system phone or one you specify), and dispatches via Twilio's messaging service for proper rate limits and opt-out handling.
{
"data": {
"broadcastName": "March promo",
"channel": "sms",
"type": "sms",
"content": "{{firstName}}, 20% off this weekend with code MAR20: https://acme.app/m",
"senderPhone": "+14155551234",
"recipientMethod": "lists",
"selectedLists": ["sms-promotions"]
}
}
Trigger the send:
/broadcast/{id}/sendJWTThe first send for an org without a service agreement returns 402 Payment Required. Accept the agreement at:
/org-management/services/bulk-sms/agreement/acceptJWTPer-message rate
Twilio's per-second cap is set by your registered campaign type. The broadcast queue paces sends to stay under it; raising the cap is a Twilio support ticket, not a config flag.
Each send writes a broadcast_delivery record with status updates as Twilio reports them via webhook (see Delivery tracking).
Opt-out handling
Twilio handles STOP / UNSUBSCRIBE / CANCEL natively — the carrier blocks subsequent messages to that number for the next 30+ days. AppEngine also writes optedOut: true on the contact and sets a CRM activity so subsequent automations skip the contact entirely. HELP triggers a brand-identification auto-response (configurable per number).
WhatsApp Business
WhatsApp goes through Twilio's WhatsApp Business API. The setup is two-step:
- Connect a WhatsApp Business number (Twilio Console → Senders → WhatsApp Senders).
- Submit each message template to Meta for approval.
A "template" is the precise text Meta will accept; you can't send free-form to users who haven't messaged you in the last 24 hours. Variables ({{1}}, {{2}}, ...) are positional — Meta does not allow named placeholders. The Broadcast template editor maps your contact fields to those positions.
Template categories
When you submit a template, Meta requires a category:
- Authentication — OTPs, verification codes
- Marketing — promotions, sales
- Utility — order updates, account notices
Categories affect pricing per conversation and what content Meta will approve. Authentication is the most restrictive (no marketing language); utility is the workhorse for transactional messaging.
Submitting and tracking templates
Templates are managed through Twilio's Content API. AppEngine wraps the create / list / status calls so you can submit from the broadcast UI without leaving AppMint. Once submitted, status flows through:
draft → pending → approved | rejected
Approval typically takes minutes for utility templates, longer for marketing. Rejection includes a reason — fix and resubmit.
Sending a WhatsApp broadcast
{
"data": {
"broadcastName": "Order shipped notification",
"channel": "whatsapp",
"type": "whatsapp",
"templateSid": "HXabcdef...",
"templateVariables": {
"1": "{{contact.firstName}}",
"2": "{{order.trackingNumber}}"
},
"senderPhone": "whatsapp:+14155551234",
"recipientMethod": "lists",
"selectedLists": ["customers-with-recent-orders"]
}
}
The send fans out one Twilio Content API call per recipient. Rate limits are different from SMS — WhatsApp Business has tier-based send caps (1k / 10k / 100k / 1M conversations per day per business number, rising as your quality rating climbs).
24-hour conversation window
Outside the 24-hour window after a user's last inbound message, you can only send approved templates. Inside the window, you can send free-form text and media. Both flows go through the same broadcast endpoint; the pipeline picks the right send method based on whether the recipient has messaged in the last 24 hours.
Inbound replies
Inbound SMS and WhatsApp messages POST to:
/connect/webhook/twilio/smsNo authThe webhook stores the message as a chat_message (also surfacing in the unified inbox), pushes it to subscribed softphone devices, and triggers any matching SMS keyword automation.
Meta treats edits as new templates. Plan content carefully — even small wording tweaks send the template back through approval. For copy that changes often, use variables for everything that varies.
Cost tracking
SMS and WhatsApp costs are reported through Twilio's status callbacks (price and price-unit fields). The broadcast pipeline writes them to the broadcast_delivery row and the org's usage ledger so per-campaign cost is visible without leaving AppMint.