Skip to main content
We’ll build a classic flow: “When a VIP customer messages on WhatsApp, route them to our senior team.”
1

Open Flows

Sidebar → FlowsNew flow.Give it a name (VIP WhatsApp routing) and an optional description.
2

Drop a Trigger

From the node palette on the left, drag Trigger onto the canvas.Click it to configure:
  • Channel — WhatsApp
  • Event — Message received
(Leave both as “any” to trigger on everything — we’re scoping to WhatsApp here.)
3

Add a Condition

Drag Condition onto the canvas and connect Trigger → Condition.Click to configure:
  • Fieldcontact.tags
  • Operatorcontains
  • Valuevip
The condition node always has two outputs: yes (matches) and no (doesn’t).
4

Add a Handoff

Drag Handoff onto the canvas. Connect the condition’s yes output to it.Configure:
  • Target type — Team
  • Team — Senior support (or whoever handles VIPs)
  • Reason“VIP customer on WhatsApp” (shown to the assignee)
5

Let the AI handle the rest

Leave the no output unconnected. When the condition doesn’t match, the flow simply ends — and the AI agent on the channel continues normally.
6

Save and test

Hit Save. The flow is saved as a draft — it doesn’t run yet.Click Test run → simulate a WhatsApp message with a VIP tag. Watch the flow light up each node as it executes.See Publish and test for the full testing workflow.
7

Publish

When the test looks right, click Publish. The flow goes live immediately.

Canvas basics

  • Drag from a node’s handle to another node to connect.
  • Click a node to open its config panel on the right.
  • Right-click to delete, duplicate, or re-arrange.
  • Space + drag (or scroll wheel) to pan.
  • Cmd+Enter saves.

Auto-layout

Messy canvas? Click Auto-layout in the toolbar to let Keloa tidy the nodes based on their connections.

Versions and rollback

Every Publish snapshots the flow. If the new version misbehaves, open the flow → Versions → roll back to any previous published version.

Common flow patterns

  • Welcome message — Trigger (conversation opened) → Message (“Hi, welcome to Acme!”)
  • After-hours — Trigger (message received) → Condition (business hours?) → Message (“We’re back at 9”)
  • Auto-tag by keyword — Trigger → Condition (message.body contains “refund”) → Action (tag: returns)
  • CSAT — Trigger (conversation resolved) → Resolve (csat_enabled: true)