Send a template to a list

A WhatsApp campaign sends one approved template to everyone on a list, from one number. The seven sections of the composer, what each person's row ends up saying, and how it is paced.

Updated

A WhatsApp campaign is one approved template, sent from one WhatsApp number, to everyone on a list — with each person’s name, time slot or code filled in from their contact record. Tidewater Laundry Co. uses one to send tomorrow’s pickup confirmations to the forty customers on Tuesday’s route.

Before you start you need:

  • A WhatsApp number connected in /channels.
  • At least one template on that number that Meta has approved, synced in — see getting your templates in.
  • Contacts that have a WhatsApp number, not just a phone number.

Everything a campaign sends is a template. If you have not read when WhatsApp needs a template, read it first — especially the part about marketing templates.

Open the composer

Go to /campaigns, press New Campaign, and pick the WhatsApp card — “Send an approved template to your contact list”. The draft saves as you go.

A WhatsApp campaign has seven sections, in this order:

Name → Sender → Recipients → Template → Variables → Schedule → Advanced settings

There is no mission, no agent and no Dialog Insight section — those are for voice campaigns.

Sender

“Pick the WhatsApp channel that will send this campaign.” Only WhatsApp channels are listed. One that Meta has not finished approving is marked (not yet approved), and picking it shows ”… isn’t ready to send yet.”

Pick the sender first. The template list below is per number: it only shows templates synced to the number you pick here.

Once a number is chosen you may see a blue line starting “This number sends up to …” — that number’s sending limit, and how long your list will take at it. How fast one number can send explains the figures.

Recipients

The six sources are the same as for any campaign — Saved list, Segment, By tag, CSV upload, Quick rows, Magic input. What matters for WhatsApp is which number each person has.

A campaign sends to the contact’s WhatsApp number. When you import a CSV, map the column to WhatsApp, not SMS phone or Voice phone. A contact with only an SMS or voice number is left out.

Two things the list does quietly:

  • Anyone on the do-not-contact list is left out at launch, and checked again just before each send — someone who opts out mid-campaign is skipped.
  • One message per number. Two contacts sharing one WhatsApp number get one message, not two.

The number of people who can actually receive the message on WhatsApp is in the Variables preview, below.

A campaign resolves at most 10,000 recipients. A larger list is refused at launch — split it.

Template

“Only approved templates can be sent. The list is scoped to the WhatsApp channel you picked in Sender.”

Each row shows the template’s name, its language and its category, with the first line of the body. Pick one and a card below shows the whole template — header, body, footer, buttons — with the variables highlighted.

If the list is empty — “No approved templates for this channel.” — press Go to Templates, sync, and come back.

Watch the category. Some of a list will not receive a marketing template (why); those rows end up Failed.

Pick a template with a text header, or none. A campaign cannot supply the image, video or document a media header needs, and the composer says so: “Media headers (image) coming soon — this template’s media will need to be uploaded per-send. For now, use a text-header template to launch this campaign.”

Variables

“Bind each placeholder in the template body to a contact field or static value.” There is one row per variable, grouped under Header, Body and Buttons. Each row’s Choose source… menu offers:

SourceFills the variable with
Contact field: name (first word)The first word of the contact’s name
Contact field: name (last name)Everything after the first word
Contact field: emailThe contact’s email
Contact field: phoneTheir WhatsApp number
Custom attribute: …One of your custom contact fields, e.g. a pickup slot
Static value…The same text for everyone

Tidewater’s pickup_confirmation template, Hi {{1}}, your pickup is confirmed for {{2}}. Reply here to change it., maps {{1}} to name (first word) and {{2}} to a custom attribute holding each customer’s slot. Named variables like {{customer_name}} work the same way.

Buttons:

  • A link button whose URL ends in a variable gets one row — map it to, say, the order number.
  • A copy-code button gets one row for the code itself. The promotion maps it to Static value… FRESH20; a per-person code comes from a custom attribute.
  • Quick-reply buttons and fixed links need nothing.

A variable you leave unmapped is sent as an empty value, which Meta is likely to refuse — those rows end Failed. Nothing stops the launch; the preview is where you see the gap.

Read the preview

Under the variables, Preview — “Rendered body for the first contacts in your audience.” — shows the message for up to three real contacts, with their header, body, link and code filled in.

Above the samples is the line that matters: 4 eligible / 5 total · 1 skipped (no WhatsApp). The first number is who will actually get a message. The do-not-contact list is applied at launch, so the final count can be lower still.

The preview needs a saved list or a segment in Recipients; it reads the first one it finds.

Building the campaign with Octo instead? Octo runs the same preview — preview_whatsapp_campaign — before it creates anything: the eligible count, the skipped count and rendered samples. It will not create a campaign on a template that is not approved.

Schedule

The default is Send immediately — “Campaign dispatches as soon as you click Launch.”

Otherwise set a Start date, Allowed days, Time start / Time end and Timezone — type it the way the placeholder does, America/New_York, for where your customers are. Outside its window the campaign waits: it shows as running while sending nothing until the window opens.

Launch

Press Launch →. It stays greyed out until the campaign has a name, a sender, recipients and a template.

On the workspace’s first outbound campaign of any kind you are asked to confirm the Outbound Contact Compliance terms. The WhatsApp part asks you to collect opt-in WhatsApp recognises, use approved templates in the right category, and honour block and opt-out signals. Tick the box and press Accept and launch — it needs an owner or admin, and is asked once per workspace.

Then read the toast:

  • “Campaign launched.” — sending, or waiting for its window.
  • “Campaign had no eligible recipients — marked completed without dispatch.” — nobody on the list could be reached on WhatsApp.

What happens to each person

Open the campaign from /campaigns. The top shows Sent, Delivered, Read, Failed and Replied. Each row is one person, with a Delivery Status and a Replied column:

Row showsMeaning
PendingNot sent yet
SentMeta accepted it
Delivered / ReadMeta reported it reached the phone / was opened
FailedMeta refused it, or reported it undelivered — including a marketing template Meta chose not to deliver
SkippedOpted out, or no WhatsApp number, by the time it was their turn
Replied · …They wrote back within 7 days of the send

Every message also lands in /conversations, in that customer’s WhatsApp thread on the sending number. A reply opens the 24-hour window, and from there it is an ordinary conversation.

Pause and Resume are on the campaign page.

Pacing

A campaign is paced per sending number, and when it reaches that number’s limit it waits — nothing is marked failed for going too fast. Two campaigns on the same number share the one allowance, so the second makes the first slower. The figures, and how to see yours, are in how fast one number can send.

What a WhatsApp campaign will not do

  • Send free text. Templates only, approved ones only, on the one number.
  • Send a media header. Text headers or none, for now.

Where to go next