1. What is a WhatsApp Flow?
WhatsApp Flows let you build structured, app-like forms inside a WhatsApp chat. Instead of asking a customer several questions one message at a time, you show them a form with fields like text input, dropdowns, date pickers, and selection menus, all on one screen.
This is useful anywhere you need structured information from a customer, for example:
Lead generation
Appointment booking
Customer surveys
Product configuration
Event registration
A Flow is triggered from a button inside a Journey message. When the customer taps it, the form opens inside WhatsApp. When they finish, their answers are sent back to charles.
2. Creating a WhatsApp Flow in Meta
Before you can use a Flow in a Journey, it needs to exist in Meta. You create a WhatsApp Flow by building it in the WhatsApp Flows Playground and importing the JSON into WhatsApp Manager. Here is a recording of building a flow within the playground.
Step 1: Design your Flow in the Playground
The Playground lets you visually build and preview your Flow before importing it into WhatsApp Manager.
Start by outlining the number of screens your Flow needs.
Name each screen descriptively (for example "Beauty and Wellness" or "Product Preferences") to make tracking easier later.
Each screen has editable content. Click + Add Content to add elements. We recommend no more than 3 items per screen to keep the experience clean.
The content types available are:
Type | Description |
Text | Headers, body text, and captions |
Media | Photos only (JPEG/PNG, max 300KB) |
Text Answer | Short answer, paragraph, date picker, email, phone, number. This data is sent to charles. |
Selection | Single choice, multiple choice, dropdown, opt-in. This data is sent to charles. |
Step 2: Configure your screens
For each screen, configure the questions and answer options relevant to that step of the Flow. In the example above, the "Product Preferences" screen uses a Single Choice question for skin type (Oily, Dry, Mixed, Normal) and a Checkbox Group for product categories.
Step 3: Import into WhatsApp Manager
Once your Flow is ready:
Click Copy Flow JSON in the Playground.
Go to WhatsApp Manager > Flows > Create Flow.
Enter the Flow name, and select a category and template.
In the JSON editor, delete the existing content and paste in your copied JSON.
If the JSON appears on a single line, select all, right-click, and choose Format Selection.
Click Save, then Publish.
Tips and customization:
Data source IDs are customizable. For example, instead of
"0_Oily"you can change the id value to"Oily". This is what gets stored and used in charles, so cleaner values make downstream logic easier.You can edit a Flow after publishing. Make your changes in the JSON editor, then Save and Publish again.
Flow JSON errors are shown at the bottom of the editor. Resolve all errors before publishing.
3. Connecting a WhatsApp Flow to a Journey in charles
Once your Flow is created and approved in Meta, you add it to a Journey as a button on a message node.
Open the Journey where you want to trigger the Flow, and add or open a Send message node.
In the message editor, click the link/button icon in the left toolbar to add a button block.
In the button's text field, enter the label the customer will see (for example "Start" or "Sign up").
Click the button to open the Manage button panel on the right.
Under Button type, select WhatsApp Flow.
Under WhatsApp Flow, select the specific Flow you created and published in Meta (for example "Beauty Products Sign Up").
Optional: click Open flow preview to check how the Flow looks before publishing the Journey.
Note the Response variable name. charles generates this automatically from the Flow's name (for example
beauty_products_sign_up). This is the variable you'll use later in the Journey to access the customer's answers, so keep track of it.
When a customer taps the button and completes the Flow, their answers are sent back into the Journey automatically, stored under the response variable from step 8.
4. Which data can be collected, and what it looks like
The fields available in a WhatsApp Flow are:
Field type | Example use |
Text input | First name, email address |
Date picker | Birthdate |
Opt-in | Marketing consent checkbox |
Single-select | Skin type |
Multi-select | Product preferences |
Dropdown | Dermatologist visit frequency |
The exact shape of the data charles receives depends on how each field was configured in Meta. Two Flows using the same field type can still return slightly different data if the fields were set up differently. The examples below show typical output for each type.
Text, date, and opt-in fields
These field names and this structure are illustrative. Please confirm the exact keys against a real test submission before publishing, since naming can vary depending on how the fields were labeled in Meta.
Single-select and multi-select fields
Single-select returns one value. Multi-select returns an array of all selected values.
Dropdown fields
Dropdown fields behave like single-select: the customer picks one option, and charles receives that single value.
5. Saving Flow answers to a contact
Once a Flow answer reaches charles, you can save it to the customer's contact profile as a custom property, a tag, or both.
Custom property: best when you want to reuse the value later, for example in a personalized message or an export.
Tag: best when you want to segment contacts using tag-based tooling.
How you do this differs depending on the field type.
Text, date, and single-select fields
Placeholder, to be confirmed once tested. These fields return one value with no array, so the expected setup is a direct mapping: an Update Contact node that maps the flow variable straight to a custom property, or a single condition and Assign Tag node if you need a tag instead. We'll confirm the exact node configuration once tested against a live Flow.
Multi-select fields
A multi-select field, such as product preferences, sends back all selected options together as an array, nested inside the field's variable:
Because charles cannot loop over an array directly in the flow builder, you check for each possible option individually: one condition per option, checking whether product_preferences contains that option's name, placed one after another in your flow. What you connect after each condition determines whether the result lands in a custom property or a tag.
How Contacts See WhatsApp Flow Data Types in WhatsApp
Option A: One custom property per option
This keeps each selection individually trackable, while storing the result as a custom property rather than a tag. Using the option's own name as the value (rather than a plain "Yes/No") means the property stays usable in message personalization and reads clearly in exports.
Create one custom property per option, named to match the option (e.g.
product_preference_skincare,product_preference_makeup).For each option, add a condition checking whether
product_preferencescontains that option's name.If true, connect it to an Update Contact node:
Action: Store in a custom property
Custom property: the matching property (e.g.
product_preference_skincare)Expected type: Text input
Source: Static
Value: the option name (e.g.
Skin-Care)
Repeat for every option. A field with six options means six conditions, each followed by its own Update Contact node.
Option B: One tag per option
Same per-option granularity as Option A, but using tags. Useful if your segmentation or campaign tooling is built around tags rather than properties.
Use the same conditions as above (one per option, checking
product_preferencescontains the option name).Instead of an Update Contact node, connect each condition to an Assign Tag node for that option.
Choosing between the two:
| Best for | Trade-off |
Property per option | Segmentation while keeping data as properties, and reusing the value in message templates | One condition + node per option |
Tag per option | Segmentation using tag-based tooling | One condition + node per option |
You can also combine both: properties for values you want to reuse in templates or exports, tags for values you want to use for campaign segmentation.
Dropdown fields
Placeholder, to be confirmed once tested. Dropdown fields return one value, similar to single-select, so the expected setup follows the same pattern above. We'll confirm this once tested.
6. Example: Beauty and Wellness lead generation flow
Bringing the pieces together, here is a full example using the screens above.
A skincare brand wants to capture new leads and their preferences through WhatsApp:
Flow fields: full name, email, birthday, and opt-in consent (screen 1), followed by skin type and product preferences (screen 2), followed by dermatologist visit frequency (screen 3).
Data received by charles: the JSON shown in Section 4 for each screen.
What happens with it:
Full name, email, and birthday are saved as custom properties, for personalization and for syncing to a CRM.
Opt-in is saved as a property used to control whether marketing messages are sent.
Skin type is saved as a single custom property.
Product preferences are saved as one tag per selected option, so the brand can segment by interest.
Dermatologist visit frequency is saved as a property and used later to route the contact into a relevant follow-up Journey.




