How to send a WhatsApp broadcast
Go to Broadcasts → WhatsApp Broadcasts → Create Broadcast. The builder walks top to bottom; a live preview of your message sits on the right.
Step 1 — Choose the account to send from
Pick the WhatsApp Business account the broadcast goes out from. Only accounts eligible for proactive messaging appear here. If you only have one connected account it's selected for you.
The rest of the form appears once an account is chosen, because templates, labels and contacts are all specific to that account.
Step 2 — Set the broadcast time
Send now — the broadcast is queued as soon as you confirm.
Set schedule — pick a date and a time. Only future times can be selected; if you choose today, past times are hidden.
Scheduling is worth doing even for "send now" campaigns. Landing in someone's chat at 9am beats 2am, and staggering large sends across days keeps you inside your daily messaging limit.
Two things are evaluated at the scheduled send time, not when you build the broadcast:
the 24-hour per-contact cooldown, so contacts who will be free to message by then are included
your phone number's quality rating and the template's quality score
Step 3 — Choose who receives it
Three options:
Send to everyone
Every contact on the selected WhatsApp account, most recent first, up to 10,000 recipients. Opted-out contacts and contacts still inside their 24-hour cooldown are excluded automatically.
Send to specific people
Add filters to build a targeted audience. Available filters:
Labels
Contains all of / Contains any of / Does not contain all of / Does not contain any of
Segments you maintain in the inbox — vip, abandoned-cart, wholesale
Country code
Equals a dialling code
Language- or region-specific campaigns
As you build, the donut chart shows "Send to approximately N recipients" against your total contacts. This is an estimate from current data and the real recipient count at send time may be slightly lower, because opt-outs and cooldowns are re-checked when the broadcast runs.
US numbers (+1) are excluded from all broadcasts due to Meta restrictions on marketing messages to US numbers.
Upload .csv
For lists that don't live in Zaapi yet — event sign-ups, offline collection, another platform.
Click Download WhatsApp CSV template to get the correct format.
The first column header must be exactly
Phone Number— including capitalisation.Include the country code on every number, e.g.
+66812345678.Any additional columns become available as personalisation variables. Name them clearly (
First Name,Order ID) — you'll pick them by header name later.Upload the file. Zaapi validates every row and reports invalid numbers by row number, e.g.
Row 14: 0812345 is not valid. Fix them and re-upload.
Numbers already in Zaapi are matched to the existing conversation, so the broadcast appears in that chat's history. Numbers not in Zaapi start a new conversation.
Step 4 — Choose your message template
Click Choose template and pick an approved template. Only approved templates can be used — this avoids failed deliveries to contacts outside the 24-hour messaging window.
Creating a template first: go to Settings → WhatsApp Templates → Create new template. Choose a category (Marketing or Utility), a language, then write the header, body, footer and buttons. Meta review usually takes minutes but can take up to 24 hours. Approved templates can be edited up to 10 times in 30 days, or once in any 24-hour window.
Two things to know when writing a template you plan to broadcast:
Marketing templates get a fixed opt-out footer that you cannot edit — see Page 3.
Templates carry their own quality score. Once a template has been sent enough times, Meta rates it. If it drops to medium or low quality, Zaapi blocks it from being sent — including in broadcasts. Write templates people want to receive.
Filling in personalisation variables
If your template body contains variables like {{1}}, you'll be asked what each one should be filled with:
Static text
The same value for everyone
Contact name
The contact's name in Zaapi
Contact phone number
The contact's phone number
Contact email
The contact's email
From CSV file
A column from your uploaded CSV — only shown when you've uploaded a file with extra columns
Every dynamic type takes a fallback value used when that contact's field is empty. Set a sensible one — "there" for a missing name, not a blank space.
Meta's guidance for variables: don't put a variable at the very start or end of the body, and keep more static text than variable text. Hi {{1}}, your order {{2}} has shipped! passes review; {{1}} {{2}} does not.
Step 5 — Name the broadcast
Give it an internal title, up to 100 characters. It's never sent to customers — it's how you'll find the broadcast in the list and in reports later. Include the date or campaign name, e.g. Songkran promo — VIP — 12 Apr.
Step 6 — Test, then send
Always send a test broadcast first. Click Test broadcast, search for your own number or a colleague's, and send. You'll receive the real message with real variable substitution, so you can check the copy, the image, the buttons and the links.
One caveat: a test is a real template send. It consumes the 24-hour cooldown for whoever receives it, and it's charged at normal rates. Test on your own number, not on a customer you intend to include in the campaign.
When you're happy, click Send Broadcast (or Schedule broadcast) and confirm. Recipients are then locked in, and the broadcast moves through: Scheduled → Sending → Sent. If something goes wrong it lands on Failed; broadcasts you delete before they run show as Cancelled.
To cancel a scheduled broadcast, open the ⋮ menu on its row in the broadcast list and choose Delete. It will no longer be sent. Only Admins and Owners can delete broadcasts.
Viewing broadcast analytics
The Broadcasts list shows every broadcast with Title, Account, Targeting, Status, Sent/Scheduled date, Sent, Read, Replied, Conversions, Conversion value and Created by. Sort by any performance column to see which campaigns worked. Search by title, or filter by account and sent date.
Click a broadcast to open it. Two tabs:
Details
The account, title, targeting type, send time, the exact template and variable values used, and the filters that built the audience.
Every broadcast also gets an automatic chat label — broadcast_id.<id> — applied to every recipient's conversation. That means you can go to Chats, filter by that label, and work through the people this campaign reached.
Broadcast to same audience reopens the builder pre-filled with this broadcast's targeting, so you can run a follow-up to the same segment without rebuilding the filters.
Analytics
Six performance cards:
Sent
Recipients the broadcast was sent to
Delivered
Messages that reached the device
Read
Recipients who opened it (% of delivered)
Replied
Recipients who replied (% of delivered)
Converted
Recipients who went on to convert (% of delivered)
Converted value
Total revenue attributed to the broadcast
Below the cards is the full recipient table: contact name, labels, phone number, and per-recipient Delivered / Read / Replied / Converted status plus conversion value. Filter by engagement status to isolate a group — everyone who read but didn't reply, everyone who replied but didn't buy — and Export recipients to download that filtered list as a CSV. View chat on any row jumps straight into that conversation.
Two notes on timing and attribution:
Stats take about a day to appear, then update daily for 30 days. An empty analytics tab minutes after sending is expected.
Conversions are attributed to the most recent broadcast a contact received in the previous 7 days. If you send two broadcasts to the same person in one week, the later one gets the credit.
Last updated