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.
| Trigger | Fires on | Config |
|---|---|---|
| WhatsApp · Keyword | Inbound WA DM matching keyword rules | instanceId (or any), keywords, matchMode, caseSensitive |
| WhatsApp · Any Message | Every inbound WA DM | instanceId (or any) |
| WhatsApp · New Contact | First message from a phone we haven't seen | instanceId (or any) |
| Instagram · DM | Inbound IG DM — filter by keyword or any | accountId, filterMode (any/keyword), keywords |
| Instagram · New Contact | First IG DM from a new IGSID | accountId |
| Instagram · Post | New comment on a selected post | accountId, 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.
| Action | Purpose |
|---|---|
| WhatsApp · Send Message | Send text (with optional media) via the current WA instance. |
| WhatsApp · Send Poll | Send a native poll with 2–12 options — each option becomes a branch handle. |
| Instagram · Send DM | Send a text / media / quick-reply DM. Each quick-reply becomes a branch handle. |
| Instagram · Reply Comment | Post a public comment reply. |
| Instagram · Hide Comment | Hide the triggering comment. |
| Instagram · Delete Comment | Delete the triggering comment. |
| AI Agent Reply | Route this trigger to a specific AI agent — overrides the channel default. |
| Add Tag | Tag the CRM contact for later filtering. |
| Set User Field | Save a value on a custom contact field. |
| HTTP Request | Call any external API. Store the response in a variable for downstream nodes. |
| Wait / Delay | Sleep for N seconds inside the flow. |
| Condition | Branch 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:
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/jsonis 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
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.
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.
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.
[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.