Two Conversation Reactions Swapped Message Links: Repair Both Signal Chains
Two intact reactions can still point to the wrong messages. Prove the swap from immutable message edges, then correct every downstream action from the repaired bindings.
Research this article with AI
Follow Well Met on Google

Two reactions can remain present while their source-message associations are reversed. That creates a quiet failure: each event looks valid, but the reply or routing/qualification record belongs to the other conversation.
The repair is narrow. Keep the original event payloads, identify the two expected message edges, prove the permutation, then correct only the records that consumed the bad association. Do not infer intent from the emoji alone.
- Preserve the raw reaction events and their ingestion timestamps.
- Identify each source message by its native channel or conversation ID plus its native message ID or timestamp.
- Record the expected and observed bindings before changing downstream records.
How do you prove that two reactions exchanged source messages?
Start with native identifiers. In Slack, a `reaction_added` event includes an `event_id` and an `item` reference. For a message reaction, that reference contains a channel and message `ts`. Slack's event reference describes that message edge directly.
Build the expected mapping from the original intake record or immutable event capture. Build the observed mapping from the current reaction payload. A true two-reaction swap exists only when reaction A is observed on message B and reaction B is observed on message A, while both reaction records remain otherwise intact.
Do not use display text as the primary key. A message can be edited or duplicated; it may also be unavailable to a client. Use the native message reference first, then retain a permalink or retrieved message snapshot as review evidence.
| Reaction record | Native event ID | Expected message edge | Observed message edge | Downstream consumers | Correction and sign-off |
|---|---|---|---|---|---|
| Reaction A | Preserved native event ID | Message A | Message B | Reply draft or routing/qualification record | Rebind qualifying consumers to Message A; reviewer signs off |
| Reaction B | Preserved native event ID | Message B | Message A | Reply draft or routing/qualification record | Rebind qualifying consumers to Message B; reviewer signs off |
Which identifiers should the repair record keep?
Keep the identifiers supplied by the platform instead of creating a replacement key. Slack supplies an event ID and, for message reactions, an item with the channel and message timestamp. Slack also documents `chat.getPermalink` as a way to retrieve a friendly URL from a channel ID and message timestamp, including thread-aware links.
Slack and other platforms expose the same relationship differently. Google Chat identifies a reaction with a resource name in the form `spaces/{space}/messages/{message}/reactions/{reaction}`. Microsoft Graph represents a reaction as part of a `chatMessage`, while Discord messages expose a message ID and channel ID. The field names differ, but the repair rule stays the same: preserve the platform's message edge.
- Native reaction or event ID.
- Native conversation or channel/space ID.
- Native source message ID or timestamp.
- Observed-at timestamp and ingestion record ID.
- Expected binding source and reviewer decision.

Which reply actions need correction after a swap?
Correct a reply action when its draft or send decision, including its thread target was selected from the bad reaction-to-message edge. First check whether the reply was merely drafted, queued, sent, or never created. Each state needs a different correction.
For an unsent draft, move the draft only after checking that its text still answers the correct message. For a queued action, stop it before rebinding it. For a sent reply, do not silently move or recreate history. Add a correction record that links the reply to the actual source message and states whether a human follow-up is required.
A Slack permalink can provide a reviewable message reference when the channel and message timestamp are available. Slack's permalink method says the message timestamp uniquely identifies a message within a channel.
- Drafted reply: review text against the corrected message; then either rebind it or discard it.
- Queued reply: pause the queue entry pending correction of its message edge and a fresh send check.
- Sent reply: preserve the send record and attach the corrected edge; create a human follow-up only if the recipient needs clarification.
Which routing and qualification actions need correction?
Routing and qualification records need correction when the swapped edge determined an owner, queue, status, score, label, or next step. Do not update records simply because they are nearby in time. The repair scope is the set of consumers that read the incorrect edge.
Trace each consumer from the original reaction event through its derived record. Mark it either unaffected when it used independent evidence or corrected when the event-to-message binding changed its result. Mark it unresolved when the system cannot show which message edge the consumer used.
Keep the original value, corrected value, reason, actor, and timestamp in the audit trail. The goal is a defensible repair, not a cleaner-looking history.
- Reply and follow-up records.
- Assignment or routing/queue records.
- Qualification labels and related notes or next-step records.
- Automated actions that used the reaction as their trigger.
How do you sign off a repaired signal chain?
Use a two-part sign-off. First, a reviewer verifies the permutation matrix against the native event records and message references. Second, the reviewer confirms that every affected consumer was corrected or explicitly marked unaffected; otherwise, it is held as unresolved.
A reaction is a relationship to a message, not a free-standing signal. Google Chat's reaction resource includes a reaction identifier plus creator-and-emoji metadata. Microsoft Graph describes a chat message reaction as part of a chat message. Those documented models support retaining the message association as first-class audit evidence.
Close the incident only when the repaired bindings and downstream corrections, including unresolved exceptions are all recorded. If a source message cannot be retrieved, retain the native identifiers and hold the affected downstream action for review.
Slack's `reaction_added` event includes an event ID and, for message reactions, an item reference with a channel and message timestamp.
Slack Developer Docs (accessed), 2026-10-23Slack's `chat.getPermalink` retrieves a permalink for a message from its channel ID and message timestamp, including thread-aware links.
Slack Developer Docs (accessed), 2026-10-23Google Chat identifies reactions with resource names that include the space, message, and reaction, and identifies the user and emoji.
Google for Developers, 2025-07-25Microsoft Graph represents a chat message reaction as part of a chatMessage entity and includes reaction type and user fields.
Microsoft Learn, 2024-10-25Frequently asked questions
Can two valid reactions still create a bad workflow?
Yes. Both reaction records can exist while each points to the other message. The reaction data may look complete, but downstream actions can be attached to the wrong conversation.
What proves a two-reaction swap?
You need expected and observed message edges for both reactions. The proof is complete when reaction A is observed on message B and reaction B is observed on message A, with native identifiers retained for review.
Should the original reaction records be overwritten?
No. Preserve the original records and add corrected bindings with the reason plus reviewer and timestamp information. Overwriting the source removes the evidence needed to audit the repair.
How should a sent reply be handled?
Keep the send history intact. Attach the corrected source-message association and determine whether the recipient needs clarification; create a human follow-up only when that clarification is necessary.
What happens when the source message cannot be retrieved?
Keep the native reaction and message identifiers, mark the affected action unresolved, and hold any further automated action until a reviewer decides what to do.