# WhatsApp reaction webhooks

`whatsapp.reacted` fires when a contact reacts to one of your messages, changes their emoji, or takes it back. Reactions sent by your business number do not emit it. A subscription to `whatsapp.received` does not include reactions, and a reaction does not open a customer service window.

A reaction is an annotation on a message rather than a message of its own, so it is not part of the delivery timeline and does not carry the [fields every message event carries](/docs/guides/whatsapp/webhooks#fields-every-message-event-carries).

## The payload

`whatsapp_id` names the message that was reacted to, not the reaction, and `emoji` is the change the user made. A user who reacts, changes their emoji, then takes the reaction back produces three events on that one message. WhatsApp sends no removal between the first two, so a change arrives as a single event carrying the new emoji.

```json
{
  "data": {
    "emoji": "👍",
    "from": { "phone_number": "+14155550100" },
    "to": { "phone_number": "+13124495569" },
    "whatsapp_id": "wam_01ky8b3xq4gd7pmzn2ka51f7te",
    "workspace_id": "ws_01ky7m235keycbnwyajabe1a6b"
  },
  "timestamp": "2026-07-23T14:52:11.000Z",
  "type": "whatsapp.reacted"
}
```

WhatsApp reports the reaction time to the second, so two of those three events can share one `timestamp`. Sorting them by it will not order them, and neither will delivery order, which retries make unreliable. Act on the reaction each event carries, as the change it describes. Do not reconstruct the sequence from the events or treat the last one to arrive as the message's standing reaction, because neither the timestamps nor the arrival order support it. Read the message back for the reactions that stand: [`GET /v1/whatsapp/messages/{message_id}`](/docs/api/reference/get-whatsapp-message) returns one entry per sender in `reactions`, and the message's [reaction log](/docs/api/reference/list-whatsapp-message-reaction-events) has every change.

`emoji` is present and `null` when the user took their reaction back, so a null is the removal itself rather than a missing value. The emoji is delivered exactly as WhatsApp sent it and is not normalized, so `❤` and `❤️` reach you as different strings.

- `from` is the contact and `to` is your WhatsApp number. Handle [business-scoped user IDs](/docs/guides/whatsapp/business-scoped-user-ids) when the contact's address has no phone number.

## Next steps

- [Reaction events](/docs/guides/whatsapp/events/reactions): read the current reactions and the reaction log
- [Send or remove a reaction](/docs/guides/whatsapp/reactions)

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/whatsapp-api) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
