Skip to main content
This walks through the whole path: find a channel, pick a template, send it, confirm it arrived. Every call uses the two headers from Authentication.
1

Find the channel to send from

channelId identifies which connected account the message goes out through. Get it once and store it — it doesn’t change.
Use a channel whose connection_status is connected. Anything else cannot send.
2

Pick an approved template

Two things to read off this:
  • status must be APPROVED. A PENDING template is rejected at send time.
  • Count the placeholders in the BODY text. {{1}} and {{2}} means you must supply exactly two templateParams, in that order. A mismatch fails the send.
3

Send it

You get 202 Accepted and the created message:
to must be E.164 without a +201001234567. A local-format number like 01001234567 is not rejected; it is simply undelivered. Normalize before you send.
You didn’t need a conversation to exist first: channelId + to finds the thread or starts one. If you already have a conversationId, send that instead and omit both.
4

Confirm it arrived

202 means queued, not delivered. Read the message back to see where it got to:
Poll for a short window, or treat sent as success and reconcile failed separately. Don’t wait on read — plenty of customers have receipts disabled and it will never arrive.

Sending plain text

Inside the 24-hour window — the customer messaged you recently — you can reply in free text:
Outside that window this is rejected by WhatsApp. If your integration initiates contact, send a template.

Next

Zoho Desk: message customers when a ticket closes

A complete worked integration, including the flat payload form for callers that can’t send nested JSON.