What Reaction Messages Do
Reaction messages let you apply an emoji to a message you've received from a WhatsApp user β the same single-emoji reaction users apply natively in WhatsApp. They're sent through the standard /messages endpoint with type: "reaction" and reference the original user message by its WhatsApp message ID (wamid).
Reactions are a service message type and require an open customer service window.
Limitations
- Only
sentstatus webhooks fire for reactions β nodeliveredand noreadwebhooks. Treat acceptance by Cloud API as the deliverable signal. - You can only react to a message you have received β not to your own outbound messages.
- If the target message is more than 30 days old, has been deleted, doesn't correspond to any message in the chat thread, or is itself a reaction, your reaction won't be delivered. You receive a
messageswebhook with error code131009. - One reaction per message. Sending a new reaction on the same message replaces the existing one.
- Multi-character emoji (skin-tone modifiers, ZWJ sequences) are supported but a single reaction is one emoji.
Send a Reaction
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "12015550123",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgLMTY0NjcwNDM1OTUVAgASGBQzQUZCMTY0MDc2MUYwNzBDNTY5MAA=",
"emoji": "π"
}
}
Two equivalent ways to specify the emoji:
| Form | Example | Notes |
|---|---|---|
| Unicode escape sequence | "π" | Safe for any transport (no encoding gotchas) |
| Literal emoji | "π" | Requires UTF-8 throughout your serialization |
Use whichever your stack handles cleanly. If you're constructing the JSON in a language that doesn't escape correctly by default, prefer the escape sequence.
message_id is the wamid of the user's message you're reacting to. You'll have received it on the inbound messages webhook.
Remove a Reaction
Send the same payload with emoji set to an empty string:
{
"messaging_product": "whatsapp",
"to": "12015550123",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgL...",
"emoji": ""
}
}
This removes any reaction you previously placed on that message.
Inbound User Reactions
When a user reacts to one of your outbound messages, you receive a messages webhook with type: "reaction":
{
"messages": [
{
"from": "12015550123",
"id": "wamid.HBgL...",
"timestamp": "1702920965",
"type": "reaction",
"reaction": {
"message_id": "wamid.HBgL...",
"emoji": "π"
}
}
]
}
reaction.message_id references your original message. reaction.emoji is the chosen emoji (literal, not escape sequence). When the user removes their reaction, you receive a similar webhook with emoji set to an empty string.
In Dualhook setups this webhook arrives on the messages field and is delivered directly to your endpoint via Webhook Override β Dualhook does not ingest it.
Use Cases
- Acknowledge a user message without composing a full reply (π / β ).
- Signal a message has been actioned (π¦ for "shipped", πΈ for "refunded").
- Disambiguate "I saw this" from "I'm working on it" without the typing-indicator/read-receipt nuance.
Reactions never substitute for a real reply on transactional issues β use them to cut noise on quick acknowledgements, not to avoid sending a status update the user is waiting for.