Skip to main content

WhatsApp Flows

This article explains what WhatsApp Flows are, how to build one in Meta, how to connect it to a Journey in charles, and what to do with the answers customers submit.

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:

  1. Click Copy Flow JSON in the Playground.

  2. Go to WhatsApp Manager > Flows > Create Flow.

  3. Enter the Flow name, and select a category and template.

  4. In the JSON editor, delete the existing content and paste in your copied JSON.

  5. If the JSON appears on a single line, select all, right-click, and choose Format Selection.

  6. 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.

  1. Open the Journey where you want to trigger the Flow, and add or open a Send message node.

  2. In the message editor, click the link/button icon in the left toolbar to add a button block.

  3. In the button's text field, enter the label the customer will see (for example "Start" or "Sign up").

  4. Click the button to open the Manage button panel on the right.

  5. Under Button type, select WhatsApp Flow.

  6. Under WhatsApp Flow, select the specific Flow you created and published in Meta (for example "Beauty Products Sign Up").

  7. Optional: click Open flow preview to check how the Flow looks before publishing the Journey.

  8. 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.

  1. Create one custom property per option, named to match the option (e.g. product_preference_skincare, product_preference_makeup).

  2. For each option, add a condition checking whether product_preferences contains that option's name.

  3. 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.

  1. Use the same conditions as above (one per option, checking product_preferences contains the option name).

  2. 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:

  1. 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).

  2. Data received by charles: the JSON shown in Section 4 for each screen.

  3. 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.

Did this answer your question?