Slack Error: 'already_reacted' — Cause, Fix, and Troubleshooting Guide
Fix the Slack already_reacted error: reactions.add tried to add an emoji the bot already added. Treat it as idempotent and dedupe redelivered events.
- #slack
- #api
- #troubleshooting
- #errors
Stuck on this Slack error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
Overview
already_reacted is returned by reactions.add when the calling user (your bot) has already added that exact emoji to the message. Slack won’t add a duplicate reaction.
{
"ok": false,
"error": "already_reacted"
}
Symptoms
- Reaction automations log
already_reactedon messages the bot has already marked. - The error clusters when Slack redelivers events (retries), causing the same handler to run twice.
- Adding a different emoji to the same message succeeds.
Common Root Causes
1. Duplicate event delivery
Slack retries event deliveries if your endpoint is slow to ack. A “react to this message” handler that isn’t idempotent runs twice and the second reactions.add fails.
2. Re-processing history
A bot that scans channel history and reacts can revisit messages it already reacted to.
3. Concurrent workers
Two workers pick up the same message and both try to add the same emoji.
How to diagnose
Add the same reaction twice:
curl -s -X POST https://slack.com/api/reactions.add \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channel":"C0123456789","timestamp":"1700000000.000100","name":"white_check_mark"}'
# Repeat the identical call
{"ok": false, "error": "already_reacted"}
Check current reactions to confirm the bot is already present:
curl -s "https://slack.com/api/reactions.get?channel=C0123456789×tamp=1700000000.000100" \
-H "Authorization: Bearer $SLACK_BOT_TOKEN"
Fixes
- Treat
already_reactedas success. The desired end-state (the emoji is present) is already true; don’t error or retry. - Dedupe events: track the Slack
event_id/X-Slack-Retry-Numheader and skip work you’ve already done. - Ack fast: respond 200 to the Events API within 3 seconds so Slack doesn’t redeliver in the first place.
- Check before adding with
reactions.getif you want to avoid the call entirely.
What to watch out for
- Reacting is idempotent by intent — design handlers so a duplicate is a no-op, not an alert.
already_reactedis per-user: the error only fires if your bot already reacted, not if a human used the same emoji.- Don’t confuse it with
too_many_reactions(per-user cap) ortoo_many_emoji(distinct-emoji cap on the message).
Related
- Slack Error: ‘message_not_found’
- Slack Error: ‘ratelimited’
- Reaction-driven Slack automations for ops
Fixed it? Get 500 Slack & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Did this fix your issue?
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.