Cloodot
Workflows

Action nodes

The steps that do the work — send messages, manage conversations, route, apply AI, and keep your CRM in sync — with the parameters and outputs of each.

Action nodes are where a workflow does something. Add as many as you need and chain them in any order. Every action's parameter fields accept {{trigger.*}} and {{<step>.*}} variables, and most actions also produce variables that later steps can read.

Some actions need a conversation

Conversation-scoped actions (Open, Resolve, Star, Send Message, Add Label, Assign…) need a conversation to act on. Under conversation triggers that's automatic. Under Incoming Webhook, Contact Stage Changed, or Workflow Error, supply one first — for example with Send WhatsApp Template to a phone number (it creates the conversation) or Find Contact. Each action below notes whether it requires a conversation.

Every action that runs on a conversation returns {{<step>.conversationId}}, so you can pass the conversation forward. Action-specific outputs are listed with each one.

Conversation management

Open Conversation

Sets the conversation's status to Open.

  • Needs a conversation: Yes · Parameters: none · Output: conversationId

Resolve Conversation

Marks the conversation Resolved. Note this only changes the status — it does not unassign the AI persona, so the agent keeps replying if one is assigned. To stop AI replies, use Assign to User as well.

  • Needs a conversation: Yes · Parameters: none · Output: conversationId

Star Conversation

Stars the conversation for quick access.

  • Needs a conversation: Yes · Parameters: none · Output: conversationId

Unstar Conversation

Removes the star.

  • Needs a conversation: Yes · Parameters: none · Output: conversationId

Messaging

Send Message

Sends a message into the conversation. Compose the text right in the node.

  • Needs a conversation: Yes
  • Parameters:
    • Message — the body. Supports {{...}} templating.
    • Generate with AI — when on, the message text is used as a prompt and the reply is written by AI.
    • Quick replies — optional tappable buttons; each has a title and an optional payload that comes back when the customer taps it.
    • Attachments — optional media/files; give each a public url and a type of IMAGE, VIDEO, AUDIO, or FILE.
  • Outputs: conversationId, messageId, quickReplyCount, attachmentCount

The AI may reply too

This send is independent of the built-in AI agent — if a persona is assigned, its reply still goes out, and on a new conversation it often lands before this step runs. Use a workflow message to complement the agent, and see Workflows and the built-in AI agent if you need the workflow to own the response.

WhatsApp's 24-hour window

On WhatsApp you can only send a free-form message while the customer-service window is open (they messaged in the last 24 hours). To start a conversation, or to reach someone after the window closes, use Send WhatsApp Template with an approved template instead. A Decision node's 24h Reply Window condition lets you branch between the two.

Send Email

Sends an email reply on the conversation's email-channel thread.

  • Needs a conversation: Yes (an email conversation)
  • Parameters: To / Cc / Bcc (optional; default recipient is the contact's address, comma-separate multiple), Subject (optional; defaults to the thread's subject), HTML body (preferred), or plain-text Message as a fallback. All support templating. One of HTML or Message must be non-empty.
  • Outputs: conversationId, messageId, subject

Availability

Send Email is gated by a feature flag. If you don't see it, contact support to enable it for your organization.

Send WhatsApp Template

Sends an approved WhatsApp template — the only way to start a WhatsApp conversation or message someone outside the 24-hour window.

  • Needs a conversation: No. It works two ways:
    1. Into a conversation — leave the recipient blank; it uses the trigger's conversation.
    2. To a phone number — under a trigger with no conversation (like Incoming Webhook), set Recipient phone. The step creates or reuses that person's conversation, so later steps act on it automatically.
  • Parameters: Conversation (optional), Recipient phone / Recipient name (for mode 2), Channel (required when sending to a phone), Template (required when sending to a phone; reuses the last template sent when a conversation is bound), Body variables (map of name → value), Header text or Header media URL. All values support templating.
  • Outputs: conversationId, conversationCreated (false = reused), messageId, templateId, templateName

Labels

Add Label

Applies one or more existing labels to the conversation.

  • Needs a conversation: Yes · Parameter: the label(s) to add · Outputs: conversationId, labelIds

Remove Label

Removes one or more labels from the conversation.

  • Needs a conversation: Yes · Parameter: the label(s) to remove · Outputs: conversationId, labelIds

Routing

Assign to User

Assigns the conversation to a specific teammate — and clears the AI assignee, so the built-in agent stops replying. This is the way to route a conversation away from AI.

  • Needs a conversation: Yes · Parameter: the target user · Outputs: conversationId, userId

Assign to AI

Assigns the conversation to a specific AI persona, overriding the default persona Cloodot would otherwise pick. It sets who answers — it doesn't send a reply by itself; the chosen persona responds from the conversation's next message on.

  • Needs a conversation: Yes · Parameter: the AI persona version · Outputs: conversationId, personaVersionId

Assignment vs. the built-in AI flow

On a new conversation the agent usually replies before a workflow's assignment runs, so Assign to User takes effect from the next message rather than suppressing the first reply. Assign early when a conversation shouldn't be handled by AI. Full detail: Workflows and the built-in AI agent.

AI

AI Extraction

Reads the conversation and auto-extracts labels, custom fields, and sentiment — turning a free-form chat into structured data you can branch on.

  • Needs a conversation: Yes
  • Parameter: an optional extraction prompt to steer what's pulled out
  • Outputs: conversationId, extractedData — reference extracted values downstream with a Decision node's Variable condition (e.g. ai_extraction.sentiment).

CRM

These actions operate on a contact, so they work under any trigger — including webhooks, the classic "external CRM fired a webhook → mirror the contact" flow.

Create Contact

Creates a contact in your CRM, with custom fields and a policy for duplicates.

  • Needs a conversation: No
  • Parameters: Name (required), Phone, Email (both used to match existing contacts), Stage, Custom fields (one row per field; blank values are skipped), and If a match existsupdate (default), skip, or fail.
  • Outputs: contactId, created (false = matched an existing contact), name, email, phone, stageId

Update Contact

Updates a contact's details and custom fields. Blank values keep the current data.

  • Needs a conversation: No — targets the Contact parameter (templatable, e.g. {{trigger.contactId}}) or, when blank, the triggering conversation's contact.
  • Parameters: Contact (optional), Name, Phone, Email, Custom fields
  • Outputs: contactId, updatedFields, name, email, phone

Find Contact

Looks up a contact by phone or email so later steps can use it. Returns found = false instead of failing when there's no match — branch on it with a Decision node.

  • Needs a conversation: No
  • Parameters: Phone (checked first) and/or Email. Both support templating.
  • Outputs: found, contactId, name, email, phone, stageId, stageName, customFields

Change Contact Stage

Moves a contact to a lifecycle stage in your pipeline.

  • Needs a conversation: No — targets the Contact parameter or the triggering conversation's contact.
  • Parameters: Stage (required), Contact (optional)
  • Outputs: contactId, fromStageId, toStageId, toStageName

Skill Set actions

Installed Skill Sets show up here too, each listed as {Skill Set} · {skill}. They appear only when the Skill Set is installed, and let a workflow call your custom skills as a step.

Loop prevention

To stop infinite loops, some actions are hidden based on your trigger. A workflow triggered by Label Added can't Add Label; Conversation Resolved can't Resolve Conversation; Contact Stage Changed can't Change Contact Stage; and so on for each matching trigger–action pair.

On this page