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.

Example: message text through an HTTP call
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.

VariableValue
{{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.
A scheduled automation with target set to "none" (no contact, not tied to any conversation) only gets {{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

trigger

Marks 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

sendMessage

Sends 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

sendInteractive

Sends 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

sendTemplate

Sends 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

sendWaFlow

Sends 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

openAi

Chat-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

openRouter

Same 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

anythingLlm

Calls 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

webScrape

Fetches 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

browserAgent

Agentic 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.

HTTP Request body
{"message": "{{message_text}}", "phone": "{{contact_phone}}"}

Condition

condition

Branches 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

setVariable

The 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

delay

Pauses 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

httpRequest

Calls 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

assignAgent

Hands 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

addTag

Adds 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

requestCallback

Pauses 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

end

Explicitly 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.