POST /v1/whatsapp/batches) sends nothing: it lands as a draft you
review and then send.
Before your first batch
- A connected number — Twilio or Gupshup, set up in WhatsApp. Put a published text agent on its Messages cell if you want replies answered; without one, replies are stored and counted but nobody answers.
- An approved template — write one under WhatsApp → Templates and submit it to WhatsApp (Twilio), or create it in your Gupshup app. Only approved templates can be picked for a batch.
- Opted-in recipients — you may only message people who gave you their number and agreed to hear from you on WhatsApp (WhatsApp Business Messaging Policy). Messaging anyone else puts your number at risk.
Rules Meta enforces
Which templates can be sent
Carousel, catalog, flows and authentication templates are listed but refused.
GET /v1/whatsapp/templates?integration_id=… returns each template’s header,
body, footer, buttons and variables; one with unsupported_reason set
cannot be sent from a batch.
Create the batch
In the dashboard: WhatsApp → Outbound → New batch. Pick the sender and template, type rows or upload a CSV (Download a sample file gives exactly the columns the template needs), map the phone column and each template variable — including one in a header or button URL — and set the pace. The preview shows row 1 as it will arrive.1, 2… on Gupshup and named or numbered on Twilio;
variable_map maps each one to a column.
Fields
send_daily_cap is {"kind": "fixed", "limit": 250} or a ramp,
{"kind": "ramp", "start": 50, "end": 250, "step": 25, "interval_days": 1},
which warms up a new sender. A ramp rises by step every interval_days
sending days — a weekend or a pause earns nothing — and belongs to the
batch: two batches on one sender ramp independently.
What is refused at create
The whole batch is refused, every problem listed in one400, when:
- a template variable is unmapped, mapped to a column that does not exist, or
variable_mapnames a variable the template does not have; to_columnis not in the list, or no row holds a valid number in it;- the template is no longer approved or cannot be sent from a batch, the
integration is not
active, or a Twilio sender is notONLINE.
skipped
with the reason, and becomes ready once its cell is fixed:
A number without a country code is read in the sender’s country. The
earliest row with a number keeps it, even after it is sent; delete that row and
the next row with the number takes it.
Which agent answers
Leave the agent out and replies go to the agent on the number’s Messages trigger, whichever it is when they reply. Or name one: the batch takesagent_id, agent_version, agent, agent_override, agent_team and vars
as an outbound call does (no secrets: one bag for
a whole list is the wrong shape). Each send saves that agent for the person’s
reply, as a posted template does. The
number still needs its Messages trigger on, or replies never reach Talqing
(422 messages_off).
What the replying agent knows
Every non-blank cell of a row becomes{{userdata.<column>}} for the agent
that answers a reply — the same rule as a call batch.
The template sits in the conversation as the agent’s own first message, header,
footer and buttons included as text ([Button: Book a demo → https://…]).
Next
Sending and monitoring
Send the draft, pace it, and follow rows to delivered, read and replied.
Connect the number and put a text agent on its replies.