Advanced Features

Workflow AI Actions

A workflow is a step-by-step procedure you draw in a visual builder: send messages, collect details, call APIs, wait for events and save lead data, in the exact order you set. Use a plain AI Action for a single task the chatbot can do in one go; use a workflow when the task has several steps that must happen in order, needs to remember data between steps, or must wait for something outside the chat (such as a payment confirmation).

Before you start

  • Workflow actions and workflow testing need the Standard plan or above.
  • Workflows don't run while AI Agent mode is on, so keep AI Agent mode off in Settings > Model. You can still build and test workflows in the builder.

A workflow goes live in five steps: build it, test it, publish it, add it as a Workflow action, then tell the chatbot when to use it

Build your first workflow

This example collects a visitor's name and email and saves them as a lead.

  1. Go to Settings > Workflows and click Create Workflow. The builder opens with a Start node on the canvas.
  2. In the Tools sidebar, open Capture Information and drag a Form node onto the canvas. Connect Start to it.
  3. Click the Form node and click Add Field. Set Field Label to "Name", then in Store into click Create Variable and create SESSION.name. Add a second field, "Email", stored into a new SESSION.email. (The built-in VISITOR.* fields are read-only, so they don't appear in Store into.)
  4. From Actions, drag in Create or Update Lead and connect the Form to it. Set Name to {{SESSION.name}} and Email to {{SESSION.email}}.
  5. From Add Message, drag in Static Text and connect it last. Write: Thanks {{SESSION.name}}, we'll be in touch.
  6. Click Save.
  7. Click Test Flow, choose Manual Chat, click Start Test, and fill in the form as a visitor would.
  8. Click Publish. Only published workflows can be attached to an action.
  9. Go to Settings > AI Actions. On the Workflow card, click Create Action.
  10. Enter an Action Name with no spaces, for example collect_contact_details.
  11. Under Select Workflow, pick your workflow.
  12. In Description, say when to use it: "Use when the visitor asks to be contacted by our team." (You can put this in your base prompt in Settings > Model instead.)
  13. Save the action, then chat with your chatbot and ask to be contacted. The form should appear.

The last node has no outgoing connection, so the workflow ends there and the chatbot answers normally again.

Run a workflow without the AI deciding

A Workflow action has two optional switches. Force Trigger on Every Message runs the workflow on every message without the AI deciding. Force Trigger on Conversation Start runs it on the visitor's first message. Only one Workflow action per chatbot can have a force trigger on; turning it on for one action turns it off for the others.

How a workflow takes over the chat

When the chatbot decides a workflow fits the visitor's request, it hands the conversation to the workflow. The workflow follows your node connections exactly, then hands control back.

The chatbot hands the chat to the workflow, the workflow runs its nodes until it exits, then the chatbot takes over again with any saved VISITOR fields

A workflow exits when:

  • it reaches a node with no outgoing connection,
  • it reaches Close Conversation with no outgoing connection, or
  • an error happens that the workflow cannot handle.

After it exits, everything is cleared except VISITOR.NAME, VISITOR.EMAIL, VISITOR.PHONE and VISITOR.INFO saved with Create or Update Lead. A visitor can enter and leave workflows many times in one conversation.

Two examples

  • Support ticket: the visitor describes a problem, the chatbot starts the ticket workflow, AI Capture extracts the details, an API Call creates the ticket, a Wait node waits for the ticket number by webhook, Send Email confirms it, and the chat returns to normal.
  • Sign-in, then payment: see Using several workflows together.

The builder

Workflow Builder Interface Overview

AreaWhat it's for
Canvas (center)Drag nodes here and connect them. Every workflow starts at Start. A path that reaches a node with no outgoing connection exits the workflow.
Tools sidebar (left)All nodes, in five groups (below). Also opens the Variables manager.
Configuration panel (right)Settings for the selected node: prompts, URLs, fields, conditions, code.
Top toolbarFile (Import, Export, Clear Flow), Auto Prompt (AI builds or edits the flow), Test Flow, Save (draft), Publish.
Flow toolbar (bottom of canvas)Pointer and Pan modes, plus Text and Image annotations.

Annotations are notes for your team, such as "Retry once before escalating" or a screenshot of the expected screen. Visitors never see them.

Node reference

The five node groups in the Tools sidebar and what each node does

Settings many nodes share

  • Label: the node's name on the canvas, such as "API – Fetch User Profile".
  • Skip Response: see Skip Response. Off by default: the workflow waits for the visitor's reply before moving on.
  • Store Response To: a variable that receives the node's output, such as SESSION.answer.
  • Most text fields accept variables: type {{ to pick one.

Message nodes

AI Conversation

Sends an AI-written reply guided by your prompt. Use it whenever the wording should adapt to the conversation, or when the AI should run an action mid-flow.

SettingWhat it does
PromptInstructions for this reply.
ModelThe AI model. Default gpt-5.4-mini.
Temperature0–1. Lower is more focused.
Include Knowledge BaseLets the reply use your chatbot's knowledge base.
RAG EnhancementReranks knowledge-base results for accuracy. Costs extra credits.
AI ActionsActions available at this node: built-in ones (Google Search, Order Tracking, Appointment UI), custom API actions, browser actions on your website, and 833+ prebuilt MCP apps (Google Calendar, Slack, GitHub, Notion and more). Browser actions are offered only on your website and not with Silent Reply.
Store Response ToSaves the reply to a variable.
Store Action Result ToSaves an action's result for later nodes, such as SESSION.event_id.
Silent ReplyWrites the reply without showing it. Needs a Store Response To variable (the workflow can't be saved without one) and always turns on Skip Response.

Credits: message credits, the same as your main chatbot.

Example: chaining action results. To reschedule a calendar event: node 1 uses the Google Calendar MCP action to find the event and stores its id with Store Action Result To → SESSION.event_id. Node 2 deletes that event using SESSION.event_id in its prompt. Node 3 asks for the new time and creates the replacement event. (The AI Agent node can do this in one node.)

AI Agent

Runs an AI agent that works through a task on its own. You give it a goal, the tools it may use and the outcomes it can end with (its exits). It decides which tools to call, in what order and how often, when to ask the visitor for something, and which exit to take. Find it under Add Message, marked New.

Use it when one request needs several lookups and actions. "Can I still return my jacket? Order 4417" means finding the order, checking the return policy, starting the return and telling the visitor.

One node instead of a chain. Many tasks need one call to find an id and another to use it. With other nodes that is a chain: AI Conversation stores the id, Condition checks it, another AI Conversation uses it. With AI Agent you switch on the MCP tools it may use (up to 100 per node) and describe the goal. It reads each tool's description, calls them in the right order, and adjusts when a result is unexpected (two matches, or none) without a branch for each case.

Before: a chain of nodes passing an event id between them. After: one AI Agent node with Google Calendar MCP tools that called them in its own order

The AI Agent node on the canvas with its exits connected to other nodes, and what the visitor sees in the website chat while it works

SettingWhat it does
AI providerAnthropic (Claude) (default) or OpenAI (GPT). We pick and manage the exact models, including a smaller one for helper work such as condensing long tool results.
Response formatText-based or UI-based. UI-based shows only the finished reply as rich UI in the website widget; other channels get text. Replies saved with Store Response To or sent as Silent Reply stay text. UI-based adds the tokens to render the UI plus a flat UI charge per reply, and isn't available on HIPAA workspaces.
Agent PromptUp to 8,000 characters. The goal, persona and how to use the tools, such as "search first, then look up details with the id". Supports {{variables}}.
Include Knowledge BaseSearches the knowledge base with the visitor's message every turn, and lets the agent search again with its own wording.
RAG Enhancement (Reranking)Reranks each search. Each reranked search adds credits (the panel shows how many).
Additional ContextOptional, up to 4,000 characters. Facts the agent always knows, such as Visitor email: {{VISITOR.EMAIL}}. Variables are filled in fresh every turn.
ToolsWeb Search, Web Scraper, API Call, MCP (including prebuilt apps), Document, Order Tracking, and on your website Lead Form, Button, Appointment and browser actions (not with Silent Reply). Up to 100 can be on; each MCP tool counts as one. Switch tools off without deleting them.
ExitsAt least one. Each has a name (letters, digits, _ or -; else is reserved) and a description of when to take it, such as "The refund has been issued and confirmed to the visitor".
ElseAlways present. Taken when a cap is hit, credits run out or something fails. The visitor gets no message on this path, so connect it to a fallback.
Output VariablesOptional, up to 10. Filled when the agent takes an exit, each with a description such as "The Zendesk ticket id it created". Max 4,000 characters each.
Max credits per visitor turnOptional soft cap. The step that crosses it still finishes and is billed, then the agent leaves through Else. Empty means no cap.
Store Response ToOptional. Receives what the agent writes in a turn (its reply, or its exit message).
Skip ResponseOptional. The agent still picks an exit and the workflow continues along it right away. A reply with no exit waits for the visitor.
Silent ReplyOptional. Nothing the agent writes is shown (Chat Logs mark it as silent). Use it as a background step, such as researching with MCP tools for the next node. Runs one round, then follows the chosen exit or Else. Turns on Skip Response and needs an Output Variable or Store Response To.

How it runs. Each time the workflow reaches the node:

  1. The agent reads the conversation, your Agent Prompt, Additional Context and anything it found earlier in this conversation.
  2. It calls tools, one or several at a time, and sees each result before deciding the next step. Long results are condensed first, keeping every item with its IDs, links and numbers.
  3. If it needs something only the visitor knows (an order number, a choice), it asks, and the workflow waits on this node. When the visitor answers, it continues with its earlier results still in hand.
  4. When an exit applies, it takes it, optionally with a final message, fills the output variables, and the workflow follows that exit.

Safety rules

  • Web Scraper only opens URLs from the visitor's messages, your instructions or an earlier tool result, never links the agent made up.
  • Lead Form, Button and Appointment only exist in your website chat (widget, iframe and Workflow Studio). Once the visitor's lead details are known, Lead Form is no longer offered.
  • Each turn has a limit on steps and time. Reaching it sends the agent through Else.
  • exit_node, recall_memory and search_knowledge_base are reserved and can't be tool names.

What the visitor sees

  • Website chat: short progress steps ("Reviewing the request", "Checking relevant help documentation", "Searching the web", "Reading a web page", "Looking up information") that disappear when the reply is sent. A long reply, or an exit's final message on a node without output variables, appears as it's written; otherwise it appears when the step finishes. Forms, booking calendars and buttons appear right away.
  • WhatsApp, Messenger, Instagram, Telegram, LINE, Slack, Discord and WhatsApp Web: a normal message, plus any files the tools generate.

AI Agent vs AI Conversation

AI ConversationAI Agent
Steps per visitor messageOne reply, with up to one round of AI actionsAs many tool calls as the task needs, in any order
Knowledge baseRetrieved for every replySearched every turn, and again with the agent's own query when needed
Where the workflow goes nextIts single outgoing connectionThe exit the agent chooses, or Else
MemoryThe conversationThe conversation plus its earlier tool results
Pass data to later nodesStore Response To / Store Action Result ToOutput Variables filled on exit
BillingMessage credits per replyThe tokens each turn actually uses

Use AI Conversation for one focused reply. Use AI Agent for support tasks mixing your knowledge base with live data (orders, returns, bookings), lookups across MCP servers and APIs, replacing node chains that pass ids around, or routing (solved, needs a person, or another branch).

Credits: billed by the tokens each turn uses (every model call, condensing of long tool results, summaries of earlier steps), converted into message credits. Reranking adds credits per reranked search. The agent checks your balance before each step and leaves through Else if credits run out.

Debugging. In Test Flow or Chat Logs, click Debug on the AI Agent's Node Transition row. The Summary tab shows how the turn ended (for example Exited via "rescheduled", Replied — waiting for the visitor's next message, Stopped: credit cap for this turn reached, Stopped: not enough credits, Stopped: too many steps in one turn, Stopped: the turn took too long, Stopped: chose an exit that does not exist, Stopped: the AI model failed), every step in order with its knowledge-base searches and tool calls, and the credits and time per step with a total. Credentials in tool settings (API keys, tokens, secret URLs) are removed from debug information.

The AI Agent's settings and the step-by-step debug Summary

Example

Label: Front Desk Agent
Agent Prompt: You are the front-desk assistant for Bright Smile Dental. You help patients
  move their appointments in the clinic's Google Calendar. Find the patient's
  appointment before you change anything, ask which one if there are several, only offer
  free times between 9:00 and 17:00 on weekdays, and confirm the new time before changing it.
Tools: Google Calendar (MCP) with GOOGLECALENDAR_GET_CURRENT_DATE_TIME, GOOGLECALENDAR_FIND_EVENT,
  GOOGLECALENDAR_EVENTS_LIST, GOOGLECALENDAR_FIND_FREE_SLOTS, GOOGLECALENDAR_PATCH_EVENT
Exits:
  - rescheduled: The appointment has been moved and the new time confirmed to the patient
  - needs_person: The patient asks for a person, or needs something the agent can't do
Output Variables:
  - SESSION.new_time: The new appointment date and time
Connections:
  - rescheduled → Send Email (confirmation with {{SESSION.new_time}})
  - needs_person → Live Chat Escalation
  - Else → Live Chat Escalation

Dana writes: "Can you move my cleaning on Thursday to Friday afternoon?" The agent finds the event, checks Friday's free slots, offers two times, patches the event after Dana picks one, and takes rescheduled. Full walkthrough: Replace Node Chains With One AI Agent Node and MCP Tools.

Dynamic UI Composer

Has the AI build interactive visual pieces (forms, product cards, carousels, confirmations, tables, action buttons) instead of plain text.

Interactive Visual Responses

  1. Drag Dynamic UI Composer into your workflow.
  2. Optional: click UI Formats to describe the layout you want, such as "Product card with image, title, and price". Without it, the AI designs the UI from the conversation.
  3. In the prompt, say what to generate: "Create a product recommendation card based on the user's preference."
  4. Feed it data from a knowledge-base search, an API call or earlier steps.

To react to what the visitor clicks or submits, follow it with an AI Condition or AI Capture node.

Static Text

Sends a fixed message, optionally with a button. 0.1 message credits per run.

SettingWhat it does
Text ContentThe message. Supports {{variables}}.
Button Label / Button URLOptional button, such as "View Status". The URL supports {{variables}}.
Text Content: Thank you, {{VISITOR.NAME}}! Your application ID is {{SESSION.applicationId}}.
Button Label: View Status
Button URL: https://portal.example.com/status/{{SESSION.applicationId}}

Image, Video, Audio and File

Each sends one media item with an optional Message (caption). The URL can be fixed or built from variables. Each costs 0.1 message credits per run.

NodeURL settingTypical use
ImageImage URLLogos, diagrams, QR codes or charts from an API
VideoVideo URLTutorials, product demos
AudioAudio URLVoice messages, recorded instructions
FileFile URLPDFs, spreadsheets, generated reports
Image URL: https://api.qr-server.com/v1/create-qr-code/?data={{SESSION.ticket_url}}&size=300x300
Message: Scan this QR code to access your ticket

Shows several cards, each with media, a title, a description and an optional button. The full carousel appears in the website widget and iframe; on other channels the media and buttons are sent separately (see Website vs other channels).

Manual (default)AI
CardsYou define a fixed number of cards. Every field accepts {{variables}}.The AI decides how many cards and what's on them, within your limits.
SettingsMessage (intro text); per card: Title, Description, Type (image, video, audio or file), URL, Button Label, Button URLPrompt; Model (default gpt-5.4-mini); Data Source: Knowledge Base (with optional RAG Enhancement, 1 extra credit per message) or Custom (your own text, such as {{SESSION.search_results}}); Generate Message (off by default); Card Types; per type Max Cards and Available Fields (url, description, title, buttonLabel, buttonUrl)
Good forA known set of plans, services or menu optionsRecommendations or search results that vary
Credits0.1 message credits per runMessage credits, like AI Conversation
AI mode example
Prompt: Generate product cards for items that match the user's interest in {{SESSION.product_category}}.
Data Source: Knowledge Base, RAG Enhancement on
Generate Message: Yes
Card Types: image (Max Cards: 5, all fields)

Capture nodes

Form

Shows a form. Each field saves its answer into a variable. 0.1 message credits per run.

SettingWhat it does
Title / MessageHeading and optional intro text.
Add FieldEach field has a Field Label, Field Type, optional Placeholder, Required field, and Store into (a variable starting with VISITOR. or SESSION.).
Field typestext, textarea, select (needs options), checkbox-group (needs options; Allow multiple permits several choices)
Mandatory / Mandatory MessageWhether the visitor must complete the form before going on, and the message shown if they try to skip.
Continue after submissionMoves on right after submit. Otherwise the workflow waits for the next message.

Form answers live in variables and are cleared when the workflow ends. To keep them, pass them to the Name, Email, Phone or Info fields of Create or Update Lead before the workflow exits; the lead keeps them as VISITOR.NAME, VISITOR.EMAIL, VISITOR.PHONE and VISITOR.INFO.

AI Capture

Has the AI pull specific details out of what the visitor wrote, such as an order number, or turning "tomorrow at 3pm" into a date. Costs message credits per run, however many fields.

SettingWhat it does
AI ModelThe model used for extraction.
Data SourceConversation, Knowledge Base (with optional RAG Enhancement (Reranking)) or Custom.
FieldsEach has a Description of what to extract and a Store into variable.

Extract related details in one AI Capture node rather than several:

- Description: Extract the user's order number (format: ORD-XXXXX) → SESSION.order_number
- Description: Extract the issue description or complaint → SESSION.issue_description
- Description: Extract the preferred resolution date in YYYY-MM-DD format → SESSION.preferred_date

Static Capture

Saves the visitor's last message, word for word, into a variable (Variable Path). Only text is supported. 0.1 message credits per run. You can also read the last message directly from SESSION.LAST_USER_INPUT_TEXT.

Geolocation

Asks the visitor's browser for their location and saves it to VISITOR.LATITUDE and VISITOR.LONGITUDE.

  • Web only. On WhatsApp, Messenger and other non-web channels it goes straight to the Error path. In an iframe, the embedding page must include allow="geolocation".
  • Timeout (ms): how long to wait for the browser (1,000–120,000; default 10,000) before taking the Error path.
  • Enable high accuracy (on by default): more precise, but can take longer and use more battery on phones.
  • Browsers may remember an earlier "deny" and refuse without asking again.

Logic nodes

Condition

Splits the workflow into branches. An Else path is always added. Connect every branch, including Else: an unconnected branch ends the workflow.

ModeHow it decidesCredits
AIYou give Context and a list of outcomes (such as "User wants refund"); the AI picks one. Good for intent and sentiment.Message credits
ManualRule groups. Each has a Name, a Match Type (all = AND, any = OR) and expressions: Left Value, Operator, Right Value. Good for exact values and thresholds.0.1 message credits per run

Manual operators: =, !=, >, <, >=, <=, contains, starts_with, ends_with, is_empty, is_not_empty.

Condition Node with Multiple Branch Paths

Manual example
Condition 1 "Premium User Check" (all):
  {{VISITOR.subscription_tier}} = premium
  {{VISITOR.EMAIL}} is_not_empty
Condition 2 "Trial User Check" (all):
  {{VISITOR.subscription_tier}} = trial

Manual conditions compare by variable type, so set types correctly (see Variable types).

Validate

Checks that a value is a valid email, phone or matches a regex (Regex Pattern, such as /^ORD-\d{6}$/). Value to Validate can mix text and variables, such as +1{{VISITOR.areaCode}}{{VISITOR.PHONE}}. Two paths: Success and Fail. 0.1 message credits per run.

Wait

Pauses the workflow for a set time, or until your system calls a webhook. 0.1 message credits per run.

Wait TypeDuration meansPaths
timeHow long to pause, in secondsSuccess
webhookHow long to wait before giving up (1–172,800 seconds)Success (webhook received) and Timeout

The maximum wait depends on where the visitor is chatting:

ChannelLongest waitWhy
Website widget, iframe and API30 secondsThe reply must finish within the web request.
WhatsApp Business1 day (86,400 s)Meta only allows automated messages within 24 hours of the visitor's last message; longer waits may fail to deliver.
Messenger, Instagram, Telegram, Discord, Slack, WhatsApp Web2 days (172,800 s)Messages can be sent later, after the first request ends.

For anything longer than a few seconds on your website, use a webhook wait. If the workflow runs on several channels, design for the shortest limit.

Wait Node Webhook Configuration

Webhook waits

  1. Set Wait Type to webhook and copy the URL from the node's Webhook URL field (Copy Webhook URL). It looks like https://<your Chat Data domain>/api/v1/chatbot/workflow/events/{workflowId}?conversationId={conversationId}.
  2. Your system replaces {conversationId} with the real conversation ID. It can get it from the conversation_id field of these webhook events: chat, live-chat-escalation, user-online and user-offline.
  3. Under Webhook Capture, map payload fields to variables with a JSON Path ($.field, $.nested.field, $.array[0], $.data.items[2].name) and a Store Into variable.
  4. Always connect the Timeout path (for example: apologize and escalate).
Payment example
1. Form collects payment details
2. API Call to the payment gateway → returns payment_intent_id
3. Wait (webhook), Duration 3600
   Webhook Capture: $.status → SESSION.payment_status, $.transaction_id → SESSION.transaction_id
4a. Success → Condition: SESSION.payment_status = "completed" → Send Email → Create or Update Lead
4b. Timeout → apology message → Live Chat Escalation

Your payment system then calls:

curl -X POST \
  'https://app.example.com/api/v1/chatbot/workflow/events/wf-12345?conversationId=conv-abc123' \
  -H 'Content-Type: application/json' \
  -d '{"status": "completed", "transaction_id": "txn_987654321", "amount": 99.99}'

Webhook security

Workflow webhooks are not validated yet (secret validation is planned). Keep your workflow IDs private, or check the payload in the workflow itself.

Advanced nodes

API Call

Calls an external API. 0.1 message credits per run.

SettingWhat it does
MethodGET, POST, PUT, DELETE or PATCH
URL / HeadersEndpoint and headers. Both accept {{variables}}.
Body Typeapplication/json, application/x-www-form-urlencoded or multipart/form-data
Body ParametersKey/value pairs for POST, PUT and PATCH
Response CaptureSaves response fields to variables with a JSON Path (such as $.data.user.id) and Store Into

Two paths: Success (HTTP 2xx) and Error (4xx or 5xx). Use Test Request in the panel to try the call with your variables' default values.

API Call Node Success and Error Paths

Method: POST
URL: https://api.example.com/v1/users
Headers: Authorization = Bearer {{SESSION.api_token}}
Body Parameters: email = {{VISITOR.EMAIL}}, name = {{VISITOR.NAME}}
Response Capture: $.data.user_id → SESSION.user_id

Code

Runs your own JavaScript or Python for calculations, data formatting or rules other nodes can't express. 0.1 message credits per run.

  • Limits: 10 seconds, limited memory, no network requests (use API Call) and no file access.
  • Paths: Success when the code returns {success: true}; Fail when it throws or returns {success: false}.
FunctionWhat it does
getVariable('NAME')Reads a variable (null if not found)
setVariable('NAME', value)Writes a variable
returnValue({success: true/false, ...})Returns data and picks the path
console.log(...)Writes to SESSION.LAST_CODE_OUTPUT

After it runs, SESSION.LAST_CODE_RETURN, SESSION.LAST_CODE_OUTPUT and SESSION.LAST_CODE_ERROR hold the return value, log output and error (max 5,000 characters each).

// Eligibility score
const income = getVariable('SESSION.annual_income') || 0;
const creditScore = getVariable('SESSION.credit_score') || 0;
const total = (income >= 50000 ? 35 : income >= 30000 ? 20 : 0)
  + (creditScore >= 700 ? 40 : creditScore >= 650 ? 25 : 10);

setVariable('SESSION.eligibility_score', total);
console.log(`Total: ${total}`);
returnValue({ success: total >= 70, score: total });

Set

Assigns values to variables without code, such as a flag (SESSION.is_authenticated = true), a default value, or a combination like {{VISITOR.EMAIL}} - {{VISITOR.PHONE}}. 0.1 message credits per run.

Action nodes

Create or Update Lead

Saves the visitor as a lead so the data is available in future conversations and workflows. This is the only way to keep custom data after a workflow exits. 0.1 message credits per run.

  • Settings: Email, Phone, Name and Info (up to 10,000 characters). All accept {{variables}}.
  • What it does: creates a lead, or updates the existing one when the email or phone matches; fills VISITOR.NAME, VISITOR.EMAIL, VISITOR.PHONE and VISITOR.INFO; makes them available to later workflows and the base chatbot; and updates the visitor details in Live Chat.
Email: {{VISITOR.EMAIL}}
Name: {{VISITOR.NAME}}
Info: {"auth_token": "{{SESSION.api_token}}", "auth_expires": "{{SESSION.token_expiration}}", "authenticated_at": "{{SYSTEM.TIMESTAMP}}"}

Send Email

Sends an email. Uses 1 email credit per send.

SettingWhat it does
Subject, Recipients, CC, BCC, Reply ToAll accept {{variables}}.
Email Body Typeplain or html
Email BodyThe content. Accepts {{variables}}.
Send Test EmailSends a test copy.

If you have no email credits left, the email isn't sent and the workflow carries on to the next node with no error. Email credits come with your live chat plan; contact Chat Data to buy more.

Live Chat Escalation

Hands the conversation to your team (a human agent) using your live chat escalation settings, with an optional Message to the visitor such as "I'm connecting you with a member of our team." 0.1 message credits per run.

It sends the same email, Zendesk and webhook notifications as the base chatbot, and the conversation appears in your Live Chat inbox. The workflow does not pause here: it continues to the next node. To end the workflow after escalating, leave this node without an outgoing connection.

Close Conversation

Closes the chat so the visitor can't send more messages. No settings. 0.1 message credits per run.

  • Works only in the Chat Data website widget and iframe. WhatsApp, Messenger, Instagram, Telegram and other channels ignore it; visitors there can always write unless you blocklist them.
  • Closing the chat is separate from exiting the workflow. The workflow exits when it reaches a node with no outgoing connection.

Credits by node

Nodes without AI cost 0.1 message credits each time they run. AI nodes charge for their AI work instead.

NodeCredits
AI ConversationMessage credits, same as the main chatbot
AI AgentMessage credits for the tokens each turn uses; reranking adds credits per reranked search
AI CaptureMessage credits per run, regardless of field count
Condition (AI mode)Message credits per decision
Carousel (AI mode)Message credits
Send Email1 email credit per send; no error if you have none left
Static Text, Image, Video, Audio, File, Carousel (Manual mode)0.1 message credits per run
Form, Static Capture, Set, Validate, Wait, Condition (Manual mode)0.1 message credits per run
API Call, Code0.1 message credits per run
Create or Update Lead, Live Chat Escalation, Close Conversation0.1 message credits per run

Check your chatbot's credit usage in the dashboard after a workflow goes live.

Skip Response

Message nodes (AI Conversation, Static Text, Image, Video, Audio, File, Carousel) and the Form node have a Skip Response switch.

Skip ResponseWhat happensUse it for
Off (default)Sends the message, then waits for the visitor's reply before moving on.Questions, forms, menus: anywhere the reply decides what's next
OnSends the message and moves on immediately.Intros, several images in a row, messages that need no answer

Example: Static Text "Let me show you our three service tiers." (Skip Response on) → Carousel of plans (Skip Response off, so the visitor can choose).

Variables

Variables are the workflow's memory. Every name starts with SYSTEM., SESSION. or VISITOR.. The prefix only organizes them; by convention SESSION. holds temporary data, VISITOR. holds data about the visitor and SYSTEM. holds settings.

What survives after the workflow ends

Only VISITOR.NAME, VISITOR.EMAIL, VISITOR.PHONE and VISITOR.INFO persist, and only when saved with Create or Update Lead. Every other variable, whatever its prefix, is cleared when the workflow exits.

Built-in variables

These are filled in automatically. You can read them but not write them.

VariableTypeContains
SYSTEM.TIMESTAMPdateThe time the node runs
SESSION.CONVERSATION_IDstringThe conversation's ID
SESSION.LAST_RESPONSEstringThe latest AI-written reply in the workflow
SESSION.LAST_USER_INPUT_TEXTstringThe visitor's latest message
SESSION.LAST_USER_INPUT_FILESJSONName, url and type of the visitor's latest uploaded files
SESSION.LIVE_CHAT_ADMIN_URLstringLink for your team to open this conversation in Live Chat
SESSION.LIVE_CHAT_CLIENT_URLstringLink for the visitor to open this conversation in Live Chat
SESSION.LAST_CODE_RETURNnumberReturn value of the latest Code node (max 5,000 characters)
SESSION.LAST_CODE_OUTPUTstringLog output of the latest Code node (max 5,000 characters)
SESSION.LAST_CODE_ERRORstringError from the latest Code node (max 5,000 characters)
VISITOR.NAME, VISITOR.EMAIL, VISITOR.PHONEstringThe visitor's contact details
VISITOR.INFOstringExtra visitor data, often a JSON string (max 10,000 characters)
VISITOR.LATITUDE, VISITOR.LONGITUDEnumberLocation captured by the Geolocation node

Creating custom variables

Open Variables in the Tools sidebar.

Variable Manager Interface

FieldWhat to enter
NameA prefix plus a snake_case name, such as SESSION.eligibility_score. Be descriptive (SESSION.api_response_data, not SESSION.data) and don't reuse a built-in name.
Typestring, number, boolean, date or JSON
Default ValueUsed when testing, and as a fallback if nothing sets it
DescriptionWhat the variable is for
  • Use variables in most fields by typing {{, which lists every variable by category: Hello {{VISITOR.NAME}}, your score is {{SESSION.eligibility_score}}.
  • Rename a variable and every reference in every node updates.
  • Delete unused ones; the manager shows how many are unused.

Variable types

Manual Condition nodes compare by type, so the wrong type breaks them:

VariableCondition {{SESSION.is_approved}} = true
type string, value "yes" or "true"Fails
type boolean, value trueSucceeds

Imported workflows set every variable to string, so check types after importing.

Keeping data between workflows

Save only what you need later (sign-in tokens and expiry, preferences, lead qualification), not temporary values.

  1. Put the data into VISITOR.INFO as JSON. In a Code node:
    setVariable('VISITOR.INFO', JSON.stringify({
      token: getVariable('SESSION.api_token'),
      expiresAt: getVariable('SESSION.token_expiration')
    }));
    
  2. Run Create or Update Lead with Info set to {{VISITOR.INFO}}.
  3. In a later workflow, read it back:
    const auth = JSON.parse(getVariable('VISITOR.INFO') || '{}');
    const valid = auth.token && new Date(auth.expiresAt) > new Date();
    setVariable('SESSION.is_authenticated', valid);
    returnValue({ success: valid });
    

Uploaded files. SESSION.LAST_USER_INPUT_FILES holds a JSON list such as [{"name": "resume.pdf", "url": "https://...", "type": "application/pdf"}]. In a Code node, JSON.parse(getVariable('SESSION.LAST_USER_INPUT_FILES') || '[]') gives you the list.

Website vs other channels

Website widget and iframeWhatsApp Business, WhatsApp Web, Messenger, Instagram, Telegram, Discord, Slack
Longest wait30 seconds2 days (1 day on WhatsApp Business)
CarouselFull scrolling carousel with inline media and buttonsMedia and buttons sent separately; buttons may become text links; some media types may not be supported
Close ConversationWorksIgnored
Best forShort, interactive flows with instant API repliesLong-running flows with webhook waits or follow-ups hours or days later

If you serve several channels, test the workflow on each one.

Let AI build the workflow (Auto Prompt)

Click Auto Prompt in the top toolbar.

On an empty canvas, it builds a new workflow:

  1. Describe it in detail: "Create a loan application workflow. Collect name, email, income and employment status in a form. If income is over $50k and they're employed full-time, call our API and send a confirmation email. Otherwise explain why and offer to book a call with a loan officer."
  2. Review the outline it proposes (nodes and decision points).
  3. Give feedback if needed: "Add a phone field. After the API call, wait for a webhook before sending the email."
  4. Let it generate the nodes, connections and variables.

On an existing workflow, describe one change at a time and say where it goes: "Add a fallback when the payment API fails: apologize and escalate to live chat."

AI-built workflows can be wrong. Afterwards, check every prompt, URL and credential, fix variable types in the Variable Manager, adjust the wording to your brand, and test every path.

Import, export and clear

Under File in the top toolbar:

  • Export downloads a JSON file with all nodes, connections and custom variables. Use it for backups, to share with your team or copy to another chatbot, or to keep versions.
  • Import recreates nodes, connections and variables from a JSON file and keeps (or adds) the Start node. Imported variables are all type string: open the Variable Manager, fix the types and default values, then test.
  • Clear Flow removes every node except Start. It can't be undone, so export first.

Test your workflow

Click Test Flow, pick a mode, then click Start Test. You can start with visitor details (name, email, phone) or leave them blank.

ModeWhat it doesLimits
Manual ChatYou play the visitor: send messages, fill in forms, upload files.None
AI SimulationThe AI plays the visitor from a persona you write in AI User Prompt, and warns you if the workflow loops on the same branch.Can fill in forms but can't upload files; may miss edge cases

Example persona: "A self-employed customer with a $45,000 income who wants a premium loan. They should fail the eligibility check."

Debug what happened. The test timeline lists each node that ran. Hover a message or transition to highlight its node on the canvas; click it to see the node's settings, variable values, API request and response, condition logic and code output at that moment.

Testing Interface with Debug Timeline

Testing Interface with Debug Details

Presets save visitor details, pre-filled variable values and AI personas so you can rerun the same scenarios after every change, for example "Eligible customer" (SESSION.annual_income: 75000) and "Ineligible customer" (SESSION.annual_income: 35000).

The same debug view is available for real conversations in Chat Logs.

Transition debug info opened from a Node Transition in Chat Logs, showing the API call's request, response and variables

Publish and connect your workflow

  1. Click Save, test, and fix any warnings the builder shows.
  2. Click Publish. Draft workflows can't be selected in an action.
  3. Go to Settings > AI Actions and click Create Action on the Workflow card (or edit an existing Workflow action).
  4. Fill in Action Name, Select Workflow and Description, then save.
  5. Tell the chatbot when to run each workflow, in the action's Description or in your base prompt:
- trigger_authentication_workflow: Use when the user wants to view account details or make
  a payment and VISITOR.INFO has no valid auth token.
- trigger_payment_workflow: Use when a signed-in user wants to make a payment.
- trigger_ticket_workflow: Use when the user has a complex issue that needs a support ticket.

You can't delete a workflow while an AI action uses it. Remove or change the action first.

Using several workflows together

The base chatbot can chain workflows, using VISITOR.INFO to remember what happened. Here a visitor asks to pay before signing in:

The chatbot checks VISITOR.INFO for a valid token; if there is none it runs the sign-in workflow first, which saves the token, then runs the payment workflow

  1. The sign-in workflow collects credentials, calls your auth API, stores the token and expiry in VISITOR.INFO, and runs Create or Update Lead.
  2. Back in the base chatbot, VISITOR.INFO now has a valid token, so it runs the payment workflow.
  3. The payment workflow reads the token, sends it in the payment API's headers, updates VISITOR.INFO with the confirmation, and runs Create or Update Lead.
  4. The chatbot confirms the payment and asks if the visitor needs anything else.

If the token later expires, the chatbot runs the sign-in workflow again.

Best practices

  • Start small. Build the shortest working version, test it, then add one branch at a time.
  • Name things clearly. Labels like "Condition – Check Eligibility"; no "Node 1" or SESSION.data.
  • Connect every path: API Call Success/Error, Code Success/Fail, Validate Success/Fail, Wait Success/Timeout, every Condition branch plus Else, AI Agent Else. For example, API error → "Unable to fetch your data. Please try again later." → Live Chat Escalation.
  • Document on the canvas with annotations, and export the JSON to keep versions or share for review.

Before publishing, check:

  • every path tested by hand, plus AI Simulation with a few personas
  • variable types in the Variable Manager
  • API URLs and credentials, and Send Email addresses
  • wait times within the channel limits
  • file uploads, if the workflow uses them
  • what you save with Create or Update Lead
  • the action Description or base prompt that triggers the workflow

After launch: read the first 10–20 real conversations in Chat Logs (hover a message to see its node, click for details), watch message and email credit use, look for error paths being taken, and check whether escalations to your team were needed.

Related: AI Actions · AI Agent mode · Replace Node Chains With One AI Agent Node and MCP Tools

Frequently Asked Questions

How do workflow AI actions differ from normal chatbot replies or simple AI actions?

Workflows can hold state across multiple steps, call APIs in sequence, wait for webhook callbacks or external events, and persist important lead data across conversations, which goes beyond one-off AI responses.

What is the normal lifecycle for creating and using a workflow?

You create the flow in Settings > Workflows, test it, publish it, then add it as a Workflow action in Settings > AI Actions and tell your chatbot (in the action description or your base prompt) when it should trigger that workflow.

What tools are available inside the workflow builder?

The builder includes a canvas, a tools sidebar, a configuration panel, and a top toolbar. The node categories shown on the page include message nodes, capture nodes, actions, logic nodes like Condition and Wait, and advanced nodes such as API Call, Set, and Code.

What does the Wait node support in workflows?

The guide says Wait can pause for time-based delays or webhook callbacks, which makes it useful for things like payment confirmations, approval flows, and other event-driven procedures.

Previous
AI Agent Mode