Skip to main content
A flow is a graph of cards. Each card has exits — the edges out of it. What an exit means depends on the card: a button on a Buttons card, a branch on a Condition, simply “where next” on everything else. Open the canvas at Chat agents → your agent → Flow. Drag a card from the palette on the left.
Only Buttons, Ask, AI assistant, Handoff and End wait for the visitor. Every other card runs and moves straight on, so a chain of them executes in one turn and the visitor only ever sees the next card that waits.

At A Glance


Start

The anchor. Exactly one per flow, it renders nothing, and it takes one exit to whatever card opens the conversation.
Nothing may point back at Start — it renders nothing, so landing there looks like a stall. Publishing is blocked if anything does.

Buttons

A message and a set of buttons. Waits for a tap. A button can also carry a deep link instead of, or as well as, a destination — myapp://orders/123. A link-only button opens the link and leaves the conversation where it is.
javascript:, data:, vbscript:, file: and blob: links are refused at save time. A link with no scheme at all is treated as https://.
Blocks publish: a button with no text, or a button connected to nothing and carrying no deep link.

Ask A Question

A message, then a typed answer stored in a variable. The input type changes the control the visitor sees — a number pad, a country picker, a star row — and is validated server-side before the answer is stored.
A phone ask card does something extra: once a phone number is collected, the whole conversation is re-keyed onto that phone number in your CRM, merging it with the same person’s calls and WhatsApp. Ask for a phone number early if you want that merge.
Blocks publish: no message, or no variable name.
An ask card cannot take a file. Attachments are only possible on an AI card and during a human handoff.

Send Message

Says one thing and moves on. No buttons, no waiting. Use several in a row for a paced multi-line reply — each arrives as its own bubble, with a natural gap between them. Blocks publish: no message.

Send Image Or File

An image, a video or a file, with a line of text above it. The URL’s own extension wins over the Kind setting when it is unambiguous, so a card saved with a video link but Kind left on image still plays. Blocks publish: no link, or no message.

Set A Value

Writes variables without asking the visitor. Up to 20 name/value pairs, and the values are templated — so {{first_name}} {{last_name}} is a valid value. Useful for carrying a branch’s meaning forward: set topic = "billing" on the billing path and every later card can read it. Blocks publish: sets nothing, or an unusable variable name.

Condition

Branches on a variable. The first exit whose condition matches wins. The last exit with no condition at all is the fallback. Warns (does not block): no fallback exit, so the conversation stops when nothing matches.

API Call

An HTTP request to your system, with the response mapped into variables. Two exits: ok and error. A non-2xx response, a timeout or an unreachable host takes the error exit, so a flaky API is a branch you handle rather than the end of the conversation. Timeout: 8 seconds. Blocks publish: no URL, or an unusable variable name in the mapping.

Run Code

Your own Python, in the middle of a flow.
Two exits: ok and error. Raising takes the error exit. Timeout: 8 seconds. Blocks publish: no code, or code that does not define async def run(.
This is different from an AI card’s functions, which are LangChain tools the model chooses to call. A Run code card always runs, at a fixed point in the flow. See The AI card.

AI Assistant

Hands the conversation to a model for as long as it takes. This is the biggest card in the product and has its own page. The card ends when the assistant decides the conversation is over, then takes its single exit. There is no turn cap and no “Done” button. Blocks publish: no instructions.

Update Contact

Writes onto the contact record in your CRM rather than into the conversation. Up to 20 name/value pairs, templated. Use it to persist what the flow learned — plan, city, last_issue — so it is there next time the same person comes back. Blocks publish: sets nothing, or an unusable variable name.

Handoff To A Person

A person owns the conversation from here. The bot stops answering. Its single exit is optional and is not walked when the card runs — it is where the visitor lands when the teammate ends the chat. Leave it empty and the conversation simply closes. What happens when nobody is available is configured account-wide — see Raise a ticket. Blocks publish: no message, or handing back to a step that no longer exists.

Jump

Nothing but an exit. It exists to keep a long edge off the canvas — a jump near the card and a jump near the destination reads better than one line across the whole board.

End

The last thing the visitor reads. No exits. The conversation is closed, and the panel offers Start a new conversation. Blocks publish: no closing message.

What Blocks A Publish

The builder refuses to publish while any of these is true. Warnings do not block.
  • The flow has no steps, or no Start step
  • The Start step is not connected, points at itself, or points at a step that no longer exists
  • Anything points back at the Start step
  • A card that speaks has no message (except Buttons, whose buttons can stand alone)
  • An Ask card with no variable
  • An API card with no URL
  • A media card with no link
  • A Run code card with no code, or code missing async def run(
  • An AI card with no instructions
  • A Set or Update contact card that sets nothing
  • An unusable variable name anywhere
  • Two exits on one card sharing an id
  • A button with no text
  • Anything connected to nothing, or to a step that no longer exists
  • A card with no exits at all
  • A Condition card with no fallback exit
  • Cards that cannot be reached from the Start step (a branch you are still building)

Next Steps

The AI card

The one card with a page of its own

Variables and identity

What {{...}} can reach