Delivery receipts for Outbound Messaging Apps
Delivery Report (DR) are webhooks for Messaging Apps delivery statuses: POST requests sent by the 8x8 platform in JSON format to the callback URL configured for your account.
Requirementsโ
To use 8x8 Outbound Messaging Apps capabilities, you need:
- An account configured to use Messaging Apps product.
- A webhook to indicate to us which URL 8x8 platform should send delivery reports to.
๐
You can configure your callback using Webhooks Configuration API
Retry logicโ
In case of connection error/timeout or HTTP response code 4XX or 5XX, there will be multiple retry attempts with progressive intervals: 1, 10, 30, 90 sec.
Read Receipt - Validity Periodโ
If the chat app doesn't provide a read receipt promptly, either because the user hasn't read the message or due to a chat app service issue, we'll continue checking for up to 10 days. If the user reads the message after this period, the read receipt won't be updated.
Webhook formatโ
๐
If you are still receiving webhooks in an older format, see the Webhook migration guide for help migrating your configuration.
- v9 (latest)
- v8
Request body description
| Parameter name | Parameter type | Description |
|---|---|---|
| version | integer | New in v9. Version of the webhook payload format. Equals to 9 for this format. |
| namespace | string | A generic namespace for incoming webhook. Equal to ChatApps for delivery receipts. |
| eventType | string | Webhook type. - outbound_message_status_changed for delivery receipts- external_app_message for WhatsApp Business App messages |
| description | string | Human-readable description of the incoming event |
| payload | object | Delivery receipt information, see below |
Payload object description
| Parameter name | Parameter type | Description |
|---|---|---|
| umid | uuid | A unique identifier generated by 8x8 for the message |
| batchId | uuid | A unique identifier generated by 8x8 for the message if sent using Batch API |
| clientMessageId | string | Custom identifier you provided for this message |
| clientBatchId | string | Custom identifier you provided for this batch of messages |
| subAccountId | string | The sub-account id used to deliver the message |
| timestamp | string | UTC date and time when the message was sent expressed in ISO 8601 format. Only present when eventType=external_app_message |
| channel | string | Name of the channel used to send the message, please see List of supported Messaging Apps channels for details |
| user | object | Information about the user the message is associated with |
| type | string | Message type. See Inbound Messaging Apps message type field for possible values. Only present when eventType=external_app_message |
| content | object | Message content. Structure varies based on the type field.Only present when eventType=external_app_message |
| status | object | Current status of the message, please see Message status reference for details. Only present when eventType=outbound_message_status_changed |
| object | WhatsApp-specific information. Only present when channel is whatsapp. See below for details | |
| outboundContent | object | New in v9. A structured copy of the original outbound message this receipt refers to. WhatsApp only, and only present on the receipt that carries the delivered content (the delivered_to_recipient status). See outboundContent object below. |
User information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| msisdn | string | Changed in v9. The recipient phone number expressed in E.164 international format. Left out for channels where users have no phone number (e.g. LINE). |
| channelUserId | string | Changed in v9. The user's id on the channel: the BSUID (business-scoped user id) for WhatsApp, or the Line user id for Line. Only included when the channel provides a real user id. |
When a user field has no value, it is simply left out of the JSON.
โ ๏ธ When
channelUserIdis missing (WhatsApp only)
channelUserIdis only present in the receipts reported by WhatsApp itself. When the message is sent with a phone number as the destination, thequeuedanddelivered_to_operatorreceipts โ generated before the message reaches WhatsApp โ will not containchannelUserId, while thedelivered_to_recipientandreadreceipts will include it.
WhatsApp object description
| Parameter name | Parameter type | Description |
|---|---|---|
| providerErrorCode | string | WhatsApp's own error code. Only present if there was an error |
| pricingCategory | string | WhatsApp's pricing category as defined by Meta. Only included with sent status, and one of either delivered or read status |
๐ง
Please note that unlike Delivery Receipts for the SMS API, the Price object is not sent for Messaging Apps Webhooks.
โ๏ธ
If the request you receive has a different structure from described in this document, please contact our support to activate the latest format for your account.
outboundContent objectโ
outboundContent is a structured, channel-normalized copy of the message you originally sent. It lets you reconcile a delivery receipt with the exact content that was delivered without keeping your own copy of the outbound payload.
๐
outboundContentis WhatsApp only. It is attached to the receipt that confirms delivery to the recipient (delivered_to_recipient) and is omitted from earlier receipts such asqueuedanddelivered_to_operator. When the content cannot be reconstructed it is left out entirely.
| Parameter name | Parameter type | Description |
|---|---|---|
| channel | string | Channel the content was sent on. Always whatsapp. |
| contentType | string | Kind of content. See contentType values below. |
| template | object | Template metadata. Only present when contentType is template, template_auth, or carousel. |
| header | object | Message header (text, media, or location). Omitted when the message has no header, and for carousel (per-card headers are used instead). |
| body | object | Message body text. |
| footer | object | Message footer text. |
| actions | object | Interactive elements (buttons, call-to-action, list, or flow). Omitted for carousel (per-card actions are used instead). |
| cards | array | Carousel cards, in order. Only present when contentType is carousel. |
| meta | object | Extra flags such as redaction status and interactive sub-type. |
contentType valuesโ
| Value | Description |
|---|---|
text | Freeform text message. |
media | Freeform image, video, audio, or document. The media type is carried in header.type. |
location | Freeform location message. |
template | Standard (non-authentication) template message. |
template_auth | Authentication template. Its one-time code is redacted โ see Redaction below. |
carousel | Carousel template. Content is carried per card in the cards array. |
interactive | Interactive message (quick-reply buttons, list, call-to-action URL, or flow). The sub-type is in meta.interactiveType. |
header objectโ
| Parameter name | Parameter type | Description |
|---|---|---|
| type | string | One of text, image, video, audio, document, or location. |
| text | string | Header text. Only present when type is text. |
| media | object | Media descriptor. Only present for image, video, audio, and document headers. Contains url, and filename for documents. |
| location | object | Location descriptor (latitude, longitude, and optionally name and address). Only present when type is location. |
body / footer objectsโ
| Parameter name | Parameter type | Description |
|---|---|---|
| text | string | The body or footer text. |
actions objectโ
| Parameter name | Parameter type | Description |
|---|---|---|
| buttons | array | Buttons, in order. Each has type (url, quick_reply, copy_code, phone, or flow), label, and value (null for buttons that carry no value, such as quick_reply). |
| cta | object | Call-to-action URL button (displayText, url). |
| list | object | List picker: buttonLabel plus sections, each with an optional title and a rows array (id, title, optional description). |
| flow | object | WhatsApp Flow details (flowId, cta, action, screen). |
cards array (carousel)โ
Each entry has an index (zero-based position) and its own header, body, and actions, structured exactly as above.
meta objectโ
| Parameter name | Parameter type | Description |
|---|---|---|
| redacted | boolean | true when part of the content was masked. |
| redactionReason | string | Why the content was masked. |
| interactiveType | string | Sub-type of an interactive message: button, list, cta_url, or flow. |
Redactionโ
Some content is masked before it reaches your webhook, in which case meta.redacted is true:
- Authentication templates (
contentTypeistemplate_auth): the one-time code is replaced with******in the body and in any copy-code button.meta.redactionReasonisOTP codes are masked in agent-facing contexts. - PII masking (when enabled on your sub-account): the content is withheld, leaving only
channel,contentType, andmeta.meta.redactionReasonisContent masked for PII compliance.
Sample payloadsโ
WhatsApp โ queuedโ
Sent when the message is accepted by the 8x8 platform. In this example the message was sent using the phone number (msisdn); since this status does not come back from WhatsApp, channelUserId is not included.
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>
},
"status": {
"state": "queued",
"timestamp": "2026-07-03T03:23:21.90Z"
}
}
}
WhatsApp โ delivered to recipientโ
This receipt comes back from WhatsApp, so the user object includes the new channelUserId (BSUID). The delivered_to_recipient receipt also carries the outboundContent object โ a structured copy of the message that was delivered. The examples below show the receipt for different content types; only the outboundContent object varies, the surrounding webhook body is the same in each case.
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"status": {
"state": "delivered",
"detail": "delivered_to_recipient",
"timestamp": "2026-07-03T03:40:54.16Z"
},
"whatsapp": {
"pricingCategory": "marketing"
},
"outboundContent": {
"channel": "whatsapp",
"contentType": "text",
"body": {
"text": "Welcome to 8x8 Inc.! We are the leading global provider of unified cloud communications, video collaboration, and contact center solutions."
}
}
}
}
Template with an image header, a URL button, and a quick-reply button:
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"status": {
"state": "delivered",
"detail": "delivered_to_recipient",
"timestamp": "2026-07-03T03:40:54.16Z"
},
"whatsapp": {
"pricingCategory": "marketing"
},
"outboundContent": {
"channel": "whatsapp",
"contentType": "template",
"template": {
"name": "marketing_welcome_template",
"language": "en_US",
"category": "MARKETING"
},
"header": {
"type": "image",
"media": {
"url": "<HEADER_IMAGE_URL>"
}
},
"body": {
"text": "Hi Jason, ready to elevate your customer communications? Discover the power of 8x8 CPaaS."
},
"footer": {
"text": "Powered by 8x8"
},
"actions": {
"buttons": [
{
"type": "url",
"label": "Discover all channels",
"value": "https://cpaas.8x8.com/en/products/omnichannel-messaging"
},
{
"type": "quick_reply",
"label": "Talk to Sales",
"value": null
}
]
}
}
}
}
Interactive list message (note meta.interactiveType):
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"status": {
"state": "delivered",
"detail": "delivered_to_recipient",
"timestamp": "2026-07-03T03:40:54.16Z"
},
"whatsapp": {
"pricingCategory": "marketing"
},
"outboundContent": {
"channel": "whatsapp",
"contentType": "interactive",
"header": {
"type": "text",
"text": "8x8 Customer Success personalized sessions"
},
"body": {
"text": "Looking for personalized assistance? Our Customer Success team has the following slots available. Tap to select a time."
},
"footer": {
"text": "For urgent inquiries, email cpaas-sales@8x8.com"
},
"actions": {
"list": {
"buttonLabel": "Book Slot",
"sections": [
{
"title": "Oct 9, 2024",
"rows": [
{ "id": "slot-1", "title": "Monday, Oct 9", "description": "9:00 AM - 10:00 AM" },
{ "id": "slot-2", "title": "Monday, Oct 9", "description": "2:00 PM - 3:00 PM" }
]
}
]
}
},
"meta": {
"interactiveType": "list"
}
}
}
}
WhatsApp โ read recipientโ
This receipt also comes back from WhatsApp, so the user object includes channelUserId.
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"status": {
"state": "read",
"timestamp": "2026-07-03T05:12:41.30Z"
},
"whatsapp": {
"pricingCategory": "marketing"
}
}
}
Viber โ delivered to recipientโ
For Viber and RCS there is no channelUserId: these channels identify the recipient purely by phone number, so only user.msisdn is sent.
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "viber",
"user": {
"msisdn": <USER_PHONE_NUMBER>
},
"status": {
"state": "delivered",
"detail": "delivered_to_operator",
"timestamp": "2026-07-03T03:21:26.06Z"
}
}
}
RCS โ read receiptโ
{
"version": 9,
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "rcs",
"user": {
"msisdn": <USER_PHONE_NUMBER>
},
"status": {
"state": "read",
"timestamp": "2026-07-03T03:41:51.85Z"
}
}
}
WhatsApp Business App Messagesโ
When using WhatsApp with Embedded Signup, messages sent by your business through the WhatsApp Business App are forwarded to your configured webhook as external_app_message events. This allows you to track all outbound messages sent on behalf of your business through the WhatsApp Business App.
๐
For more information, see WhatsApp's Embedded Signup documentation.
Key differences from delivery receipts:
eventTypeisexternal_app_messageinstead ofoutbound_message_status_changed- Includes
timestamp,type, andcontentfields in the payload (see webhook format above) - Does not include
status,batchId,clientMessageId, orclientBatchIdfields
Sample WhatsApp Business App message webhookโ
{
"version": 9,
"namespace": "ChatApps",
"eventType": "external_app_message",
"description": "External App Message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-01-28T09:16:53.00Z",
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"type": "Text",
"content": {
"text": "Here's the info you requested! https://www.meta.com/quest/quest-3/"
}
}
}
Request body description
| Parameter name | Parameter type | Description |
|---|---|---|
| namespace | string | A generic namespace for incoming webhook. Equal to ChatApps for delivery receipts. |
| eventType | string | Webhook type. - outbound_message_status_changed for delivery receipts- external_app_message for WhatsApp Business App messages |
| description | string | Human-readable description of the incoming event |
| payload | object | Delivery receipt information, see below |
Payload object description
| Parameter name | Parameter type | Description |
|---|---|---|
| umid | uuid | A unique identifier generated by 8x8 for the message |
| batchId | uuid | A unique identifier generated by 8x8 for the message if sent using Batch API |
| clientMessageId | string | Custom identifier you provided for this message |
| clientBatchId | string | Custom identifier you provided for this batch of messages |
| subAccountId | string | The sub-account id used to deliver the message |
| timestamp | string | UTC date and time when the message was sent expressed in ISO 8601 format. Only present when eventType=external_app_message |
| channel | string | Name of the channel used to send the message, please see List of supported Messaging Apps channels for details |
| user | object | Information about the user the message is associated with |
| type | string | Message type. See Inbound Messaging Apps message type field for possible values. Only present when eventType=external_app_message |
| content | object | Message content. Structure varies based on the type field.Only present when eventType=external_app_message |
| status | object | Current status of the message, please see Message status reference for details. Only present when eventType=outbound_message_status_changed |
| object | WhatsApp-specific information. Only present when channel is whatsapp. See below for details |
User information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| msisdn | string | Phone number expressed in E.164 international format |
| channelUserId | string | Id of the user in the channel. Always the phone number digits (same value as msisdn). |
WhatsApp object description
| Parameter name | Parameter type | Description |
|---|---|---|
| providerErrorCode | string | WhatsApp's own error code. Only present if there was an error |
| pricingCategory | string | WhatsApp's pricing category as defined by Meta. Only included with sent status, and one of either delivered or read status |
๐ง
Please note that unlike Delivery Receipts for the SMS API, the Price object is not sent for Messaging Apps Webhooks.
โ๏ธ
If the request you receive has a different structure from described in this document, please contact our support to activate the latest format for your account.
Sample payloadsโ
WhatsApp โ delivered to recipientโ
{
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"status": {
"state": "delivered",
"detail": "delivered_to_recipient",
"timestamp": "2025-05-05T09:15:57.00Z"
},
"whatsapp": {
"pricingCategory": "marketing"
}
}
}
WhatsApp โ readโ
{
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"status": {
"state": "read",
"timestamp": "2025-05-17T06:27:52.45Z"
},
"whatsapp": {
"pricingCategory": "marketing"
}
}
}
WhatsApp โ undeliveredโ
{
"namespace": "ChatApps",
"eventType": "outbound_message_status_changed",
"description": "ChatApps outbound message delivery receipt",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"batchId": <BATCH_ID>,
"clientMessageId": <YOUR_MESSAGE_ID>,
"clientBatchId": <YOUR_BATCH_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"status": {
"state": "undelivered",
"detail": "rejected_by_operator",
"timestamp": "2026-01-01T00:00:00Z",
"errorCode": 15,
"errorMessage": "Invalid destination"
},
"whatsapp": {
"providerErrorCode": "131009"
}
}
}
WhatsApp Business App Messagesโ
When using WhatsApp with Embedded Signup, messages sent by your business through the WhatsApp Business App are forwarded to your configured webhook as external_app_message events. This allows you to track all outbound messages sent on behalf of your business through the WhatsApp Business App.
๐
For more information, see WhatsApp's Embedded Signup documentation.
Key differences from delivery receipts:
eventTypeisexternal_app_messageinstead ofoutbound_message_status_changed- Includes
timestamp,type, andcontentfields in the payload (see webhook format above) - Does not include
status,batchId,clientMessageId, orclientBatchIdfields
Sample WhatsApp Business App message webhookโ
{
"namespace": "ChatApps",
"eventType": "external_app_message",
"description": "External App Message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-01-28T09:16:53.00Z",
"channel": "whatsapp",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"type": "Text",
"content": {
"text": "Here's the info you requested! https://www.meta.com/quest/quest-3/"
}
}
}