Design an in-chat WhatsApp form in DMLY (or sync one built in Meta), then send it from an automation, the inbox, or a template button.
A WhatsApp Flow is Meta’s own in-chat form. Instead of sending a contact a link to a web page,
you send them a button inside the conversation; they tap it, a form opens over the chat (text
boxes, dropdowns, dates, whatever you built) and they fill it in without ever leaving
WhatsApp.You can build a simple one directly in DMLY (pick a starting point, add and reorder fields,
publish) with no trip to Meta’s own Flow Builder required. You can also still design one in
Meta’s Flow Builder and pull it in. Either way, once it exists it can be sent from a flow, from
the inbox, or as a button on a message template, and what the contact answers lands on their
contact record.
This is WhatsApp only. Forms only exist for a WhatsApp channel; nothing here applies to
Messenger, Instagram, Telegram or SMS.
Configurations → Bot Setup → WhatsApp → Forms. There’s no separate Forms entry in the
sidebar; it’s a tab on the WhatsApp settings page, alongside Configuration, Profile, Commerce
and the rest. Select a WhatsApp channel first if Bot Setup doesn’t already have one active.
1
Open Bot Setup
Go to Configurations → Bot Setup, and make sure the channel selector at the top has a
WhatsApp channel active.
2
Select the Forms tab
On the WhatsApp Cloud API Configuration page, select Forms.
The automation builder’s WhatsApp Form (Flow) step links straight here too: Create new
form opens the forms manager in a new tab, so you don’t have to leave the flow you’re
building. It’s a separate page from this Forms tab, not literally the same one, but it shows
the identical form list and editor.
Under Create a form, select one of the starting points: Get in touch (name, phone,
email, message), Request an appointment (name, phone, service, preferred date, notes),
Share your feedback (rating, comments), Register (name, email, phone, a consent
opt-in), or Untitled form to start from a single blank question. Selecting one creates
the form and opens its editor; nothing is sent to Meta yet.
2
Edit the fields
Each field has a Label (the question the contact sees), a type, and a Required
switch. The types are Text, Email, Phone, Number, Paragraph, Dropdown,
Choice, Date and Opt-in; a dropdown or choice field also gets an
Options (one per line) box. Drag the handle on the left of a field to reorder it,
Add field to add another, or Remove to drop one.
3
Name it and set the title and submit button
Under Form details there are two separate name fields, easy to mix up: Name is the
internal label: it’s what shows in your forms list’s Name column, and
it’s what a hand-typed Flow name (manual) in the automation step has to match. Form
title is different: it’s shown at the top of the form itself, to the contact. Set the
Submit button label too, the text on the button the contact taps to send it.
4
Check the preview and save
The right-hand Preview panel renders Meta’s own preview of the form once you’ve saved at
least once. Select Save to update it. Keep saving as you edit; nothing publishes until
you say so.
5
Publish
Once you’re happy, select Publish. A form with validation errors from Meta can’t be
published; the Validation errors from Meta panel lists what to fix first.
No live WhatsApp number connected yet? You can still build and preview a form; it saves as
a local draft (tagged Local draft in your forms list). Connecting a live
WhatsApp channel doesn’t publish it for you: open the form and select
Save once to create the real form on Meta’s side, then select Publish as normal. Both
steps are manual, the same as any other draft.
A published form can’t be edited in place; Meta doesn’t allow it. Open a published form
and change anything, and saving quietly clones it to a fresh Meta flow behind the scenes: the
same entry in your forms list drops back to Draft status. Publish it again once you’re
happy, or the version contacts see stays the one that was published before your edit.
You don’t have to design in DMLY. Build the flow in Meta’s own Flow Builder, in the same
WhatsApp Business account your DMLY channel uses, then pull it in:
1
Build and save the flow in Meta
DMLY has no way to create, edit or delete a Meta-authored form; it only reads the list. If
the form doesn’t exist in Meta yet, there’s nothing to sync.
2
Sync from Meta
On the Forms tab (or from the automation step’s form picker), select Sync from Meta.
DMLY reads the form list from your WhatsApp Business account: names and statuses only, never
the form’s contents, so a design change in Meta needs no re-sync. It appears in your forms
list tagged Synced from Meta, and it isn’t editable there; go back to Meta’s Flow
Builder to change it, then sync again.
The form does not have to be published. A form still in draft syncs and sends too: DMLY
sends it in Meta’s test mode automatically, so you can try it end to end before you publish in
Meta.
On a sandbox setup, Sync from Meta returns a sample catalog instead of your real forms:
Forms refreshed (sandbox catalog) — connect a live WhatsApp number to pull real Meta Flows.
Connect a live number to sync your own.
The Forms tab lists every form you’ve made or synced, table-style: Name, Status
(DRAFT, PUBLISHED or DEPRECATED), Source (Designed in DMLY or Synced from
Meta), and actions. Only DMLY-designed forms get Edit and Publish actions; every form
can be deleted; deleting a synced one only removes it from your list, it stays untouched on
Meta’s side until you delete it there too.
Deleting a DMLY-designed form that isn’t a local draft deletes it on Meta’s side too.
Unlike a synced form, a form you built here (once it’s been created on your WhatsApp Business
account, anything past the Local draft stage) is removed from Meta as well as from your
list. That’s irreversible on your own WABA. Think twice before deleting one that’s live.
In an automation on a WhatsApp channel, find WhatsApp Form (Flow) in the WhatsApp
group of the step palette and connect it where the conversation should offer the form.
2
Pick the form
The Form picker lists every form in your workspace (DMLY-designed and Meta-synced alike)
tagged with its status. No forms yet? Create new form opens the forms manager in a new
tab without losing your place in the automation; Sync from Meta pulls in anything you’ve
built there.If the form isn’t in the list, Flow name (manual) lets you type its Exact name in
Meta’s Flow Builder instead. This matches by name, so it breaks the moment anyone renames
the form; use it only as a stopgap.
3
Write the message and the button
Message is the text the contact sees, and it takes tokens like {{first_name}}.
Button text (CTA) is the label on the button that opens the form: 20 characters
maximum, and the field counts them for you.The defaults are Fill the form and Tap below — it takes 30 seconds. Both are worth
replacing with something specific: Book your slot, Start your claim.
4
Set the entry screen
Entry screen is the screen in the form the contact lands on. Leave it as WELCOME unless
the form’s first screen is named something else; every form you design in DMLY uses
WELCOME automatically, so this only matters for a form synced from Meta.
5
Publish the flow
Connect the COMPLETED output to whatever should happen next, then
publish the automation as usual.
An empty Message, an empty button label, a button label over 20 characters, or a missing
form name each raise an amber warning on the step. None of them stop you saving or publishing;
they are reminders, not blocks. The form warning also checks the name rather than the picked
form, so a step with a hand-typed name and nothing selected raises nothing at all.
Any DRAFT or PUBLISHED form (DMLY-designed or Meta-synced, as long as it isn’t still a
local-only draft) can be sent to a contact directly, without an automation.
1
Open the form picker
In a WhatsApp conversation, select the form icon in the composer toolbar
(Send a form).
2
Pick a form
Choose it from the list. The composer shows a Form: <form name> chip in place of the
text box.
3
Send
Select send as normal. The message that opens the form is fixed: Please tap below to open
the form with an Open form button. You can’t customize the wording from here. It’s
recorded in the thread as 📋 <form name>.
The button always opens at the form’s WELCOME screen; sending from the inbox has no
entry-screen setting. If a form synced from Meta doesn’t have a screen named WELCOME, send it
from an automation step instead, where the entry screen is editable.
Sending a form from the inbox needs an open 24-hour conversation window, the same as any other
free-form reply. It isn’t a template. If the window has closed, the form icon is disabled;
send an approved template to re-open it first. See WhatsApp limits.
A message template can carry a button that opens a form,
useful for re-engaging a contact outside the 24-hour window, since a template can reach them
when a plain form send can’t.
1
Add a button
While building a WhatsApp template, add a button and set its type to Open form. This
button type only exists on WhatsApp templates; Meta calls it a FLOW button, and no other
channel’s templates have buttons at all.
2
Choose the form
The Form picker only lists published, non-local forms; a draft can’t be attached to
a template button. Nothing published yet? No published forms yet — publish one in Bot Setup
› WhatsApp › Forms.
3
Set the screen
Screen defaults to WELCOME; change it if the form’s first screen is named differently.
A template allows one Open form button, alongside its other button-type limits (up to 2
URL buttons, 1 call button, 1 copy-code button, 10 buttons total). Saving submits the template
to Meta for approval like any other. See Message templates.
The automation step has one output, COMPLETED. It’s tempting to read that as “the contact
submitted the form”. It isn’t quite that simple.COMPLETED fires on the contact’s next message, whatever that message is. They submit the
form and it fires. They ignore the form and type hi instead, and it fires just the same. The
step itself cannot tell the two apart in the automation.So treat COMPLETED as the contact said something after we sent the form, not as proof they
filled it in. A neutral follow-up (an offer to help, a handover to a teammate) survives both
outcomes better than one that assumes a submission you can’t confirm happened from this port
alone.
Whether the form was sent from an automation, the inbox, or a template button, a real submission
is captured the moment it arrives:
It’s saved to the contact’s Flow answers panel on their contact profile:
question, answer and date, oldest first, capped at the last 50.
Each answer is labeled by the field’s internal name, not by the Label you wrote. A field
that came with a ready-made starting point keeps a readable name (full_name, phone,
email, message); one you added yourself with Add field gets a positional name like
field_2; a form synced from Meta uses the field name from Meta’s Flow Builder.
When a WhatsApp Form (Flow) step sent it, the answers also reach the automation itself.
Each one lands on the run as {{nfm.<field>}}, using that same internal name, so a later step
in the flow can put an answer into the message it sends:
Thanks {{nfm.full_name}}, we'll be in touch. It’s not in the builder’s variable picker, so
type it. Write that message so it still reads if the token comes out blank:
COMPLETED fires on any message, so a contact who typed
something instead of filling the form leaves it empty. See
Variables reference.
What you still can’t do is branch on an answer. A Condition step compares literal text
and has no field for a form answer, and {{last_message}} won’t help either: a submission’s
inbox bubble reads 📝 Form submitted, and nothing is stored as the reply text. If you need to
ask something and act on the answer inside the flow, use a normal question step instead, where
the reply is captured and can be branched on. The Request Phone Number step is the example
worth copying: it asks for a number and actually keeps it, saving it to the contact.
This step is at its best when the form itself does the work (a lead form, a claim or intake
form) and the flow’s job afterwards is to acknowledge it, not to decide anything from it.
The automation isn’t on a WhatsApp channel. The WhatsApp group of steps only appears on a
WhatsApp automation. Rebuild it on a WhatsApp channel; there’s no way
to add this step to a Messenger, Instagram, Telegram or SMS flow.
I can't edit a form
Only forms you designed in DMLY (tagged Designed in DMLY) are editable here. A form
Synced from Meta has to be changed in Meta’s own Flow Builder, then re-synced with Sync
from Meta.
Sync from Meta returns nothing
Either your WhatsApp Business account genuinely has no flows in it (build one in Meta’s Flow
Builder first) or the channel isn’t carrying the credentials the sync needs, in which case it
is skipped without an error. Reconnect the channel and try again.
The send-a-form icon is missing or greyed out from the inbox
It only appears on a WhatsApp conversation, and it’s disabled while the 24-hour window is
closed. If the window is closed, send an approved template to reopen it first.
No published forms show up for the template's Open form button
Only published forms are offered there; a draft, however complete, won’t appear. Open the
form in the Forms tab and select Publish.
A template says Requires WA Flow
Ready-made automations in the template library that contain this step
carry a Requires WA Flow chip until your workspace has at least one form, created in DMLY
or synced from Meta, draft or published. It’s a reminder, not a block: install the template
now and add a form afterwards. Until you do, the step has no form to send.
The form stopped sending after we renamed it in Meta
A step matching by a hand-typed name breaks the moment the form is renamed in Meta. Open the
step, run Sync from Meta, and pick the form from the Form picker instead; that matches
on the form’s ID and survives renames.
Nothing arrives and the flow stalls at this step
A send that fails outright fails the step rather than waiting, and the reason is written to
your logs. Look for a send_failed entry with the error from Meta.