Automations · Node reference
Every automation node, and the variables it uses
The visual automation builder has 18 node types across 6 categories. This page covers what each one does, its config fields, and, for every field that takes a {{variable}}, exactly which variables are available by default and which ones a given node hands off to the rest of the run.
How variables work
Any field marked {{variable}}-interpolated below will substitute a variable's value wherever {{variableName}} appears in the text. Only variables that actually exist for the run get replaced; an unknown name is left in the output as the literal text {{like_this}}, which is usually the first sign something is mistyped or hasn't been set yet.
A small number of fields (Condition's message/variable checks, the AI nodes' input variable setting) read a variable directly by name instead of via {{}} syntax. Those are called out per-node below as "Reads".
Variables flow forward through a run: a value written by one node is available to every node that runs after it (not before). Use Set Variable to create your own, or read what each node writes automatically in the reference below.
1. Trigger (message_received)
2. Set Variable order_id = "{{message_text}}" (interpolates message_text)
3. HTTP Request POST https://api.example.com/orders/{{order_id}}
-> writes {{httpResponse}}, {{httpResponse_status}}, {{httpResponse_ok}}
4. Condition httpResponse_status equals 200
5. Send Message "Found it: {{httpResponse}}"Default variables
These exist automatically at the start of every run that has a real conversation attached, no Set Variable node required.
| Variable | Value |
|---|---|
| {{message_text}} | The text of the message that triggered this run. Empty string on a scheduled run with no triggering message. |
| {{contact_name}} | The contact's saved name, or empty string if unset. |
| {{contact_phone}} | Full E.164 phone number, e.g. +919876543210. |
| {{contact_phone_short}} | Last 10 digits of the phone number. |
| {{contact_tags}} | The contact's tags, comma-separated. |
| {{wa_number_displayname}} | Display name of the WhatsApp number the conversation is on. |
| {{wa_number_phone}} | The WhatsApp number itself. |
| {{timestamp}} | Scheduled triggers only: ISO timestamp of when the run fired. |
{{timestamp}}. None of the contact_* or wa_number_* variables are available, since there is no contact or WhatsApp number to read them from.Triggers
Trigger
triggerMarks the start of the automation. Every automation has exactly one. Real matching against inbound messages happens before the run starts, not inside this node.
Config
- Trigger type: message_received (any inbound message), keyword_match (comma-separated keyword list, case-insensitive substring match), or scheduled (cron expression + timezone)
- Channel: WhatsApp, Instagram, or both (default WhatsApp only)
- Scheduled only: cron expression, timezone, target (none / a number / a tag / all contacts), whether to run even if an agent has taken over the conversation
Reads
Nothing (no text fields to interpolate).
Writes
Nothing into {{variables}}. (The old conversation_started trigger type was removed; publishing a flow that still uses it is blocked.)
Messaging
Send Message
sendMessageSends a plain outbound WhatsApp text. Skipped automatically if the contact has the dnd tag or the conversation is on a non-WhatsApp channel.
Config
- Message text
Reads
Any variable, via {{variable}} in the message text.
Writes
Nothing.
Send Interactive
sendInteractiveSends a button, list, or CTA-URL interactive message. Same dnd/channel guard as Send Message.
Config
- Type: button (1-3 reply buttons), list (sections of rows), or cta_url (one button that opens a link)
- Body, header, footer text
- Buttons / list sections / CTA display text + URL, depending on type
Reads
Any variable, via {{variable}} in body/header/footer/button/CTA text.
Writes
Nothing. Button taps and list selections come back later on the webhook path, not into this run.
Send Template
sendTemplateSends a Meta-approved template. Handles the marketing-throttle check and FLOW-button token injection automatically.
Config
- Template name + language
- Template variables (mapped to {{1}}, {{2}}, ... slots)
- Template category
Reads
Any variable, used to fill the numbered template slots.
Writes
Nothing.
Send WhatsApp Flow
sendWaFlowSends a published WhatsApp Flow (native in-chat form) to the contact.
Config
- WhatsApp Flow to send
- Body text
- CTA button text
Reads
Any variable, via {{variable}} in body/CTA text.
Writes
Nothing. Form submissions arrive later on the webhook path, not into this run.
AI / LLM
Bring your own OpenAI, OpenRouter, or AnythingLLM API key. See AI automation (BYOLLM) for the product overview.
OpenAI
openAiChat-completion call to OpenAI. Supports conversation history, JSON-mode/schema responses, and OpenAI-style function calling.
Config
- API key, model (default gpt-4o-mini)
- System prompt ({{variable}}-interpolated)
- Input variable to read as the user turn (default message_text)
- Response variable name to store the reply under (default aiResponse)
- Temperature, max tokens, include-history + history limit
- Response format (text / JSON object / JSON schema), and optional tool definitions + tool choice
Reads
Any variable in the system prompt. Reads its configured input variable for the user turn (falls back to the raw incoming message if that variable is empty).
Writes
{{responseVariable}} (reply text), {{responseVariable}}_full (raw API response), and when a tool call happens: {{responseVariable}}_toolCalls, {{responseVariable}}_toolName, and {{responseVariable}}_<argument> for each argument of the first tool call.
OpenRouter
openRouterSame mechanics as OpenAI, routed through OpenRouter (default model claude-3.5-sonnet). Use it to reach non-OpenAI models with the same node.
Config
- Same fields as OpenAI, plus your OpenRouter API key
Reads
Same as OpenAI.
Writes
Same as OpenAI.
AnythingLLM
anythingLlmCalls a self-hosted AnythingLLM workspace chat endpoint. For teams running their own model behind AnythingLLM instead of a hosted API.
Config
- Server URL, API key, workspace name, mode (default chat)
- Input variable to read as the user turn (default message_text)
- Session variable (default conversationId, so history stays scoped per conversation)
- Response variable name (default aiResponse)
Reads
Reads its configured input variable, falling back to the raw incoming message if unset.
Writes
{{responseVariable}} (reply text) and {{responseVariable}}_full (raw response).
Browser
Web Scrape
webScrapeFetches a URL and extracts content, either via Jina Reader (clean markdown) or raw fetch + CSS selectors.
Config
- URL ({{variable}}-interpolated)
- Mode: jina or selectors
- CSS selectors (comma-separated, selectors mode only)
- Extract as text or HTML, timeout, response variable name (default scrapedContent)
Reads
Any variable, via {{variable}} in the URL.
Writes
{{responseVariable}}: a markdown string (jina mode) or a map of selector to extracted text/HTML (selectors mode).
Browser Agent
browserAgentAgentic browser automation: drives a real headless browser via an LLM tool-calling loop to complete a described task (fill a form, click through a flow, read a dynamic page).
Config
- LLM base URL, API key, model
- Prompt describing the task ({{variable}}-interpolated)
- Timeout (capped 300s), max iterations (capped 50)
- Response variable name (default browserResult)
Reads
Any variable, via {{variable}} in the prompt.
Writes
{{responseVariable}} (final result text), {{responseVariable}}_iterations, {{responseVariable}}_tokens.
Logic
Set Variable's value field interpolates other variables, so Order {{order_id}} for {{contact_name}} works there too, not just in message/HTTP nodes.
{"message": "{{message_text}}", "phone": "{{contact_phone}}"}Condition
conditionBranches the automation down a "yes" or "no" path.
Config
- Contains / equals / regex, compared against the incoming message text directly
- or Variable check: pick a variable, an operator (equals, not equals, greater than, less than, contains), and a value to compare against
- or Not empty: branches on whether a variable has a value
Reads
The incoming message text directly for message-based checks, or a named variable directly for variable checks. Neither uses {{}} syntax since there is no free-text field here.
Writes
Nothing.
Set Variable
setVariableThe general-purpose way to create or overwrite a variable. Use it to save a value for later nodes, or to compose a new value out of existing variables.
Config
- Variable name
- Value ({{variable}}-interpolated)
Reads
Any variable, via {{variable}} in the value field.
Writes
The variable you name, set to the interpolated value.
Delay
delayPauses the automation for a duration. Short delays block inline; longer ones suspend the run and resume it later via a background job, so the flow doesn’t tie up a worker while it waits.
Config
- Duration (number)
- Unit: seconds, minutes, hours, or days
Reads
Nothing (no text fields).
Writes
Nothing.
Actions
HTTP Request
httpRequestCalls any external HTTP endpoint. The general escape hatch for anything the built-in nodes don’t cover: your CRM, a booking system, an internal API.
Config
- Method (default GET), URL ({{variable}}-interpolated)
- Headers (key/value pairs, values {{variable}}-interpolated)
- Body ({{variable}}-interpolated, sent for POST/PUT/PATCH)
- Timeout (default 30000ms), response variable name (default httpResponse)
Reads
Any variable, via {{variable}} in the URL, header values, or body.
Writes
{{responseVariable}} (parsed JSON if the response is JSON, otherwise raw text), {{responseVariable}}_status (HTTP status code), {{responseVariable}}_ok (true for 2xx).
Assign Agent
assignAgentHands the conversation to a human agent (round-robin, least-busy, or a specific person), turns on human handoff, and stops the automation for this conversation.
Config
- Strategy: specific, round_robin, or least_busy
- Agent (for the specific strategy)
Reads
Nothing (no text fields).
Writes
Nothing into {{variables}}, but it does flip the conversation to human handoff, which is what actually silences the bot.
Add Tag
addTagAdds one or more tags to the contact. Duplicate tags are deduped automatically.
Config
- Tags (comma-separated)
Reads
Nothing (tags are not {{variable}}-interpolated, so you can’t build a tag name dynamically today).
Writes
Nothing into {{variables}}.
Pause for Callback
requestCallbackPauses automation on this conversation for a set number of hours without a full human takeover, e.g. "an agent will call you back within 24h, don’t auto-reply in the meantime."
Config
- Duration in hours (default 24, capped at 720 / 30 days)
Reads
Nothing (no text fields).
Writes
Nothing into {{variables}}.
End
endExplicitly ends the automation run. Automations also end implicitly when a path runs out of connected nodes; use this when you want the stop to be visible on the canvas.
Reads
Nothing.
Writes
Nothing.