Broadcasts
Broadcast targeted WhatsApp template messages to thousands of contacts — immediately or on a schedule, with real-time delivery tracking.
What is a Broadcast?
A Broadcast sends an approved Meta template message to a list of contacts in a single action. Every recipient gets an individual WhatsApp conversation — not a group message.- Only Meta-approved templates can be used (required for business-initiated conversations).
- Can be launched immediately or scheduled for any future date and time.
- Scheduled broadcasts launch automatically — no manual action needed when the time arrives.
- Built-in real-time delivery tracking: sent, delivered, read, failed, and queued counts update live.
- Contacts who have opted out are automatically excluded.
Creating a Broadcast
1
Open Broadcasts → New Broadcast
Click New Broadcast. Give it a descriptive internal name (visible only to your team, not recipients).
2
Select a WhatsApp account and template
Pick the connected WhatsApp number and an approved template from the dropdowns. A live template preview appears on the right side of the form, showing the header, body, footer, and buttons exactly as recipients will see them.
3
Map template variables
If your template contains placeholders like
{{1}}, {{2}}, map each one to either:- Static Text — the same value for every recipient (e.g. a discount code, event name).
- From Contact — a contact field: Name, Phone, Email, or any of your custom fields (cf1–cf10).
4
Add header media (if required)
If your template has an IMAGE, VIDEO, or DOCUMENT header, a media section appears. Choose Upload (drag a file — it uploads to secure cloud storage and inserts the URL automatically) or URL (paste a direct public link). A thumbnail preview confirms the right file is selected.
5
Choose your audience
Select All Contacts (all opted-in contacts) or By Tags (only contacts with one of the specified tags). Opted-out and blocked contacts are always excluded regardless of audience selection.
6
Set schedule and rate limit
Choose Send Now or pick a future date and time for automatic launch. Adjust the rate limit (messages per second) — defaults to your org setting, max 80/sec per Meta limits.
7
Create and launch
Click Create Broadcast. If scheduled, the broadcast moves to Scheduled status and will launch automatically. If set to now, click Launch on the broadcast card.
Warning
Meta limits business-initiated conversations per day based on your tier: Tier 1 = 1,000/day, Tier 2 = 10,000/day, Tier 3 = 100,000/day. Broadcasts over your limit are queued and sent as capacity becomes available.
Broadcasting on Telegram
Once your Telegram bot is connected (Integrations → Telegram), a Send on choice appears when you create a broadcast or a recurring broadcast. Pick Telegram.- It goes to everyone who has started a chat with your bot. People who type STOP to the bot, and blocked contacts, are left out.
- There is no 24-hour window and no template — write any message and send it whenever you like. Telegram doesn't charge for it.
- Choose what to send: a message (with a picture, video, GIF, file, music, voice note or sticker), an album of 2–10 pictures and videos, a poll or quiz, a location pin, a named place, a contact card, or a dice / game.
- Personalise it with {{contact.name}} and the other contact details.
- Add up to 10 buttons, one to three per row. A link button opens a web page; a reply button sends its label back as the person's answer, which shows in Live Chat and counts as a click.
- Poll votes show in Live Chat and count as replies — unless you turn on anonymous voting, which Telegram never reports to your bot.
- Choose all your Telegram contacts, a tag, or a saved segment. On Telegram a segment's rules are checked against each Telegram contact.
- Google Sheets, Google Contacts and Zoho lists can't be used: they are phone numbers, and a bot can only message people who have written to it first.
- The report shows sent, delivered, failed, replied and clicked. Telegram doesn't tell bots when a message is read, so the read figure is left blank and there is no A/B test.
- If someone has blocked your bot, their message fails straight away with that reason — it isn't retried.
Real-Time Broadcast Tracker
The broadcast detail page auto-refreshes without any manual page reload:- Running broadcasts refresh every 4 seconds.
- Scheduled broadcasts refresh every 10 seconds (so you see the moment they launch).
- Paused broadcasts refresh every 30 seconds.
- The Message Log tab shows per-contact status (Queued, Sent, Delivered, Read, Failed) and any error detail.
- Filter the log by status to quickly find failed messages.
Broadcast Statuses
| Status | Meaning |
|---|---|
| Draft | Saved but not yet launched — no messages have been queued. |
| Scheduled | Will launch automatically at the specified date/time. No manual action needed. |
| Running | Messages are actively being sent through the queue. |
| Paused | Manually paused mid-send. Unsent messages remain queued and resume on un-pause. |
| Completed | All messages have been processed (sent or failed). |
| Failed | Broadcast encountered a fatal error before sending. Check the error detail. |
Pausing and Resuming
You can pause a running broadcast at any time — queued messages are held, in-flight messages finish. Click Resume to re-queue unsent messages and continue sending. The remaining contacts pick up where the broadcast left off.Retrying Failed Messages
After a broadcast completes, if some messages failed you'll see a Retry Queued button on the tracker page. Clicking it re-queues only the failed and stuck messages — already-sent messages are not re-sent. This is useful for transient errors (rate limits, network timeouts) without re-running the entire broadcast.URL Button Variables
If your template has a URL button with a dynamic suffix (e.g.https://yoursite.com/{{1}}):- Map the variable to a contact field or static value just like body variables.
- If the resolved value is empty for a contact, the button component is omitted for that recipient rather than sending an invalid URL.
- Values are URL-encoded automatically — spaces and special characters are handled.
Tip
For per-recipient tracking links, use a custom field (e.g. cf2 = "Tracking Token") and map the button variable to that field.
Analytics
The broadcast tracker shows live stats:- Total — audience size at the time the broadcast was launched.
- Queued — messages waiting to be sent (decreases as broadcast progresses).
- Sent — dispatched to WhatsApp's API successfully.
- Delivered — reached the recipient's device (double grey tick).
- Read — opened by the recipient (double blue tick).
- Failed — permanently failed after all retry attempts.
Sending via API
UsePOST /api/v1/broadcasts/send to launch a broadcast programmatically — from your backend, a webhook handler, or a cron job — without using the dashboard. Recipients are provided inline in the request body and do not need to be pre-registered as contacts.Tip
commonVariables saves you from repeating shared values (brand name, event date, promo code) on every recipient object. Only list per-recipient overrides in
recipients[].variables. The final value for each placeholder is { ...commonVariables, ...recipient.variables }.POST /api/v1/broadcasts/send
Content-Type: application/json
Authorization: Bearer motherbot_xxx
{
"name": "Order Dispatch — June batch",
"templateName": "order_confirmation",
"languageCode": "en_US",
// These values apply to every recipient. No need to repeat them.
"commonVariables": {
"1": "MotherBot Store",
"3": "support@mystore.com"
},
"headerMediaUrl": "https://cdn.mystore.com/banner.jpg",
"rateLimitPerSecond": 10,
"recipients": [
// {{2}} (order ID) is different per recipient — only that key is provided
{ "to": "919876543210", "name": "John Smith", "variables": { "2": "ORDER-9912" } },
{ "to": "918765432109", "name": "Priya Sharma", "variables": { "2": "ORDER-9913" } },
// No variables at all — all three placeholders come from commonVariables
{ "to": "917654321098", "name": "Ravi Kumar" }
]
}
# Response 201
{
"success": true,
"data": {
"campaignId": "665d4c...",
"status": "running",
"total": 3,
"rateLimitPerSecond": 10,
"etaSeconds": 1,
"etaText": "~1 second"
}
}Once the broadcast is running, poll its progress with GET /api/v1/broadcasts/:campaignId/stats. The broadcast also appears in the dashboard under Broadcasts with a Source badge of API so you can distinguish API-launched broadcasts from platform-launched ones.- Up to 100,000 recipients per request. Duplicate phone numbers are automatically deduplicated.
- templateId (MongoDB ID) or templateName + languageCode — both are accepted.
- Templates must be APPROVED. Pending or rejected templates return HTTP 400.
- rateLimitPerSecond defaults to 3 and is capped at 80 (Meta limit).
- Large lists are chunked and enqueued in the background — the API returns immediately with a campaignId.
Budget and approvals
Two controls sit in front of every broadcast. Both are off until you switch them on, and both live under Settings.A monthly spend budget
Set what you are willing to spend in a calendar month with your third-party providers — Meta’s per-message WhatsApp pricing, WhatsApp calls (charged per 6-second pulse), and your SMS, RCS and email gateways. This is not your MotherBot subscription, which lives under Billing.- Alerts at thresholds you choose, to recipients you choose. An ACTUAL alert fires when you have spent that much; a FORECAST alert fires when your current daily rate is heading there by month end.
- Each threshold can add its own recipients on top of a list that receives everything — so finance can be told at 100% and you at 50%.
- Raising the budget mid-month re-arms every alert at the new figure, rather than silencing the ones that already fired.
- Enter your own per-message rates so estimates match what you are really billed. What Meta charges depends on your country; what your gateway charges depends on your contract.
- Optionally stop sending at a line you set — 100% of the budget, or higher if you want a buffer.
Note
A hard budget stop halts broadcasts, drips, bulk sends (from the API, extensions and plugins), store and integration messages, templates sent by workflows, and SMS, RCS and email. It does not stop replies to customers — Live Chat, chatbots, the AI agent and workflow chat messages keep sending — and incoming messages are never affected. Cutting off a conversation a customer is already having costs far more than the message. Meta still charges for replies after the first 1,000 each month on each WhatsApp number.
Approval before a bulk send
Hold a broadcast until somebody signs it off. Nothing is sent while it waits, and the request expires if nobody answers — a Diwali promotion approved in November is worse than one never sent.- Hold on recipient count, on estimated cost, or once the monthly budget is spent — any combination.
- It covers every way a send can start: the dashboard, the mobile app, the API, the Chrome extension, the Google Sheets and Excel add-ins, the Zoho CRM widget and the WordPress plugin.
- The Approvals screen shows who asked, how many people it reaches, what it will cost, the template, a few recipients and why it was held. Approvers are emailed and pushed; the requester is emailed the answer.
- Grant a staff member the Approve Broadcasts & Bulk Sends permission to let them decide. It is deliberately separate from managing broadcasts — the person who starts a send is who the queue exists to review.
- A staff member cannot approve their own request.
Warning
Scheduling a broadcast for 3am is not a way around approval: a scheduled broadcast launches as the person who created it and faces the same rules the Launch button does. Recurring broadcasts are the one exception and are reviewed only if you tick Recurring broadcasts in the settings. API keys, plugin tokens and shared extension tokens are never exempt, even though they act with owner rights.
What an approved send does
Pressing Approve records the decision and returns immediately — it never waits for the send, however large. The release then runs in the background in bounded batches, so approving a hundred thousand recipients feels the same as approving five hundred. Watch it in Broadcasts, where it appears like any other and can be paused and reported on.- An approved bulk send always resumes through the queue and comes back with a batch id, even when the original request was small enough to have been sent inline — by the time somebody says yes, there is no open request left to answer.
- A release that is interrupted resumes from where it stopped, not from the beginning, and nobody is messaged twice.
- If the queue is briefly unavailable when you approve, your decision still stands — the send starts on its own as soon as it recovers, and the screen says so rather than pretending it went out.
Best Practices
- Always personalize with contact name or a custom field — broadcasts with personalization see 30–40% higher read rates.
- Send during business hours in your audience's timezone.
- Keep your opt-out rate below 2% to protect your Meta quality rating.
- Test with a small tag group (10–20 contacts) before launching to your full list.
- Use custom fields (cf1–cf10) to store per-contact values like order IDs, invoice numbers, or plan names for truly personalized sends.