Portal Community

When to Use

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredPermanent System User access token. Store in BizFirst Credentials Manager.
phoneNumberIdRequiredNumeric string ID of the sending WhatsApp Business phone number.
apiVersionOptionalMeta Graph API version. Defaults to v18.0.

Operation

FieldRequiredDescription
toRequiredPhone number of the conversation participant (the sender of the message being reacted to), with country code, no + prefix.
messageIdRequiredThe WhatsApp message ID (wamid) of the specific message to react to. This is the messageId from the send result of a previous operation, or the id from an inbound webhook event.
emojiRequiredA single Unicode emoji character (e.g. for checkmark, 👍 for thumbs up, for heart). Only standard Unicode emoji are supported — custom stickers cannot be used as reactions. To remove a reaction, pass an empty string "".
Removing a reaction: To remove an existing reaction from a message, send this operation again with the same messageId and an empty string for emoji. This clears any reaction the business account has placed on that message.

Sample Configuration

{
  "resource": "message",
  "operation": "sendReaction",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.customerPhone }}",
  "messageId": "{{ $input.inboundMessageId }}",
  "emoji": "✅"
}

Validation Errors

ErrorCause
accessToken is requiredThe accessToken field is empty.
phoneNumberId is requiredThe phoneNumberId field is empty.
to is requiredThe to field is empty.
messageId is requiredThe messageId field is empty.
emoji is requiredThe emoji field is empty (use "" explicitly to remove a reaction).
131026 (Meta)The target message ID is invalid or does not belong to this conversation.
131047 (Meta)24-hour customer service window has expired — reactions are also subject to the conversation window.

Output

Success Port

FieldTypeDescription
messageIdstringThe wamid of the reaction message itself (not the message being reacted to).
phoneNumberIdstringThe sending phone number ID.
tostringThe conversation participant's phone number.
statusstring"sent" on success.
errorCodestringEmpty on success.
errorMessagestringEmpty on success.
rawResponsestringFull raw JSON from the Meta API.

Error Port

FieldTypeDescription
statusstring"failed" or "error".
errorCodestringMeta error code or BizFirst validation code.
errorMessagestringHuman-readable error description.
rawResponsestringRaw API error response.

Sample Output

{
  "messageId": "wamid.HBgLMTQxNTU1NTI2NzEVAgARGBIyQzM4NjhGQTExMjQ3RDMAA",
  "phoneNumberId": "123456789012345",
  "to": "14155552671",
  "status": "sent",
  "errorCode": null,
  "errorMessage": null,
  "rawResponse": "{\"messaging_product\":\"whatsapp\",\"contacts\":[{\"input\":\"14155552671\",\"wa_id\":\"14155552671\"}],\"messages\":[{\"id\":\"wamid.HBgLMTQxNTU1NTI2NzEVAgARGBIyQzM4NjhGQTExMjQ3RDMAA\"}]}"
}

Expression Reference

ValueExpressionNotes
Reaction message ID{{ $output.sendReaction.messageId }}ID of the reaction itself, not the message reacted to. Rarely needed downstream.
Recipient{{ $output.sendReaction.to }}For delivery audit logging.
Status{{ $output.sendReaction.status }}Branch on "sent" vs "failed" if reaction confirmation is business-critical.

Node Policies & GuardRails

Policy AreaRecommendation
Credential storageStore the access token in BizFirst Credentials Manager. Never inline in configuration.
Message ID sourceThe messageId must be a valid wamid. For inbound messages, extract it from the webhook payload (entry[0].changes[0].value.messages[0].id). For sent messages, use the messageId from the previous send operation's success port output.
Emoji encodingUse the Unicode code point (e.g. ) or the literal emoji character. Avoid emoji shortcodes (e.g. :check:) — WhatsApp does not expand them.
One reaction per messageThe business account can place only one reaction per message. Sending a new reaction replaces the previous one. Use empty string to remove.
24-hour windowReactions are subject to the 24-hour customer service window. Reacting to old messages from outside the window will fail with 131047.
Error portConnect the error port. Reactions are a low-criticality operation — route errors to a logging node rather than a customer-facing error flow.

Examples

Instant Acknowledgement on Inbound Message

{
  "resource": "message",
  "operation": "sendReaction",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.customerPhone }}",
  "messageId": "{{ $input.inboundMessageId }}",
  "emoji": "ὄ0"
}

A WebhookTrigger receives an inbound WhatsApp message. Immediately before the triage logic runs, this node reacts with eyes emoji to signal that the message was seen. The customer sees a near-instant acknowledgement even if the full response takes a few seconds to generate.

Task Completion Checkmark

{
  "resource": "message",
  "operation": "sendReaction",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "to": "{{ $input.teamMemberPhone }}",
  "messageId": "{{ $output.sendTaskMsg.messageId }}",
  "emoji": "✅"
}

A task management webhook fires when a task is marked complete. The workflow retrieves the wamid of the original task assignment message (stored in the task record when first sent), then reacts with a checkmark to visually close the loop in the WhatsApp conversation without sending a separate reply.