What a trigger is, the lifecycle events it can hook into, the nodes it may use, and how it goes from a draft to something that fires in production.
A trigger is a small piece of automation attached to a flow that runs in the background when a conversation reaches a moment in its lifecycle, with no customer waiting on the other end. Where your main flow is a conversation (it asks questions, presents choices, sends messages), a trigger is a side-effect: it might POST to your CRM when a chat closes, generate an internal summary, or branch on a condition and call one of two webhooks.
Triggers live in the same flow editor as your conversation, on their own tabs alongside Main Flow. Each trigger is tied to one lifecycle event, and a flow can have at most one trigger per event.
A trigger fires on exactly one of these conversation events:
A completed or abandoned conversation also fires Conversation Closed, so a single trigger on Closed catches every meaningful ending. A timed-out bounce fires only Conversation Timed Out.
Because a trigger runs with no customer present, it can only use nodes that don't try to talk to anyone. The palette on a trigger tab is restricted to these trigger-safe nodes:
Conversational nodes (Prompt, Decision, Exit, Knowledge Agent, Entity Extraction Agent, Routing Agent, Agent Handoff) aren't available in triggers. There's no one to prompt, no choice to present, and nothing to hand off; a trigger just does its work and finishes.
Every trigger starts life disabled, as a draft. While it's disabled you can save it in any state, half-finished and all, without anything firing. The toolbar shows a Disabled toggle for the trigger you're editing.
When you flip it to Enabled, the trigger's graph is validated. To enable, it must:
If anything is wrong, enabling is refused and the editor tells you what to fix. Outgoing connections aren't required; a node can be the end of the line.
A disabled trigger never runs. Disable a trigger any time to take it offline without deleting it, and re-enable it later once it's valid again.
Once enabled, a trigger fires automatically whenever its event happens, in the background, so it never slows the conversation down. It runs against the same version of the flow the conversation is using, so changes you publish don't retroactively alter conversations already in flight.
Each occurrence of an event runs the trigger at most once. The occurrence is claimed the moment the run starts, so a duplicate of the same event won't run it again, and a run that fails is recorded as failed rather than retried. A different occurrence of the same event counts on its own and fires again: if a closed conversation is reopened and later closes a second time, that second close is its own occurrence, so the trigger fires once more.
A trigger that fails is not retried automatically. If a step can fail (an API call, say), handle it inside the trigger, or check the run's status in the background-jobs view.