Unsupported WhatsApp message types
WhatsApp carries content Bird's API does not model, from emoji reactions to catalog orders. Rather than dropping such a message or delivering it empty, Bird records it with an unsupported arm that names the WhatsApp content type. The message is visible in the WhatsApp log and reaches your webhook like any other.
What an unsupported message carries
unsupported.type carries WhatsApp's own type string for what arrived, and it is the only content on the message. The envelope around it is unchanged:
कोड उदाहरण
{
"id": "wam_01kyh0w4ujnz2x8p1s5dci0vlg",
"direction": "inbound",
"from": { "phone_number": "+14155550100" },
"to": { "phone_number": "+13124495569" },
"status": "received",
"unsupported": { "type": "reaction" },
"created_at": "2026-08-25T09:31:20Z"
}| type | What the contact sent |
|---|---|
| reaction | An emoji reaction on one of your messages |
| interactive | Interactive content whose reply shape the API could not read as a tap |
| button | A button tap the API could not read as a reply |
| order | A cart or order placed from a product catalog |
| system | A system notice about the conversation, such as a contact changing their phone number |
| unsupported | WhatsApp's own unsupported type, for a message its own clients cannot render |
unsupported is not a placeholder in that table. WhatsApp reports a content type of its own by that name when one of its clients sends something the others cannot display, and that arrives as this value.
The list is open. WhatsApp adds content types over time, so treat a type you do not recognize as a future type rather than an error: log it and move on rather than failing the read.
The webhook payload
whatsapp.received fires for an unsupported message too, carrying the same arm:
कोड उदाहरण
{
"type": "whatsapp.received",
"timestamp": "2026-08-25T09:31:20.774Z",
"data": {
"whatsapp_id": "wam_01kyh0w4ujnz2x8p1s5dci0vlg",
"workspace_id": "ws_01ky7m235keycbnwyajabe1a6b",
"direction": "inbound",
"from": { "phone_number": "+14155550100" },
"to": { "phone_number": "+13124495569" },
"unsupported": { "type": "reaction" },
"tags": null,
"metadata": null
}
}An endpoint that switches on the content field it finds should have a default branch, and this arm is what lands in it. Acknowledge the webhook with a 2xx either way: retrying it changes nothing, since the content will not become modelled between attempts.
What an unsupported message still does
The message counts as an inbound message in every way that does not depend on its content:
- It resets the customer service window to a fresh 24 hours, so a reaction to one of your messages reopens free-form replies.
- It appears in the message list and the WhatsApp log, with its type shown rather than a blank row.
- It is never charged. No inbound message is priced.
What you cannot do is read the content. A reaction does not tell you which emoji or which message it was placed on, and an order does not carry the cart. Where that detail matters, ask the contact in words, or use a reply button or list menu so the answer arrives on a modelled arm you can act on.
Things to watch
- Do not treat the arm as an error. The message was received successfully; only its content is unmodelled. Alerting on it means alerting every time a contact reacts with a thumbs up.
- A system type can mean the contact changed number. Meta documents a phone-number change as one of the events that raises a system message, and it regenerates the contact's business-scoped user ID at the same time. The arm names the type and nothing else, so treat it as a prompt to re-establish who you are talking to.
- Store the type verbatim. A future type resolves to a name you have no code for yet, and keeping the raw value is what lets you find those messages once you do.
Next steps
- How receiving works: the inbound envelope, media fetching, and the whatsapp.received webhook
- Receiving interactive replies: the taps that do arrive as modelled content
- WhatsApp log: browsing the conversation in the dashboard
- WhatsApp events: the full event list, over the API or webhooks