A batch is created as a 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.
Sending messages real people and cannot be recalled.

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 takes start_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.
On a sending or completed batch, added rows are messaged at the batch’s pace and hours with nobody pressing send; a completed batch goes back to sending. A draft holds them for review, and a paused batch until you resume.
The response has 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 to paused 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.

WhatsApp

The text agent that answers replies.