Trigger nodes
The events that start a workflow — one per workflow — and the variables each one hands to the steps that follow.
Every workflow starts with exactly one trigger — the event that kicks it off. When the event happens, the trigger fires the workflow and hands the rest of the steps a bundle of data about what just happened. You reach that data downstream with {{trigger.<field>}} templates (see Using variables).
Conversation context
Some triggers fire on a conversation — a new message, a resolution, a star. These carry a conversationId, so any conversation-scoped action (Send Message, Add Label, Assign…) works straight away.
Other triggers aren't tied to a conversation — an Incoming Webhook, a Contact Stage Changed event, or a Workflow Error. Under those, conversation actions have nothing to act on unless an earlier step supplies one (for example Send WhatsApp Template to a phone number creates a conversation, and Find Contact resolves a contact). Each trigger below notes whether it carries a conversation.
Fields every conversation trigger provides
When a trigger carries a conversation, these variables are always available on every step that follows:
{{trigger.conversationId}} · {{trigger.conversationStatus}} · {{trigger.conversationChannel}} · {{trigger.conversationLabels}} · {{trigger.conversationStarred}} · {{trigger.messageText}} · {{trigger.assignedUserId}} · {{trigger.assignedPersonaId}} · {{trigger.contactId}} · {{trigger.contactName}} · {{trigger.contactEmail}} · {{trigger.contactPhone}}
Conversation triggers
New Conversation
Fires when a brand-new conversation is created — the first inbound message on any channel. The most common starting point: welcome the customer, route them, or triage with AI.
- Carries a conversation: Yes
- Key variables: the shared conversation fields above
Conversation Opened
Fires when a conversation's status changes to Open (for example, a resolved thread that gets a new reply).
- Carries a conversation: Yes
- Loop prevention: the Open Conversation action is hidden under this trigger — reopening on "opened" is a loop.
Conversation Resolved
Fires when a conversation is marked Resolved. Great for post-resolution follow-ups, satisfaction surveys, or advancing a contact's pipeline stage.
- Carries a conversation: Yes
- Loop prevention: the Resolve Conversation action is hidden under this trigger.
Conversation Starred
Fires when a conversation is starred.
- Carries a conversation: Yes
- Loop prevention: the Star Conversation action is hidden under this trigger.
WhatsApp Flow Submitted
Fires when a customer completes and submits a WhatsApp Flow — a native in-chat form (booking, lead capture, survey). The answers arrive as variables you can branch on and reuse. See WhatsApp Flows.
- Carries a conversation: Yes
- Key variables:
{{trigger.flowValues.<field>}}— the submitted answers, keyed by field name (e.g.{{trigger.flowValues.km_range}}). Match on them with a Decision node's Variable condition.{{trigger.flowToken}}— the token stamped on the outbound send and echoed back{{trigger.flowSource}}— where the flow was sent from (oneoff,campaign,workflow,sample,api){{trigger.campaignId}}— set when a campaign sent the flow{{trigger.templateName}}— the template whose button opened the flow, when known
Routing triggers
AI Agent Assigned
Fires when an AI persona is assigned to a conversation. Use it to set up context the moment AI takes over.
- Carries a conversation: Yes
- Key variable:
{{trigger.personaVersionId}}— the assigned AI persona version
This fires on most new conversations
Cloodot auto-assigns a default persona to new conversations, and that automatic assignment fires this trigger too — so a workflow here runs on nearly every new conversation, not only when a persona is assigned by hand. See Workflows and the built-in AI agent.
Human Agent Assigned
Fires when a team member is assigned to a conversation — for notifications, logging, or SLA timers.
- Carries a conversation: Yes
- Key variable:
{{trigger.userId}}— the assigned user
Label triggers
Label Added
Fires when a label is added to a conversation. A label makes a clean signal — tag something manually or with AI, and let this trigger do the rest.
- Carries a conversation: Yes
- Key variable:
{{trigger.labelIds}}— the label IDs that were added - Loop prevention: the Add Label action is hidden under this trigger.
Label Removed
Fires when a label is removed from a conversation.
- Carries a conversation: Yes
- Key variable:
{{trigger.labelIds}}— the label IDs that were removed - Loop prevention: the Remove Label action is hidden under this trigger.
CRM triggers
Contact Stage Changed
Fires when a contact's lifecycle stage changes in your pipeline — for example, moving from New to Qualified. Use it to run a playbook every time a contact reaches a stage.
- Carries a conversation: No — a stage change isn't tied to a conversation. Conversation actions need a conversation supplied by an earlier step (e.g. Send WhatsApp Template to
{{trigger.contactPhone}}). - Key variables:
{{trigger.contactId}}·{{trigger.contactName}}{{trigger.fromStageId}}·{{trigger.fromStageName}}— the previous stage (absent if the contact had none before){{trigger.toStageId}}·{{trigger.toStageName}}— the new stage
- Loop prevention: the Change Contact Stage action is hidden under this trigger.
Webhook trigger
Incoming Webhook
Fires when an external system POSTs JSON to the workflow's unique URL. This is how you wire Cloodot to any tool that can send a webhook — a store, a form, a CRM, a no-code automation.
- Carries a conversation: No — the payload is free-form JSON.
- Key variables: anything in the posted body, addressed by path —
{{trigger.payload.order.id}},{{trigger.payload.items.0.sku}}, and so on.
Setup, in the trigger's panel:
- The panel shows the endpoint URL and a signing secret. By default every request must be signed (HMAC-SHA256 — the panel shows exactly how).
- If your sender can't sign requests (a simple script or no-code tool), switch off Require signed requests. Anyone who knows the URL can then trigger the workflow, so treat the URL like a password.
- Use Listen for a request in the Sample event section to capture one real request — it works before the workflow is published. The captured fields then show up as variable suggestions on every later step, and dry runs are prefilled with them. The first real event is captured automatically if you never listen.
System trigger
Workflow Error
Runs when another workflow fails for good (after all its retries). Build an error handler once — alert a channel, log to an external service — and point other workflows at it under their execution settings.
- Carries a conversation: Not guaranteed — error handlers must work for non-conversation workflows too.
{{trigger.conversationId}}is present only when the failed run had one. - Key variables:
{{trigger.failedWorkflowName}}·{{trigger.failedWorkflowId}}·{{trigger.error}}·{{trigger.failedRunNumber}}·{{trigger.failedExecutionId}}·{{trigger.failedAt}}·{{trigger.retryCount}}
Error workflows never cascade
A Workflow Error trigger never fires because of another error workflow — so a broken alert can't set off an infinite chain.