> For the complete documentation index, see [llms.txt](https://help.zaapi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.zaapi.com/integrations/whatsapp-business/broadcasts/how-to-send-a-whatsapp-broadcast.md).

# 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:

| Filter           | Conditions                                                                            | Use it for                                                                |
| ---------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| **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.

1. Click **Download WhatsApp CSV template** to get the correct format.
2. The **first column header must be exactly `Phone Number`** — including capitalisation.
3. Include the country code on every number, e.g. `+66812345678`.
4. Any additional columns become available as personalisation variables. Name them clearly (`First Name`, `Order ID`) — you'll pick them by header name later.
5. 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:

| Variable type            | 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:

| Metric              | What it means                                      |
| ------------------- | -------------------------------------------------- |
| **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.
