> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dmly.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Build a flow

> How the flow builder canvas works, and which step groups you get on each channel.

A flow is one automation drawn on a canvas: a trigger at the start, steps after it, and lines
connecting them. Every automation belongs to a single channel, and the steps on offer change to
match what that channel can actually deliver.

<Note>
  **The step palette is not the same on every channel.** The **WhatsApp** group only appears on a
  WhatsApp channel, the **Messenger (FB/IG)** group only on a Facebook or Instagram channel, and an
  SMS channel loses every media step. This is not a bug or a missing permission — a Telegram bot
  cannot send a WhatsApp template, so the builder does not offer one. To use WhatsApp steps, build
  the automation on your WhatsApp channel.
</Note>

## Start a flow

<Steps>
  <Step title="Create the automation">
    Select **New automation**, then **Start from scratch** or pick one from **Templates**.
  </Step>

  <Step title="Choose the builder">
    Under **How do you want to build it?** pick **Flow builder** — a visual canvas with branching and
    multiple steps. **Quick automation** is the other option: a single trigger and one reply, set up
    in a form.
  </Step>

  <Step title="Check the trigger">
    Choosing **Flow builder** creates the automation straight away and opens the canvas with a
    trigger already placed, set to your channel's own event — **WhatsApp message** on a WhatsApp
    channel, **Telegram message** on Telegram, **Google review** on a Google Business Profile. Open
    it to change the event or add keywords. On **SMS** and **TikTok** the trigger opens as
    **Choose a trigger** — pick the event before you publish, or the flow will never fire. See
    [Triggers](/automation/triggers).
  </Step>

  <Step title="Add steps and connect them">
    Select a step in the palette on the right to drop it on the canvas, then drag from one step's
    output dot to the next step.
  </Step>

  <Step title="Publish">
    **Save draft** while you work. **Publish** makes it live and turns the automation **Active**.
  </Step>
</Steps>

A quick automation can be moved onto the canvas later with **Edit in Flow Builder**. That is a
one-way trip — there is no way back to the form.

## How the canvas works

* **One trigger, always.** A flow has exactly one trigger node and it cannot be deleted or doubled.
* **One line out of each output.** An output connects to a single next step. Branching happens
  through a step's separate outputs — a condition's true and false, a randomizer's branches — not by
  dragging two lines out of the same one.
* **A dangling output ends that path.** If nothing is connected after a step, the run finishes there.
  That is normal for most outputs: not every branch needs an end step. Reply buttons and quick
  replies are the exception — publish rejects any that is left unconnected.
* **A note has no ports.** A note, from the **Other** group, is a canvas-only annotation: nothing
  connects into it and nothing runs out of it. As the builder puts it, *"Notes are visible only to
  your team — they never send and don't affect the flow."*
* **Amber badges are advice, not errors.** They flag likely problems as you build — an unconnected
  step, buttons on a channel that cannot show them. The real check runs when you publish.

## The step groups you always get

<Columns cols={2}>
  <Card title="Messaging" icon="comment">
    Text, image, video, audio and file messages, plus a step that asks the contact something and
    waits for their reply.
  </Card>

  <Card title="AI" icon="robot">
    Hand the conversation to an AI step that answers in your words. See
    [AI replies](/automation/ai-replies).
  </Card>

  <Card title="Logic" icon="code-branch">
    Condition, randomizer, delay, start another flow, and end.
  </Card>

  <Card title="Actions" icon="bolt">
    Tag, assign, **Handover to Human** (which pauses the bot) and **Resume bot replies**,
    **Unsubscribe Contact** and **Resubscribe Contact**, **Update Contact Stage** to move the
    contact to a pipeline stage, **Request Google review**, send an SMS, call a webhook, and
    connectors such as Google Sheets, Slack, Mailchimp and HubSpot.
  </Card>

  <Card title="Appointments" icon="calendar-days">
    Book a meeting, send a booking or reschedule link, confirm, cancel, mark a no-show, assign staff.
  </Card>

  <Card title="Offerings" icon="box">
    Send a service, product or plan from your catalogue, and check stock.
  </Card>

  <Card title="Finance" icon="credit-card">
    Create and send an invoice, send a payment link, record a payment, create an order or
    subscription, apply a coupon, issue or deduct credits.
  </Card>

  <Card title="Other" icon="note-sticky">
    Notes you leave on the canvas for your team.
  </Card>
</Columns>

Use the search box above the palette to find a step by name; groups with no match disappear. You can
collapse the palette to a rail while you arrange the canvas.

## The groups that depend on your channel

