draft. Review it on the batch page — edit any row’s
cells, its phone included (PATCH …/recipients/{recipient_id} with
overrides), or delete rows — then send it with
POST /v1/whatsapp/batches/{batch_id}/send.
Send
Start sending on the batch page asks when (now or at a time) and shows the batch’s timezone, window, pace and daily cap; change any of them there. The send body takesstart_at plus the same pacing fields as create (timezone,
window, send_gap_seconds, send_daily_cap, delivery_attempts,
delivery_retry_after_hours); an omitted field keeps the batch’s value.
Changing a running batch
Adding and deleting rows
POST /v1/whatsapp/batches/{batch_id}/recipients appends up to 10,000 rows to
any batch that is not canceled or failed.
added, total_recipients and skipped. A number already in
the batch, or earlier in the request, is skipped with recipient_id: null. A
row with a bad phone or blank mapped cell is stored as skipped and returned
with its recipient_id so you can fix the cell. row_number is the row’s
1-based position in your request.
POST …/recipients/delete with recipient_ids removes ready or skipped
rows for good; a row that was sent or is sending comes back in rejected. If the
deleted row held a number another row repeats, that row takes the number and
becomes ready.
Row statuses
Replied rows are found with the
replied filter on
GET …/recipients?status=replied; replied_at is set on the row. Receipts
arrive out of order, and a row only moves forward.
Held-back rows are resent
A marketing template Meta held back under the person’s marketing limit (63049, 131049) stays undelivered with a next_attempt_at
delivery_retry_after_hours later (default 48), and is sent again until
delivery_attempts (default 3, the first send included) is spent. US numbers
are never resent. Set delivery_attempts: 1 to never resend.
Common failures
To try failed rows again, choose New batch from failed rows in the batch
page’s menu: it opens the create form with the same sender, template, mapping
and pace, and those rows as the list.
When the batch stops itself
The batch goes topaused with failure_reason set; fix the cause and resume.
It goes to
failed, for good, only when no resume could work: the sender was
disconnected, or the person who created the batch left the workspace or can no
longer send.
After a crash, a Twilio row whose outcome is unknown is looked up and adopted
rather than sent twice. Gupshup has no lookup, so such a row is marked failed
with a note to check the recipient’s WhatsApp before resending.
Webhooks and export
whatsapp_batch.started, .completed, .paused and .failed carry the same
body as GET /v1/whatsapp/batches/{batch_id}. .completed fires again each time
rows added later have all been sent. See
webhook events.
Each sent template is also an item in the recipient’s thread, and its receipts
fire conversation.item.status like any other
outbound message. To message one person rather than a list, post the template
with POST /v1/conversations/items.
Each row links to its conversation, where the batch’s agent, or the one on the
sender’s number, answers replies. The row’s cells are {{userdata.<column>}} to the agent that
answers the reply, whatever its conversation.context. Export CSV on the batch page downloads every row with its
status, error and timestamps.
Next
Creating a batch
Prerequisites, Meta’s rules, and every create field.
The text agent that answers replies.