Automations

Visual playbooks that actually branch

Chain triggers, filters, HTTP calls, quick-reply buttons, and agent hand-offs on a live canvas. Each button in a quick-reply message becomes its own output — the flow continues down whichever branch the customer picked.

#The editor

Every automation is a graph of nodes connected by edges. A node is either a trigger (starts the flow), an action (does something), or a condition (branches). Open the editor at/dashboard/automations/<id>.

Basics

  • Click + Add node to open the palette; nodes are grouped by channel (WhatsApp / Instagram / Generic).
  • Drag from a source handle (right side of a node) to a target handle (left side of another) to create an edge.
  • Click a node to open its config panel on the right.
  • Toggle Active in the top-left to enable / disable the automation without deleting it.
  • Hit Save (top-right) to persist changes. Nothing runs until you save.

#Triggers

A trigger listens for a specific event. Every automation needs at least one.

TriggerFires onConfig
WhatsApp · KeywordInbound WA DM matching keyword rulesinstanceId (or any), keywords, matchMode, caseSensitive
WhatsApp · Any MessageEvery inbound WA DMinstanceId (or any)
WhatsApp · New ContactFirst message from a phone we haven't seeninstanceId (or any)
Instagram · DMInbound IG DM — filter by keyword or anyaccountId, filterMode (any/keyword), keywords
Instagram · New ContactFirst IG DM from a new IGSIDaccountId
Instagram · PostNew comment on a selected postaccountId, mediaId (or any), keywords (optional)

Match modes for keyword triggers

  • contains (default) — the message contains the keyword anywhere.
  • exact — the whole message equals the keyword (trimmed).
  • starts — the message starts with the keyword.
  • regex — the message matches the JavaScript regex you entered.

Multiple keywords go on one line, comma-separated. Any match fires the trigger.

#Actions

Actions do work. Wire an action node after a trigger — or after another action — via edges.

ActionPurpose
WhatsApp · Send MessageSend text (with optional media) via the current WA instance.
WhatsApp · Send PollSend a native poll with 2–12 options — each option becomes a branch handle.
Instagram · Send DMSend a text / media / quick-reply DM. Each quick-reply becomes a branch handle.
Instagram · Reply CommentPost a public comment reply.
Instagram · Hide CommentHide the triggering comment.
Instagram · Delete CommentDelete the triggering comment.
AI Agent ReplyRoute this trigger to a specific AI agent — overrides the channel default.
Add TagTag the CRM contact for later filtering.
Set User FieldSave a value on a custom contact field.
HTTP RequestCall any external API. Store the response in a variable for downstream nodes.
Wait / DelaySleep for N seconds inside the flow.
ConditionBranch true/false on a message/tag/status check.

#Variables in text fields

Every text field in every action supports variable placeholders. The chip palette above each input shows what's available for that specific node — click a chip to insert it at the caret.

From the trigger

Depending on the upstream trigger, these placeholders resolve at run time:

  • {{name}} / {{username}} — contact display name / IG @handle.
  • {{message}} / {{comment}} — the text of the triggering message or comment.
  • {{post_url}} — link to the post (comment triggers only).

From HTTP nodes

Every HTTP Request node has an Output variable field (e.g. apiResponse). Its value is the parsed response body — reference the whole thing with {{apiResponse}}, or reach into it with dotted paths:

template
Hi {{name}}! Your latest order status is {{apiResponse.data.status}} — arriving on {{apiResponse.data.eta}}.

The chip palette on downstream nodes automatically shows every HTTP variable reachable via the graph.

#The HTTP Request node in depth

Modeled after n8n's HTTP node — clean toggles for each section:

  • Method: GET/POST/PUT/PATCH/DELETE/HEAD.
  • URL: variable-aware (embed {{...}}).
  • Send Query Parameters: toggle-on shows a key/value list appended to the URL as ?a=b&c=d.
  • Send Headers: toggle-on shows a key/value list. Legacy newline strings are still parsed.
  • Send Body: toggle-on lets you pick a body type — JSON, Raw text, or Form URL-encoded.

JSON body editor

When body type is JSON:

  • Line-number gutter.
  • Live JSON validation — red border + inline error when the body is malformed, green “Valid JSON” when clean.
  • Format button — pretty-prints and preserves any {{variables}} you've inserted.
  • Content-Type: application/json is added automatically when body is JSON.

Failure semantics: on timeout / non-2xx / network error, the run still continues. The variable holds null, and two extras appear alongside: {{apiResponse}}_status (HTTP status code) and {{apiResponse}}_error (error message). Use them in a Condition node to branch on failure.

#Branching on quick-reply buttons

Instagram DM quick replies and WhatsApp polls both support per-option branching. Every button/option on the node gets its own output handle on the right side; wire each to a different downstream node and the flow continues from the branch the customer picked.

How it works

1

Add options

On the DM/Poll node, add quick replies (IG) or poll options (WA). Each option becomes a violet handle on the right edge of the node.

2

Wire branches

Drag from each handle to whatever action should run when that option is picked. Options with no wire simply do nothing when tapped.

3

Save + let it fire

Save the automation. When the trigger fires, alChatBot sends the DM/poll and parks the flow. As soon as the customer replies with a matching option label (or votes), the flow resumes down the corresponding branch. Wait states expire after 1 hour if no reply comes.

Example — post-comment menu
flow
[IG · Post] (keyword: "+")
        ↓
[IG · Send DM]
   text:        "Hi {{username}}! What would you like to know?"
   buttons:     ["Menu", "Order Status", "Contact Support"]
        ↓                   ↓                    ↓
   [Menu branch]      [Order branch]     [Support branch]
   Send catalog PDF   HTTP: fetch status  Ping operator

#Handing off to an AI agent

The AI Agent Reply node picks a specific agent and lets it answer the current trigger — overriding whatever agent the channel is normally bound to.

Common uses:

  • An ad-specific agent: automation triggers on ad-click referrer → AI Agent Reply routes to a bespoke sales agent.
  • A comment-answering agent: IG Post trigger → AI Agent Reply routes to an agent tuned for public replies, delivered via the comment→DM route.

The agent's answer is delivered through the normal channel — WhatsApp DM, Instagram DM, or comment-to-DM depending on where the trigger fired.

#Conditions

Branch the flow on a check. A Condition node has two output handles — true (green) and false (red).

  • field: message / tag / status.
  • operator: contains / equals / not_equals.
  • value: what to compare against.

Use a Condition after an HTTP node to branch on the status: {{apiResponse}}_status equals 200 → success flow; otherwise → error flow.