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

# WhatsApp Flow builder

> Create, preview and publish WhatsApp Flows in the Connectly dashboard, with no code required.

A **WhatsApp Flow** is a form that opens inside a WhatsApp conversation. Customers fill it in without leaving the chat, which makes it a good fit for sign-ups, bookings, surveys and lead capture.

The **WhatsApp Flows** page in the dashboard lets you design a flow, preview it, and publish it. To send a published flow from your own system, see the [WhatsApp Flows API guide](/messaging/whatsapp-flows).

<CardGroup cols={2}>
  <Card title="Sign-up" icon="user-plus">
    Collect a name, email and consent.
  </Card>

  <Card title="Bookings" icon="calendar-check">
    Let customers pick a service and a date.
  </Card>

  <Card title="Surveys" icon="star">
    Ask for a rating and follow up based on the score.
  </Card>

  <Card title="Verification" icon="id-card">
    Collect an ID photo or a document.
  </Card>
</CardGroup>

## Before you start

* Your business needs a connected WhatsApp number. A flow lives on **one** number. If you have several, you choose which one when you create the flow.
* Flow names must be **unique** on that WhatsApp account.

## The flow list

Open **WhatsApp Flows** in the sidebar to see your flows and their state.

| Status | Meaning |
| - | - |
| **Draft** | Still being built. It can't be sent yet. |
| **Published** | Live and can be sent. |
| **Deprecated** | Permanently retired. |
| **Blocked** / **Throttled** | WhatsApp has restricted the flow. |

A health label next to each flow tells you if it is ready to send: **Can send**, **Limited** or **Blocked**.

## Create a flow

<Steps>
  <Step title="Choose how to start">
    Select **Create Flow** for a blank flow, or **Choose template** to start from an example.
  </Step>

  <Step title="Fill in the details">
    Enter a **Name**, optionally pick a **Category**, and choose the **WhatsApp number** that will host the flow.

    Categories: Sign up, Sign in, Appointment booking, Lead generation, Contact us, Customer support, Survey, and Other.
  </Step>

  <Step title="Build it">
    The flow opens as a **Draft** in the editor. Add screens and components in the **Builder** tab.
  </Step>

  <Step title="Save and publish">
    Select **Save**, check the preview, then select **Publish**. You need to save before you can publish.
  </Step>
</Steps>

### Templates

Templates show what's possible and save you time. Each one can be edited after you create it.

| Template | What it shows |
| - | - |
| **Welcome message** | The simplest flow: one screen with a greeting. |
| **Delivery or pickup** | Fields that appear or hide based on an earlier answer, plus a gift-wrap option. |
| **Appointment booking** | Pick a service and date, then enter contact details. |
| **Customer satisfaction survey** | A rating that leads to different follow-up questions. |
| **Account sign-up** | A branded form with email, password and a terms checkbox. |
| **Product interest** | Sends answers to a backend, then shows a recommendation. *Dynamic.* |
| **Vacation rental** | A property description, photo carousel and date range picker. |
| **Newsletter preferences** | Topic chips, an external link and an opt-in checkbox. |
| **Identity verification** | Collects an ID photo and a proof-of-address document. *Dynamic.* |

## The editor

The editor has a **preview** on one side, so you can see what customers will see, and two ways to edit.

### Builder tab

The Builder is a visual editor. Screens are listed on the left, the selected screen is in the middle, and the settings for the selected component are on the right.

* **Add screen** to create steps. The last screen always ends the flow.
* **Add component** to put content on a screen.
* **Screen settings** let you mark a screen as terminal and control data options (see below).

<Note>
  The Builder shows a screen as read-only if it uses components the Builder
  doesn't support yet. Edit those screens in the **JSON** tab.
</Note>

### JSON tab

The JSON tab is for advanced users. You can paste or **Upload JSON**, edit the flow's JSON directly, and see validation messages as you type. The Builder and JSON tab edit the same flow. If the JSON is invalid, fix it before going back to the Builder.

### Preview and mock data

The preview shows **Screen 1 of N** and lets you move between screens. For dynamic flows, the preview can't call your server, so it uses **mock data** you enter for each screen. You can also enter **mock form values** to see how a screen looks once filled in.

## Components

| Group | Component | Use it for |
| - | - | - |
| **Text** | Heading, Subheading, Body, Caption | Titles, paragraphs and small print. |
| | Rich text | Longer formatted content such as terms, with headings, lists and tables. |
| **Input** | Text input | Free text, email, phone, number, password or passcode. |
| | Text area | Longer answers. |
| | Date picker / Calendar picker | A single date, or a date range. |
| **Choice** | Radio buttons | Pick one option. |
| | Checkboxes / Chips | Pick several options. |
| | Dropdown | Pick one from a long list. |
| | Opt-in | A consent checkbox, for example for marketing. |
| **Media** | Image, Image carousel | Show pictures. |
| | Photo picker, Document picker | Let customers upload a photo or a document. |
| **Layout** | If / else | Show different components depending on an earlier answer. |
| | Footer button | The main action button at the bottom of the screen. |
| | Embedded link | A tappable link in the text. |

### What buttons can do

Each button or option can run an action:

| Action | What happens |
| - | - |
| **Navigate** | Go to another screen. |
| **Complete** | Finish the flow and send the answers back to the conversation. |
| **Data exchange** | Send the answers to your server and get the next screen back. Used by dynamic flows. |
| **Open URL** | Open a link. |
| **Update data** | Change a value on the current screen. |

For simple flows, leave the action on **Automatic**. Connectly sets up navigate and complete from the screen order.

