Agent Flows
Multi-screen forms an AI agent can hand to a customer mid-conversation. The agent decides when to ask for structured information — name, dates, an uploaded ID photo, a multi-step questionnaire — and your customer fills it in with a native form rather than a long back-and-forth chat.
Agent Flows runs on WhatsApp, Telegram, Messenger, and your website chat widget and is available on all paid plans (tier-limited — see the Tier limits table below). Build a flow once; it renders natively on every supported channel.
Supported channels
A flow is channel-neutral — you design it once and it renders natively wherever the agent runs.
| Channel | How the form opens | Notes |
|---|---|---|
| The agent sends a native WhatsApp Flow button; the form opens inside WhatsApp | Publishes per-language to Meta; the only channel with native rich-text limits set by WhatsApp | |
| Telegram | The agent sends an inline button that opens the form as a Telegram Mini App | Full rich-text (bold, headings, lists, tables) |
| Messenger | The agent sends a button that opens the form in a Messenger Webview | Full rich-text |
| Website chat widget | The form opens inline in the embedded chat widget on your site | Lightweight renderer; rich text is limited to bold, italic, links, and lists |
The same components, screens, logic, and translations work on every channel — there’s nothing per-channel to maintain. Conditional logic (If / Switch) and screen routing are evaluated the same way on every renderer, so a flow behaves identically no matter where your customer fills it in.
Publish one flow to several channels at once. On the flow’s Distribute tab, each channel has its own publish card. Publish to a WhatsApp number, then publish the same flow to a Telegram bot and a Messenger page — each card stays published independently, and adding one channel never un-publishes another. Unpublish a single channel from its card without touching the others. Analytics blend across all the channels a flow is live on by default; when a flow is live on two or more channels, a channel filter appears on the Submissions, Heatmap, and Diagnose views so you can drill into one channel at a time.
When to use Agent Flows
Reach for a flow when chat alone is the wrong shape for the question:
- Lead capture — name + email + business size + meeting preference, all in one screen the customer fills in once
- Appointment booking — pick a date, pick a time slot, confirm
- Document or photo upload — collect an ID, a receipt, a damaged-product photo
- Multi-step intake — symptom checklists, application forms, surveys
- Conditional questions — only ask “what kind of pet?” if they said yes to “do you have a pet?”
The agent recommends a flow when its system prompt + the conversation context match. You set up the flow once in the admin panel; the agent reuses it across every conversation.
Building a flow
Flows live under Agent Flows in the customer admin panel. Each flow has:
- A name and description the agent reads to decide when to use it
- One or more screens, each containing components (fields)
- Optional screen logic (branch to different screens based on what the customer picks)
- Optional A/B variants — split traffic between two versions of the same flow
- Per-locale publications to WhatsApp (translate once, publish per language)
Starting from a template
You don’t have to start from a blank composer. Open the Templates tab on the Agent Flows list to browse a curated library of ready-made flows — lead capture, demo booking, support intake, product feedback, and more. Click Use this template and it creates an editable draft in your own workspace: the screens, fields, logic, and translations come pre-filled. Bind the draft to a WhatsApp number, tweak anything you want, and publish.
A template is just a starting point — once you’ve created your copy, it’s a normal flow you fully own and can edit freely. The template library is available to every plan that has Agent Flows.
Component library — 24 variants
The composer’s Add field menu groups all 24 components into seven categories. Pick the right shape for the data you need.
Display (chrome, no input)
These render text or images on the screen without asking the customer for input.
| Component | Use it for |
|---|---|
| Text Heading | A large title at the top of a screen (≤ 80 characters) |
| Text Subheading | A secondary title under the heading (≤ 80 characters) |
| Text Body | A paragraph of explanatory copy. Supports bold and |
| Text Caption | Small supporting copy; markdown allowed (≤ 4096 characters) |
| Rich Text | A markdown block — useful for terms, disclaimers, formatted instructions |
| Image | A single image (≤ 100 KB) |
| Image Carousel | Up to 10 swipeable images with captions — product galleries, before/after, instructions |
Inputs (single-line and multi-line text)
| Component | Use it for |
|---|---|
| Text Input | A single-line text box — name, email, short answers |
| Text Area | A multi-line text box — comments, descriptions, longer answers (≤ 600 characters) |
| Embedded Link | An inline tap-to-open link with custom text (≤ 25 characters) |
Choices (pick from a set)
| Component | Use it for |
|---|---|
| Dropdown | Pick one from a long list (10+ options) |
| Radio Buttons | Pick one from a short list (≤ 20 options), all visible at once |
| Checkboxes | Pick any number from a list, with optional minimum and maximum |
| Chips Selector | Pick from up to 20 tag-style chips — interests, categories, multi-select with a tight footprint |
Date & time
| Component | Use it for |
|---|---|
| Date Picker | A single date — booking date, date of birth |
| Calendar Picker | A calendar surface with optional date range, min/max bounds, and unavailable dates greyed out — appointment booking, hotel stays |
Both Date Picker and Calendar Picker are kept as distinct components. Use the Date Picker for a quick single date; use the Calendar Picker when you need a visible month grid, a range, or to grey out specific dates.
Media uploads
| Component | Use it for |
|---|---|
| Photo Picker | Customer uploads photos from the camera or gallery (up to 30 per submission) |
| Document Picker | Customer uploads documents — PDF, DOC, etc. (up to 10 per submission) |
Mutex: A single screen can hold either a Photo Picker or a Document Picker, but not both. Put them on separate screens if your flow needs both kinds of upload.
Layout
| Component | Use it for |
|---|---|
| Navigation List | Up to 20 tappable rows with chevrons — choose a category, choose a product, choose a destination screen |
| Opt-In | A consent checkbox — terms of service, marketing opt-in, GDPR consent |
| Footer | The submit affordance on the last screen of the flow |
Logic (conditional rendering)
| Component | Use it for |
|---|---|
| If | Render some components only when a condition is true (then) — optionally with an alternative (else) |
| Switch | Render different components based on a value the customer picked earlier (multiple cases + optional default) |
| For Each | Repeat a set of components once per item of an array already in form state — one block per selected item |
If and Switch support up to 3 levels of nesting. If you find yourself nesting deeper than that, split the logic across multiple screens with screen-level routing instead.
Multi-screen flows and routing
A flow can have up to 10 screens. Each screen ends with a Footer that either submits the flow or moves to the next screen. Use the screen logic editor to route the customer to a different next screen based on what they picked — for example, customers who select “Refund” go to a refund-specific second screen; everyone else goes to the generic follow-up screen.
For component-level conditional rendering inside a single screen, use If / Switch instead.
Localisation
Translate the flow once and each customer sees the version that matches their language. On WhatsApp, you publish per language — pick the languages you ship it in from WhatsApp’s full supported-language list (every language Meta lets you publish a WhatsApp Flow in). The picker shows region-distinct options where it matters, so you can ship Português (Brasil) separately from Português (Portugal), or 中文 (简体) separately from 中文 (繁體). Each customer sees the version that matches their WhatsApp language; if a customer’s language isn’t published, the integration’s default locale is used as a fallback. (When the customer writes in a base language like Portuguese and you’ve only published a regional variant such as Brazilian Portuguese, they still get the localized form.) On Telegram, Messenger, and the website widget, there’s no separate publish step — the form renders in the customer’s language on the fly from the same translations.
A/B testing
If you want to test two versions of a flow against each other, configure them as variants in the Variants tab. Customers are split deterministically (same customer always sees the same variant); the Submissions view shows which variant each submission came from, and the Field Heatmap lets you compare drop-off and completion rates side by side.
AI generation
If you have a higher-tier plan, the composer offers AI form generation: write a one-line prompt (“a hotel booking form with date-range and photo upload”), or upload a PDF / image of an existing form, and the assistant drafts the flow for you. The draft is fully editable — every field is round-trippable in the composer (no opaque AI snapshots).
Submissions and analytics
Once a flow is published, every submission lands in the Submissions view for that flow. Each row shows:
- Who submitted, when, and through which agent
- The full field values from the form
- An AI score (0–100) the assistant assigned to the submission — high-value leads bubble to the top
- The chat turns from the conversation right before the form was opened (the conversation-context join — see why the agent decided to ask for this submission)
Aggregate analytics include a KPI strip (started / completed / drop-off rate), a Field-Level Heatmap showing where customers abandon, and a Narrative Diagnostic chat — an AI analyst you can ask “why are people dropping off on screen 2?” and it’ll trace the answer through the heatmap, submissions, and conversation context.
Notifications and the lead funnel
A submission is only valuable if someone acts on it fast. Each flow’s Distribute tab has a notification block so the right people hear about a lead the moment it lands:
- Submission notifications — when a form is submitted, an in-app notification appears, deep-linked straight to that submission. Toggle it per flow.
- Reply-after-takeover notifications — when one of your team replies to a lead in WhatsApp and the customer writes back, you get a second notification — the second beat of the speed-to-lead loop.
- Email recipients — add up to ten email addresses and each submission also sends a deferred email deep-linking to the submission, so offline staff still catch the lead.
A chatty customer won’t spam you: a burst of messages right after a submission collapses into one notification, and a fresh one only fires after a human has actually replied and the customer comes back.
Each flow also has a funnel strip on its submissions page — a read-only, at-a-glance view of where leads stand:
| Stage | Meaning |
|---|---|
| Submitted | every submission for the flow |
| Engaged by AI | the agent followed up in the conversation after the form |
| Human replied | someone on your team replied by hand |
| Resolved | the conversation was archived |
| Awaiting human reply | notified, but no human has replied yet — your at-risk leads |
The funnel is a heuristic view to help you manage the pipeline at a glance, not a revenue-attribution model.
Contextual acknowledgments
When a customer finishes a flow, they see the form’s instant confirmation message you set on it (on WhatsApp, that’s the native completion screen). Shortly after, the agent also sends a separate message that references what they actually filled in — “Got it — I’ve put you down for 2pm Tuesday. Anything else?” — so the conversation picks up naturally instead of leaving the customer staring at a static “thanks.” The agent already knows the submitted values, so the acknowledgment is specific, not boilerplate. This follow-up message is sent on WhatsApp, Telegram, and Messenger.
This is on by default for every flow. If you’d rather the agent stay quiet after a submission, turn off Acknowledge submissions on the flow’s Distribute tab. The acknowledgment also stays silent automatically when one of your team has taken over the conversation — you won’t get an AI message stepping on a human reply.
Sharing a flow as a campaign link
Published flows don’t only live inside conversations the agent starts. Open the Campaign asset card on the flow’s Distribute tab and generate a shareable link — a standard WhatsApp click-to-chat link (plus a downloadable QR code) you can drop into an email, an Instagram bio, a “Book a demo” button, or print on a flyer.
When someone clicks the link, WhatsApp opens a chat with your number and a prefilled message; they tap send, and the exact form opens as the first reply — no guessing, no AI greeting in between. The person who clicked “Book Demo” gets the booking form straight away. The agent then handles the rest of the conversation normally.
Each link has a hit counter so you can see how many people launched the form through it, and you can revoke a link at any time. If a link’s text is edited or stripped before sending, or the link is revoked, the message simply falls through to a normal AI conversation — nothing breaks.
Tier limits
| Tier | Published flows | Locales per flow | AI generation |
|---|---|---|---|
| Trial | 1 | 1 | — |
| Starter | 1 | 1 | — |
| Plus | Unlimited | Unlimited | ✅ |
| Enterprise | Unlimited | Unlimited | ✅ |
All 24 component types are available on every tier that supports Agent Flows — there is no per-component tier-gating.