| Group                             | Appears when                                         | What it holds                                                                                                                                        |
| --------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **WhatsApp**                      | The automation is on a WhatsApp channel              | Buttons, lists, call-to-action links, templates, WhatsApp Flows, catalogue, location send and request, ask for a phone number, CSAT, call permission |
| **Messenger (FB/IG)**             | The automation is on a Facebook or Instagram channel | Generic and carousel cards, marketing opt-in, e-commerce, and the sequence step                                                                      |
| **Store (Shopify / WooCommerce)** | A store is connected to the workspace                | Find an order, send order status, checkout link, send a product, sync the contact, create a discount, update a store note                            |
| **Comment actions**               | The trigger you picked is a comment event            | Reply to, like, hide or delete the comment                                                                                                           |

Two of those are worth spelling out.

* **Sequences run on Facebook and Instagram only.** The sequence step lives in the
  **Messenger (FB/IG)** group, so a WhatsApp flow cannot enrol a contact in one. See
  [Sequences](/automation/sequences).
* **Comment actions follow the trigger, not the channel.** The group appears the moment you choose a
  comment trigger and disappears if you change it. WhatsApp, SMS, Telegram and Live Chat have no
  comments at all, so it never appears there.

<Note>
  On an **SMS** channel the **Messaging** group shrinks to a text message and the ask-and-wait step.
  SMS sends one plain body string — no images, no buttons, no quick replies — so the builder only
  offers what the gateway can deliver.
</Note>

Store steps call the store's API and do nothing without a store connected, which is why they are
hidden until one is. The AI step and the Google review request step stay in the palette on every
plan, but on a plan without them they cannot be added: selecting one shows *"The AI step isn't
included in your plan. Upgrade to use the AI Agent in your automations."* or *"The Google
review-request step isn't included in your plan. Upgrade to Reputation & Reviews to use it."* and
nothing lands on the canvas. Installing a template that contains one is refused the same way. See
[Plans](/billing/plans).

## Message steps still have channel rules

The palette cannot catch everything, so the canvas warns you where a step is legal but the content
is not:

* **WhatsApp:** *"WhatsApp text messages can't carry buttons — use the Buttons Message step."*
* **Instagram:** *"Instagram does not support call/webview buttons."*

The builder also holds you to the platform's own caps — how many buttons or quick replies a message
may carry, how long a WhatsApp body, header, footer or list row may be.

## Publishing and drafts

Editing a flow only ever changes its draft. The published version keeps running untouched until you
select **Publish**, and publishing immediately opens a fresh draft — so the canvas is always editable
and the runs already in progress finish on the version they started on.

Publish runs four checks, and stops at the first failure:

<Accordion title="1. Plan">
  The flow uses an AI step or a Google review request your plan does not include. Upgrade, or remove
  the step. You cannot normally add either on a plan without them, so this is a backstop for flows
  that already contain one.
</Accordion>

<Accordion title="2. Structure">
  The flow needs a trigger, and at least one step after it. Every step other than the trigger and
  notes must have something connected into it. Every reply button and every quick reply on a message
  step must connect to a next step, or publish stops with `Button "Yes" is not connected to a next
      step.` Each output can have only one line out of it. Every condition must have both its true and
  false outputs connected, and a find-order step both its found and not-found outputs. A randomizer
  needs between two and five branches whose weights add up to 100%. A buttons message needs one to
  three buttons with titles of 20 characters or less; a list message needs one to ten rows.
</Accordion>

<Accordion title="3. Keyword conflict">
  Another **Active** automation on the same channel already answers the same event. If both reply to
  every message, or both claim the same keyword, the contact would get two replies. Give one a
  specific keyword, or pause the other, then publish.
</Accordion>

<Accordion title="4. Active bot limit">
  Publishing activates the automation, so it counts against the limit on active bots per channel.
  Pause one you are not using.
</Accordion>

Pausing an automation does not unpublish it — it just stops it being considered. Switch it back on
and the same published version runs again.

<Warning>
  Every matching flow fires, not just the first one. If two **Active** flows on the same channel
  match the same message, the contact gets both replies. The keyword check only compares against
  automations that are already active when you publish, so it will not catch a clash you create later
  by switching a paused flow back on. Check what is already active on a channel before you turn
  another one on.
</Warning>

## Checking it works

The per-node badges on the canvas show how many times each step ran and how many messages it sent —
counted from real runs of the published version, so they stay empty until you publish. The
automation's analytics page adds runs, completions, failures and a completion rate. Nothing is
estimated: delivery and clicks are not tracked per step, so they are not shown.

<Columns cols={2}>
  <Card title="Triggers" icon="bolt" href="/automation/triggers">
    Which events can start a flow, and which are channel-specific.
  </Card>

  <Card title="Publish a bot" icon="rocket" href="/automation/publishing-bots">
    Drafts, versions and going live.
  </Card>

  <Card title="Templates" icon="copy" href="/automation/templates">
    Start from a ready-made flow.
  </Card>

  <Card title="Common mistakes" icon="triangle-exclamation" href="/automation/common-mistakes">
    Why a flow does not fire, or fires twice.
  </Card>
</Columns>