### Showing and hiding fields

With **If / else**, you set a **Condition** such as `${form.age} >= 18` or `${data.has_delivery}`. You can combine conditions with `&&`, `||` and `!`. If the condition is true, the **Then** branch shows. Otherwise the **Else** branch shows.

## Static and dynamic flows

This is the main choice when you design a flow.

| | Static flow | Dynamic flow |
| - | - | - |
| **How it works** | Everything is in the flow. Answers are sent back when the customer finishes. | The flow talks to your server **while** the customer is using it. |
| **Good for** | Surveys, sign-ups, simple forms | Availability, personalised data, validation, file uploads, recommendations |
| **Needs a tool** | No | Yes, to answer the flow's requests |
| **Setup** | None | Turn on **Dynamic flow** in screen settings |

To make a flow dynamic, open **Screen settings** and turn on **Dynamic flow**. This applies to the whole flow. When you save, Connectly sets up everything for you, including the tool that answers the flow's requests, and enables **Attach tool**.

<Note>
  Once a dynamic flow's endpoint is live in WhatsApp, **Dynamic flow** can't be
  turned off from the editor. If you try to turn it off while screens still send
  data to your endpoint, Connectly warns you that WhatsApp will reject the flow.
</Note>

### Connect a tool

Dynamic flows are served by a **tool** (see [Tools](/tools/overview)).

* **Automatic:** the first time you save a dynamic flow, Connectly creates a managed tool for it. Select **Open in Tools** from the editor to view it.
* **Your own tool:** select **Attach tool** and pick one of your business's tools to serve the flow instead.

Attaching sends a published flow **back to Draft**, so publish it again afterwards.

You can't attach a tool when:

| Message | What to do |
| - | - |
| That tool no longer exists | Refresh and try again. |
| That tool belongs to another flow | Each managed tool belongs to one flow and is deleted with it. Pick or create another tool. |
| This flow's JSON never calls an endpoint | Turn on **Dynamic flow** first, so there is something to attach to. |
| This flow's endpoint isn't one of this business's tools | The flow points at an external endpoint, so it can't be replaced here. |

For the technical details of what the endpoint receives and must return, see [WhatsApp Flow endpoints](/messaging/whatsapp-flow-endpoints).

## Publish, edit and send

* **Publish** makes a draft sendable. Save first.
* **Editing a published flow** (changing its details, or attaching a tool) moves it back to **Draft**. Publish again before sending.
* **Copy flow ID** copies the ID you need to send the flow from a campaign or the API.

Once published, send the flow from a campaign or through the API. See [Sending a flow](/messaging/whatsapp-flows).

## Duplicate a flow

Select **Duplicate** on a flow to make a new **Draft** copy on the same WhatsApp account. The original is untouched. Give the copy a new, unique name. If the flow uses a dynamic endpoint, the copy gets its own.

If Meta reports problems with the copy, Connectly tells you how many and you can open the flow to review them.

## Deprecate a flow

Select **Deprecate** to retire a flow.

<Warning>
  Deprecating is **permanent**. There is no archive and no restore. Any campaign
  that uses the flow **stops being able to send it immediately**. A flow that
  was never published can be deleted instead.
</Warning>

The tool created for a dynamic flow is deleted along with it.

## Limits and validation

WhatsApp sets limits on what a flow can contain. The editor checks these as you work and points out the screen with the problem.

| Rule | Detail |
| - | - |
| One button per screen | Every screen needs exactly one footer button. |
| Unique field names | Each field name must be unique on a screen, **even inside different If/else branches**. |
| Component and text limits | Screens, text fields and option lists have maximum sizes. The editor shows the exact limit when you reach it. |
| Image carousels | One or more images, up to the maximum, and a limited number per screen. |
| Rich text | Can only be used alone on a screen, or with the button. |
| Photo and document pickers | Only one picker per screen, and the button must use **Data exchange** or **Complete** so the file can be forwarded. |
| Terminal screens | A screen marked as terminal must have a button that completes the flow. |
| Footer captions | Use a center caption **or** left and right captions, not both. |
| Navigation targets | A "Navigate" action must point to a screen that exists. |

<Tip>
  Mark password and other private fields as **sensitive** in screen settings.
  Their values are then masked wherever WhatsApp shows the flow's responses. The
  editor warns you if a password field isn't marked.
</Tip>

## Troubleshooting

| Symptom | What to check |
| - | - |
| I can't publish | Save your changes first. Then fix any issues listed in the JSON tab. |
| Flow created, but content wasn't saved | Open the flow and select **Save** to keep the starting content. |
| Meta rejected the flow | Open the **JSON** tab to see the validation messages from WhatsApp. |
| A campaign can't send my flow | Check the status is **Published** and the health is **Can send**. A deprecated flow can't be sent. |
| "Can't be sent from this number until its encryption key is resolved" | Contact Connectly support. |
| **Attach tool** is missing | The flow isn't dynamic yet. Turn on **Dynamic flow** and save. |
| Preview looks empty on a dynamic screen | Add **mock data** for that screen. The preview can't call your server. |

## Next steps

<CardGroup cols={2}>
  <Card title="Tools" icon="wrench" href="/tools/overview">
    Build the tool that powers a dynamic flow.
  </Card>

  <Card title="Send a flow with the API" icon="code" href="/messaging/whatsapp-flows">
    Send a published flow from your own system.
  </Card>

  <Card title="Flow endpoints" icon="plug" href="/messaging/whatsapp-flow-endpoints">
    The technical contract for data exchange.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.