Reaction Messages

Apply emoji reactions to WhatsApp user messages. Limitations (sent-only status, 30-day window, error 131009), how to remove a reaction, and inbound user reaction webhooks.

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 sent status webhooks fire for reactions β€” no delivered and no read webhooks. 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 messages webhook with error code 131009.
  • 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:

FormExampleNotes
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.

Related

  • Service MessagesFree-form messages sent inside an open customer service window: type list, contextual replies, media caching, TTL, message quality, and pricing.
  • Messaging WebhookReal-time webhook events for inbound messages, delivery statuses, and errors.
Browse more docsStart Free Trial