reaction/add
Add an emoji reaction to a specific Slack message. Used to signal status, acknowledgement, or intent programmatically without posting a visible message reply.
When to Use
- Auto-acknowledge receipt of incoming requests by adding a
:eyes:reaction as the workflow begins processing. - Add a
:white_check_mark:reaction when the task referenced in a message has been completed successfully. - Signal approval on a proposal message with a
:thumbsup:reaction after an automated validation passes. - Mark processed messages with
:robot_face:to distinguish them from unprocessed ones in high-volume channels. - Add an
:alarm_clock:reaction to messages that require scheduled follow-up so they stand out visually.
Emoji Name Format: Provide the emoji name without colons. Use
thumbsup, not :thumbsup:. For custom workspace emojis, use their registered name exactly as it appears in your Slack workspace emoji list.Configuration
Connection
| Field | Required | Description |
|---|---|---|
botToken | Required | Slack Bot Token starting with xoxb-. Must have the reactions:write OAuth scope. |
Operation Fields
| Field | Required | Description |
|---|---|---|
channel | Required | Slack channel ID (e.g. C08ABCDEFGH) where the target message was posted. |
messageTs | Required | The timestamp of the message to react to, in Slack format (e.g. 1748221200.000100). Acts as the unique message identifier within a channel. |
emojiName | Required | Emoji name without surrounding colons (e.g. thumbsup, white_check_mark, eyes). Must be a valid standard or workspace custom emoji. |
Sample Configuration
{
"operation": "reaction/add",
"connection": {
"botToken": "{{ $credentials.slackBot.token }}"
},
"channel": "{{ $trigger.slackEvent.channel }}",
"messageTs": "{{ $trigger.slackEvent.ts }}",
"emojiName": "eyes"
}
Validation Errors
| Error Code | Cause | Resolution |
|---|---|---|
already_reacted | The bot has already added this emoji to the specified message. | Check reaction state first using reaction/get if idempotency is required, or ignore this error in the error port handler. |
invalid_name | The emoji name is not recognized (invalid standard emoji or typo in custom emoji name). | Verify the emoji name in Slack — open emoji picker and copy the exact name shown. |
message_not_found | No message exists at the given messageTs in the specified channel. | Confirm the timestamp and channel ID are correct. Timestamps are channel-scoped. |
too_many_emoji | The message already has the maximum number of emoji reactions (23 unique emojis per message). | Remove an existing reaction first, or use a different status signaling approach. |
missing_scope | Bot token lacks reactions:write scope. | Add reactions:write under OAuth & Permissions and reinstall the Slack App. |
Output
Success Port
| Field | Type | Description |
|---|---|---|
channel | string | Channel ID where the reaction was applied. |
messageTs | string | Timestamp of the message that received the reaction. |
emojiName | string | Emoji name that was added (without colons). |
status | string | "success" when the reaction was successfully added. |
errorCode | string | Empty on success. Contains the Slack API error code on failure. |
payload | object | Raw Slack API response. |
Error Port
Activated on any API error. The already_reacted error is common in at-least-once workflows — consider treating it as a non-fatal condition in your error port handler.
Sample Output
{
"channel": "C08INBOX001",
"messageTs": "1748221200.000100",
"emojiName": "eyes",
"status": "success",
"errorCode": "",
"payload": {
"ok": true
}
}
Expression Reference
| Expression | Result |
|---|---|
{{ $output.addReaction.channel }} | Channel ID where the reaction was applied. |
{{ $output.addReaction.messageTs }} | Message timestamp — pass to reaction/remove to undo. |
{{ $output.addReaction.emojiName }} | Confirmed emoji name that was added. |
{{ $output.addReaction.status }} | "success" or error status string. |
Node Policies & GuardRails
| Policy Area | Recommendation |
|---|---|
| Idempotency | The already_reacted error indicates the bot already added this emoji. Wire the error port to log and continue rather than failing the workflow — reactions are naturally idempotent in effect. |
| Emoji Naming | Always strip colons from emoji names before passing to emojiName. Colons are a display convention, not part of the API name. |
| Custom Emoji Consistency | Custom workspace emojis may be deleted or renamed. Build a fallback to a standard emoji if your workflow relies on custom emoji for status signaling. |
| Rate Limits | Slack's reactions.add is Tier 2 (20+ requests/min). For high-volume message processing, batch reaction adds or throttle to stay within limits. |
| Reaction Lifecycle | Plan a corresponding reaction/remove step to clean up status reactions after the workflow completes. Leaving stale reactions misleads users about message processing state. |
Examples
Acknowledge Incoming Request with Eyes Emoji
When a new message arrives in #support-requests, immediately add :eyes: to signal the workflow has picked it up.
{
"operation": "reaction/add",
"channel": "{{ $trigger.slackEvent.channel }}",
"messageTs": "{{ $trigger.slackEvent.ts }}",
"emojiName": "eyes"
}
Mark Completed Task with Check Mark
After completing a task referenced in a Slack message, add a :white_check_mark: to signal completion.
{
"operation": "reaction/add",
"channel": "C08TASKS001",
"messageTs": "{{ $input.taskMessageTs }}",
"emojiName": "white_check_mark"
}
Flag Message for Follow-Up
When an automated check detects a message requiring manual review, add :alarm_clock: to make it visually distinct for the team.
{
"operation": "reaction/add",
"channel": "{{ $input.channelId }}",
"messageTs": "{{ $input.messageTs }}",
"emojiName": "alarm_clock"
}