reaction/remove
Remove an emoji reaction previously added by the bot from a specific Slack message. Used to clean up workflow status indicators once a process step completes or is resolved.
When to Use
- Remove the
:eyes:reaction after a message has been fully processed by the workflow. - Clear the
:alarm_clock:reaction after a scheduled follow-up has been completed. - Remove the
:x:reaction from a message once the underlying error has been resolved. - Clean up temporary workflow reaction markers so the channel does not accumulate stale status indicators.
- Remove a
:hourglass:reaction from a pending task message once the task transitions to complete.
Note: A bot can only remove reactions that it added. Attempting to remove a reaction added by a human user or a different bot will return a
no_reaction error. Always track which reactions your bot added to avoid spurious errors.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 from which to remove the reaction (e.g. 1748221200.000100). |
emojiName | Required | Emoji name to remove, without colons (e.g. eyes, alarm_clock, x). Must exactly match the name used when the reaction was added. |
Sample Configuration
{
"operation": "reaction/remove",
"connection": {
"botToken": "{{ $credentials.slackBot.token }}"
},
"channel": "{{ $input.channel }}",
"messageTs": "{{ $input.messageTs }}",
"emojiName": "eyes"
}
Validation Errors
| Error Code | Cause | Resolution |
|---|---|---|
no_reaction | The bot did not previously add this emoji reaction to the message, or it was already removed. | Treat as non-fatal — log and continue. Use reaction/get before removing if you need strict verification. |
message_not_found | No message exists at the given timestamp in the specified channel. | Verify the channel ID and message timestamp are correct and have not changed. |
invalid_name | The emoji name is not recognized. | Confirm the exact emoji name used when the reaction was originally added. |
missing_scope | Bot token lacks the reactions:write scope. | Add reactions:write to your Slack App's OAuth scopes and reinstall. |
invalid_auth | Token is invalid or revoked. | Regenerate the bot token and update the credential store. |
Output
Success Port
| Field | Type | Description |
|---|---|---|
channel | string | Channel ID where the reaction was removed. |
messageTs | string | Timestamp of the message from which the reaction was removed. |
emojiName | string | Emoji name that was removed (without colons). |
status | string | "success" when the reaction was successfully removed. |
errorCode | string | Empty on success. Slack API error code on failure. |
payload | object | Raw Slack API response. |
Error Port
Activated when the reaction does not exist, the message is not found, or the token lacks permissions. The no_reaction error should typically be handled as non-fatal in cleanup workflows.
Sample Output
{
"channel": "C08INBOX001",
"messageTs": "1748221200.000100",
"emojiName": "eyes",
"status": "success",
"errorCode": "",
"payload": {
"ok": true
}
}
Expression Reference
| Expression | Result |
|---|---|
{{ $output.removeReaction.channel }} | Channel where the reaction was removed — for logging. |
{{ $output.removeReaction.messageTs }} | Message timestamp — pass to subsequent nodes if further actions are needed. |
{{ $output.removeReaction.emojiName }} | Confirmed emoji name that was removed. |
{{ $output.removeReaction.status }} | Status string for conditional branching. |
Node Policies & GuardRails
| Policy Area | Recommendation |
|---|---|
| Non-Fatal Errors | The no_reaction error should be treated as non-fatal in cleanup workflows. The desired end state (reaction absent) is already achieved — log it and continue. |
| Reaction Ownership | Bots can only remove reactions they added. Track bot-added reactions in workflow state if you need deterministic cleanup across multiple workflow runs. |
| Pairing with reaction/add | Always pair reaction/remove with the corresponding reaction/add node earlier in the workflow. Orphaned reactions mislead users about the processing state of messages. |
| Rate Limits | Slack's reactions.remove is Tier 2 (20+ requests/min). In high-volume message processing workflows, throttle removal calls appropriately. |
| Emoji Name Consistency | Use a constant or shared variable for emoji names rather than hardcoding the same string in both add and remove nodes. This prevents drift if the emoji name changes. |
Examples
Remove Eyes After Processing Completes
At the end of a message processing workflow, remove the :eyes: acknowledgement reaction to signal the message has been fully handled.
{
"operation": "reaction/remove",
"channel": "{{ $input.channel }}",
"messageTs": "{{ $input.messageTs }}",
"emojiName": "eyes"
}
Clear Error Reaction After Resolution
Once an automated error has been resolved, remove the :x: reaction that was added during the error state so the channel shows a clean status.
{
"operation": "reaction/remove",
"channel": "C08INCIDENTS",
"messageTs": "{{ $input.incidentMessageTs }}",
"emojiName": "x"
}
Swap Reactions to Reflect State Transition
Remove :hourglass: and add :white_check_mark: when a task transitions from in-progress to complete.
// Step 1 — Remove in-progress indicator
{
"operation": "reaction/remove",
"channel": "{{ $input.channel }}",
"messageTs": "{{ $input.ts }}",
"emojiName": "hourglass"
}
// Step 2 — Add completion indicator
{
"operation": "reaction/add",
"channel": "{{ $input.channel }}",
"messageTs": "{{ $input.ts }}",
"emojiName": "white_check_mark"
}