# Escalate

Pause the AI on this thread and page a human right now — the safety net at the end of a path the AI could not, or should not, finish alone.

## Getting here

**Automate → Workflows**, open a workflow, click **+** on the canvas, then pick **Escalate** under **Add Steps**.

## Before you start

- An **owner**, **admin** or **agent** can add this step and save the workflow. Publishing it is an **owner** or **admin** action.
- Building and running workflows depends on your plan; see [pricing](/pricing).
- Nothing outside Inchat has to be connected, and there is nothing to configure — Escalate takes no fields.

## Set up

1. Open the workflow and click **+** where the escalation belongs.
2. Pick **Escalate**. There is nothing to configure.
3. Save the step, then publish the workflow.

## How it works

- The step writes an internal-only note on the conversation's timeline, recording that a workflow escalated it — the customer never sees this note.
- It records the escalation alongside any the AI decides on its own, so both show up in the same place for review.
- It pauses the AI on this thread the same way an inbound "let me speak to a person" does. That pause is read by the customer's next inbound message and by an **AI Reply** step in this run or one it hands off to — but not by an AI app connected over MCP: that path checks only the separate hold **Pause AI / Unassign** sets, not this one, so an MCP-connected app can still message the customer on a thread Escalate just silenced. This is a known gap, not something this step is meant to prevent today.
- Alongside the note, it can also draft a second, AI-written internal note summarising the conversation, and create a follow-up **task** for the conversation's assignee, due the next day — but only when nothing has already summarised this same stretch of the conversation (the time since the last human reply). An **AI Reply** step's own decline already writes one of these summaries, so an Escalate step that follows it in the same stretch skips both — no second note, no task.
- It pages a human: a push notification through the same channel any "a human is needed" moment uses (filtered by the recipient's own notification scope, mute setting and at-desk status, same as every other push of that kind), and an in-app notification addressed to the conversation's assignee if it has one and can still reach the channel, or to every owner and admin if it does not.
- It does not assign the conversation to anyone — a thread can be escalated and still show as unassigned.

## When it fails

- The paging step can fail to reach anyone — a push and an in-app notification can each fail independently — and today the step is still recorded as having succeeded even when neither one lands, so there is no separate signal in the run log for a page that reached nobody.
- Two of this step's own writes can fail it with no reason text attached — the pause itself, and recording the escalation for review — so the run log can show the step failed without saying which of the two. A third cause names itself, though: the thread moved out from under the step while it was running (for example, a person took it over at the same moment), which stops the run rather than continuing past it.

## Limits

- It sends the customer nothing — both the note it writes and the drafted handoff summary are internal only.
- It does not assign the conversation to a person; **Assign To (human)** is what places it in someone's queue. The summary note and follow-up task are both skipped if this stretch of the conversation already has a summary; the task additionally needs the conversation to already have an assignee (it goes to them, never a new pick) and the AI agent's own follow-up-task setting to be on.
- The pause clears when a human replies (which also starts its own separate few-hour quiet period on the AI, so the bot does not necessarily speak the instant a human answers) or when someone clicks **Resume AI**. On an escalated thread the Inbox offers **Resume AI** in place of **Take Over**, on web and in the app. Running an **Assign To (AI)** step after an escalation does not lift this hold, because that step never clears it. Later in the same run the step succeeds and the AI stays silent. A different automatic run meeting the hold is refused and stops there.
- It sets a different hold from the one **Pause AI / Unassign** sets — clearing one does not clear the other.
- A failed page is not distinguishable from a successful one in the run log today — the step succeeds either way.
- The MCP `send_message` tool does not check this hold at all — see How it works. Treat Escalate as silencing Inchat's own auto-reply and workflow paths, not every way an AI-authored message could reach this thread.

## Best practices

- Assign the conversation to a person BEFORE escalating it, not after — Escalate's own page is addressed to the conversation's existing assignee (or to every owner/admin if there still isn't one), so assigning first is what gets the page to a specific person rather than the whole team.
- Reach for Escalate when the point is *a person needs to look at this now*. Use **Assign To (human)** or **Assign To (team)** when the point is simply *this is theirs* with no urgency implied.
- Do not assume Escalate always adds its own follow-up task after an **AI Reply** decline in the same path — the decline itself already writes a summary, so an Escalate step right after it typically creates neither a second note nor a task; add a **Create a Task** step explicitly if the flow needs one there.

## Use cases

- An **AI Reply** step declines to answer; the path assigns the conversation to a person, then escalates — the AI's decline already paged whoever holds the thread, and what Escalate adds on top is the AI pause and a page addressed specifically to that assignee.
- A customer's message matches a Condition built to catch a complaint, and the flow escalates immediately rather than letting the AI attempt a reply.

## FAQ and troubleshooting

### Does the customer see that the conversation was escalated?

No. The note it writes is internal only, visible to the team, never to the customer.

### Does Escalate assign the conversation to someone?

No. It pages people and pauses the AI, but the conversation can still show as unassigned afterward. Pair it with an assignment step if it should also land in a specific queue.

### How do I know if the page actually reached someone?

The run log cannot tell you today — the step is recorded as succeeded even if both the push and the in-app notification failed to reach anyone.

### Does Escalate create a task too?

Sometimes. It can draft a second, AI-written summary note and a next-day follow-up task, but both are skipped if this same stretch of the conversation (since the last human reply) already has a summary — an AI Reply step's own decline writes one, so Escalate right after it usually creates neither. The task specifically also needs the conversation to already have an assignee, and needs the AI agent's own follow-up-task setting to be on; the note does not depend on either of those.

### Can an AI app connected over MCP still message the customer after Escalate?

Yes, today it can — the MCP send tool checks a different hold (the one Pause AI / Unassign sets), not the one Escalate sets. This is a known gap on the product side, not something this step currently prevents.

## Related

- [Assign To (human)](https://inchat.inseller.my/help/workflows/assign-to-human)
- [Assign To (team)](https://inchat.inseller.my/help/workflows/assign-to-team)
- [Pause AI / Unassign](https://inchat.inseller.my/help/workflows/pause-ai-unassign)
- [AI Reply](https://inchat.inseller.my/help/workflows/ai-reply)
- [Create a Task](https://inchat.inseller.my/help/workflows/create-a-task)

---

Source files: `src/lib/workflows/ai-builder/spec.ts`, `src/lib/workflows/canvas-model.ts`, `src/components/workflows/WorkflowStepConfigDrawer.tsx`, `src/lib/workflows/engine-message-actions.ts`, `src/lib/orchestrator/thread-gate.ts`, `src/lib/notifications/human-needed.ts`, `src/lib/inbox/send-reply.ts`, `src/lib/inbox/takeover.ts`, `src/lib/inbox/human-reply-hold.ts`, `src/lib/ai/handoff-summary.ts`, `src/lib/ai/handoff-note.ts`, `src/lib/mcp/tools.ts`, `src/components/inbox/ThreadOwnerToggle.tsx`, `src/lib/workflows/engine.test.ts`
