message.status_update event.
Status transition flow
Outbound messages navigate through the following statuses:queued: The message has been stored in Wazapin’s queue. (Returned immediately by thePOST /v1/messagesrequest).sent: Meta/WhatsApp accepted the message.delivered: The message was successfully delivered to the recipient’s phone (double checkmarks in WhatsApp).read: The user opened the message (blue double checkmarks in WhatsApp).failed: The message could not be sent or delivered.
Webhook payload structure
Unlike inbound message webhooks,message.status_update payloads contain the updated status directly in the webhook body. You do not need to call GET /v1/messages/{messageID} to extract the status.
Here is an example payload:
message.status_update webhook body
Code example
Here is how to catch the webhook and process the status transitions:Polling fallback
If your webhook receiver goes offline or you fail to receive a status update webhook, you can query the API directly as a fallback. Wazapin provides two endpoints for status checks:- GET /v1/messages/: Retrieves the full message record including its current
status. - GET /v1/messages//status: A lightweight endpoint returning only the status metadata.
Troubleshooting
Status updates arrive out of order
Due to network concurrency, aread status webhook can occasionally arrive before a delivered webhook.
- Always check the existing status in your database before writing an update.
- Do not overwrite a terminal status (like
readorfailed) with an earlier status (likesentordelivered).
Handling failures
When a message status updates tofailed, query the full message details using GET /v1/messages/{messageID}. The response will contain an error block (like error_code or failure_reason) explaining why the message could not be sent. Check the Error codes reference for details.