{"id":2182,"date":"2026-09-30T13:10:59","date_gmt":"2026-09-30T13:10:59","guid":{"rendered":"https:\/\/360dialog.com\/blog\/?p=2182"},"modified":"2026-10-01T09:06:58","modified_gmt":"2026-10-01T09:06:58","slug":"whatsapp-flows","status":"publish","type":"post","link":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/","title":{"rendered":"WhatsApp Flows: How to Build Forms and Collect Data Inside WhatsApp"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>WhatsApp Flows is a Cloud API feature that lets you build multi-screen forms directly inside a WhatsApp conversation.<\/strong> Users tap through input fields, dropdowns, and date pickers without leaving the chat, and your system receives the collected data as structured JSON. Meta describes Flows as a way to build structured interactions for business messaging, for tasks like lead generation and product recommendations.[1] If you are building on the <a href=\"https:\/\/360dialog.com\/blog\/whatsapp-cloud-api-or-business-api\/\">WhatsApp Cloud API<\/a>, Flows give you a native way to collect structured input at the point of conversation. A Flow opens when a user taps a call-to-action button on an interactive message or a template message (the pre-approved message type a business can send at any time), and the form itself runs inside WhatsApp.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"key-takeaways\" class=\"wp-block-heading\">Key Takeaways<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flows require the WhatsApp Cloud API and a WhatsApp Business account (WABA). Meta is splitting the WABA into two accounts: a WhatsApp account, which holds your business phone number, and a Messaging account, which holds your templates and billing.<\/li>\n\n\n\n<li>A Flow without a data endpoint (a URL on your server that the Flow calls for live data) collects form responses and submits them when the user finishes. A Flow with an endpoint exchanges data with your server in real time.<\/li>\n\n\n\n<li>A Flow can have up to 100 screens, but Meta recommends keeping each task under 5 minutes and each screen focused on a single task.<\/li>\n\n\n\n<li>Flows that exchange data with your server need an RSA 2048-bit key pair, with the public key signed through the 360Dialog encryption endpoint.<\/li>\n\n\n\n<li>The cost of a Flow is the cost of the message that carries it. <a href=\"https:\/\/360dialog.com\/blog\/whatsapp-service-message-charging-october-2026\/\" data-type=\"link\" data-id=\"https:\/\/360dialog.com\/blog\/whatsapp-service-message-charging-october-2026\/\">From October 1, 2026<\/a>, Meta also charges for replies sent inside the 24-hour customer service window, the period after a user&#8217;s last message when you can reply without a template.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div style=\"background:#DEF080;color:#092F32;border-radius:24px 0 24px 0;padding:24px 28px;margin:32px 0;\">\n<p style=\"margin:0;\">Ready to build your first Flow? <strong>360Dialog<\/strong> provides Cloud API access, encryption key management, and the infrastructure to create and deploy Flows, priced per number per month with no markup on Meta fees. <a href=\"https:\/\/360dialog.com\/whatsapp-api\" style=\"color:#0D6367;text-decoration:underline;\"><strong>Get API access<\/strong><\/a>.<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"what-are-whatsapp-flows-and-how-do-they-work\" class=\"wp-block-heading\">What Are WhatsApp Flows and How Do They Work?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WhatsApp Flows is a structured interaction framework built into the WhatsApp Business Platform that lets businesses define multi-screen forms using a JSON definition, render those forms natively inside WhatsApp, and receive user responses as structured JSON payloads via webhook. The user never leaves the chat. Flows consist of screens (each screen is a node in a state machine), components (the UI elements on each screen), and actions (the logic that moves between screens or submits data).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Flow starts when a user taps a call-to-action button attached to either an interactive message (type <code>\"flow\"<\/code>) or a template message (button type <code>FLOW<\/code>). The button opens the first screen, which contains the layout, components, and navigation logic defined in your Flow JSON. The user fills in fields and taps through screens. On the final screen, the <code>complete<\/code> action submits the fields listed in its payload back to your system as a JSON payload delivered via webhook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The core difference from other data collection methods in WhatsApp:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Data Structure<\/th><th>User Experience<\/th><th>Best For<\/th><\/tr><\/thead><tbody><tr><td>WhatsApp Flows<\/td><td>Structured JSON payload<\/td><td>Tappable form screens in-chat<\/td><td>Lead capture, booking, surveys, order forms<\/td><\/tr><tr><td>Template quick replies<\/td><td>Single button selection<\/td><td>User taps one predefined option<\/td><td>Confirmations, opt-ins (consent to receive messages), simple routing<\/td><\/tr><tr><td>Free-text collection<\/td><td>Unstructured text<\/td><td>User types open responses<\/td><td>Open feedback, support conversations<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flows solve a specific problem: collecting structured data from users who are already in a WhatsApp conversation. If you need a name, an email, a date, and a preference in a single interaction, Flows let you collect all four in one tappable form. Free-text collection requires multiple message rounds and parsing logic on your backend to extract the same fields.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you need a Cloud API number to start building Flows, <a href=\"https:\/\/360dialog.com\/whatsapp-api\">get API access<\/a> through 360Dialog.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"static-vs-dynamic-flows-which-type-do-you-need\" class=\"wp-block-heading\">Static vs Dynamic Flows: Which Type Do You Need?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The practical distinction is whether your Flow connects to a data endpoint. A Flow without a data endpoint defines all its content in the Flow JSON and collects user input locally. A Flow with a data endpoint sends encrypted requests to your server at runtime and receives data that populates the next screen. The two labels describe data-handling approaches that determine how much backend infrastructure you need.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Without a data endpoint:<\/strong> The Flow JSON defines every screen, component, and navigation path at design time. User input is collected locally and submitted as a JSON payload when the Flow completes. This approach works for lead capture forms, feedback surveys, and registration flows where every field is known in advance. The main actions are <code>navigate<\/code> (to move between screens) and <code>complete<\/code> (to end the Flow and return the data). No server is involved until the final submission arrives via webhook.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>With a data endpoint:<\/strong> The Flow sends encrypted POST requests to your HTTPS endpoint at runtime using the <code>data_exchange<\/code> action.[2][4] Your server decrypts the request, processes the data, and returns the content for the next screen. This enables appointment booking with live availability, product catalogs with real-time inventory, or any scenario where screen content depends on the user&#8217;s previous selections or your backend state. Requests to your endpoint time out after 10 seconds, and Meta recommends a <code>flow_token<\/code> expiration of 2 to 3 days to give users time to engage.[6]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both approaches use the same Flow JSON structure and the same components. The choice depends on whether your screens need data from your server at runtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>To connect Flow submissions to your existing automation stack, see how <a href=\"https:\/\/360dialog.com\/integrations\">WhatsApp integrations<\/a> work with 360Dialog.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"what-components-can-you-use-in-a-flow\" class=\"wp-block-heading\">What Components Can You Use in a Flow?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Flows offer over 20 component types across input, display, navigation, and conditional categories. Each screen supports up to 50 components and uses a single-column layout (SingleColumnLayout, a vertical flexbox).[3] Meta limits the Flow JSON content itself to 10 MB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Core input components:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TextInput:<\/strong> Single-line text, email, phone, number, password, or passcode. Supports regex validation (v6.2 and later). Maximum 80 characters by default.<\/li>\n\n\n\n<li><strong>TextArea:<\/strong> Multi-line text input, 600 characters by default.<\/li>\n\n\n\n<li><strong>Dropdown:<\/strong> Single selection from up to 200 options (100 with images).<\/li>\n\n\n\n<li><strong>RadioButtonsGroup:<\/strong> Single selection from up to 20 options. Meta recommends a Dropdown once you have 8 or more options.<\/li>\n\n\n\n<li><strong>CheckboxGroup:<\/strong> Multiple selection from up to 20 options.<\/li>\n\n\n\n<li><strong>DatePicker:<\/strong> Date selection with timezone-independent formatting (v5.0 and later).<\/li>\n\n\n\n<li><strong>CalendarPicker:<\/strong> Single date or date range selection (v6.1 and later).<\/li>\n\n\n\n<li><strong>OptIn:<\/strong> Consent checkbox, up to 5 per screen.<\/li>\n\n\n\n<li><strong>ChipsSelector:<\/strong> Compact multi-option selector for 2 to 20 options (v6.3 and later).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Display components include TextHeading, TextSubheading, TextBody, TextCaption, RichText (v5.1 and later, for longer text formatted with markdown), Image (up to 3 per screen), and ImageCarousel (v7.1 and later).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Navigation components include Footer (required on terminal screens, maximum 35 characters), EmbeddedLink (up to 2 per screen), and NavigationList (v6.2 and later). Media upload components (DocumentPicker and PhotoPicker, v4.0 and later) let users attach files directly within the Flow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conditional components (<code>If<\/code> and <code>Switch<\/code>, available from v4.0) let you show or hide elements based on user input or data values, and <code>If<\/code> components can be nested up to 3 levels. The <code>update_data<\/code> action (v6.0 and later) enables real-time screen updates based on user interactions without a server round-trip, which is useful for cascading dropdowns or calculated fields.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For setup steps on 360Dialog, see the <a href=\"https:\/\/docs.360dialog.com\/docs\/messaging\/flows\">Flows documentation at docs.360dialog.com<\/a>. The full component reference is in Meta&#8217;s components documentation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"how-do-you-create-a-flow-via-the-api-the-360dialog-path\" class=\"wp-block-heading\">How Do You Create a Flow via the API? (The 360Dialog Path)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Creating a Flow through 360Dialog follows five steps: generate an RSA key pair, upload your public key, write the Flow JSON, configure the endpoint, and send the Flow to users. Steps 1, 2 and 4 are only needed for Flows that exchange data with your server, and Meta lists the key pair as part of endpoint setup. WhatsApp Manager also has a Flows Builder with a live preview, and the API path lets you manage the Flow JSON from your own systems. Either way, a Flow can have up to 100 screens.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Generate your RSA key pair.<\/strong> Create a 2048-bit RSA key pair using OpenSSL:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl genrsa -des3 -out private.pem 2048\nopenssl rsa -in private.pem -outform PEM -pubout -out public.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Store the private key securely. You will use it to decrypt incoming data from Flows.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Upload your public key to 360Dialog.<\/strong> Sign and upload the key via the 360Dialog encryption endpoint:[5]<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>POST https:\/\/waba-v2.360dialog.io\/whatsapp_business_encryption<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Send the full public key (including BEGIN and END markers) as <code>business_public_key<\/code> in the request body. The endpoint returns <code>{\"success\": true}<\/code> on success. You can verify the key status with a GET request to the same URL.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Write the Flow JSON.<\/strong> Define your screens, layouts, components, and navigation actions. The JSON requires a <code>version<\/code> field and a <code>screens<\/code> array at minimum. Use the Flow JSON version Meta currently recommends (7.3): versions up to 5.0 are frozen and can no longer be published.[7] Each screen has an <code>id<\/code>, a <code>layout<\/code> block, and optional <code>data<\/code> and <code>title<\/code> fields. At least one screen must be marked <code>terminal<\/code>, and every terminal screen needs a Footer. For Flows with an endpoint, also set <code>data_api_version<\/code> (Meta recommends <code>\"4.0\"<\/code>; <code>\"3.0\"<\/code> is still supported) and a <code>routing_model<\/code> that lists which screens can follow each other.<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Configure your data endpoint (dynamic Flows only).<\/strong> Set the <code>endpoint_uri<\/code> via the Flows API. Your endpoint must accept HTTPS POST requests with a valid TLS\/SSL certificate. All payloads are encrypted using RSA 2048-bit (OAEP-SHA256) for key exchange and AES-128-GCM for the data payload. Validate incoming requests using the <code>X-Hub-Signature-256<\/code> header with your app secret. Your endpoint must also respond to health check pings: <code>{\"action\": \"ping\"}<\/code> expects <code>{\"data\": {\"status\": \"active\"}}<\/code>.<\/li>\n<\/ol>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Send the Flow to users.<\/strong> Attach the Flow to an interactive message (type <code>\"flow\"<\/code>) or a template message (button type <code>FLOW<\/code>). An interactive Flow message needs <code>flow_message_version<\/code> set to <code>\"3\"<\/code>, the button text in <code>flow_cta<\/code>, and either a <code>flow_id<\/code> or a <code>flow_name<\/code>.[8] The Meta changelog lists <code>flow_token<\/code> as optional; set one when you need to match each response to a session or user. With <code>flow_action<\/code> set to <code>\"navigate\"<\/code> (the default), <code>flow_action_payload<\/code> names the first screen and can pre-populate fields when you already know user data from the conversation context.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">360Dialog, as an Official Meta Solution Partner, provides the encryption endpoint and API infrastructure that handles key management for Flows. Code examples for endpoint decryption are available in Python, Node.js, PHP, Java, C#, and Go in the Meta developer documentation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you are new to the WhatsApp Business API, start by <a href=\"https:\/\/360dialog.com\/blog\/how-to-get-your-first-waba-approved\/\">getting your WhatsApp account approved<\/a> before creating Flows.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"three-worked-examples-with-flow-json\" class=\"wp-block-heading\">Three Worked Examples with Flow JSON<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following examples show the JSON structure for three common use cases. Each uses Flow JSON version 7.3, the version Meta currently recommends. The full component and action reference is in the Meta Flow JSON documentation.<\/p>\n\n\n\n<h3 id=\"lead-capture-form-single-screen-no-endpoint\" class=\"wp-block-heading\">Lead Capture Form (Single Screen, No Endpoint)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A minimal lead capture form with a name field, an interest selector, and a consent checkbox:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"version\": \"7.3\",\n  \"screens\": &#91;{\n    \"id\": \"LEAD_FORM\",\n    \"title\": \"Get in touch\",\n    \"terminal\": true,\n    \"layout\": {\n      \"type\": \"SingleColumnLayout\",\n      \"children\": &#91;\n        {\"type\": \"TextInput\", \"name\": \"full_name\",\n         \"label\": \"Full name\", \"required\": true,\n         \"input-type\": \"text\"},\n        {\"type\": \"RadioButtonsGroup\", \"name\": \"interest\",\n         \"label\": \"Area of interest\", \"required\": true,\n         \"data-source\": &#91;\n           {\"id\": \"sales\", \"title\": \"Sales\"},\n           {\"id\": \"support\", \"title\": \"Support\"},\n           {\"id\": \"partnership\", \"title\": \"Partnership\"}\n        ]},\n        {\"type\": \"OptIn\", \"name\": \"consent\",\n         \"label\": \"I agree to receive updates\"},\n        {\"type\": \"Footer\", \"label\": \"Submit\",\n         \"on-click-action\": {\n           \"name\": \"complete\",\n           \"payload\": {\n             \"full_name\": \"${form.full_name}\",\n             \"interest\": \"${form.interest}\",\n             \"consent\": \"${form.consent}\"\n           }\n        }}\n      ]\n    }\n  }]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>complete<\/code> action on the Footer ends the Flow and sends the fields listed in its payload to your webhook, so list every field you need. The webhook delivers a message with type <code>\"interactive\"<\/code> and interactive type <code>\"nfm_reply\"<\/code>, whose <code>response_json<\/code> field is a JSON string containing the <code>flow_token<\/code> and those field values.<\/p>\n\n\n\n<h3 id=\"feedback-form-two-screens-no-endpoint\" class=\"wp-block-heading\">Feedback Form (Two Screens, No Endpoint)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A two-screen feedback form collects a rating on the first screen and optional comments on the second:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"version\": \"7.3\",\n  \"screens\": &#91;\n    {\n      \"id\": \"RATING\",\n      \"title\": \"Feedback 1 of 2\",\n      \"layout\": {\n        \"type\": \"SingleColumnLayout\",\n        \"children\": &#91;\n          {\"type\": \"TextHeading\",\n           \"text\": \"How was your experience?\"},\n          {\"type\": \"RadioButtonsGroup\",\n           \"name\": \"rating\", \"label\": \"Rating\",\n           \"required\": true,\n           \"data-source\": &#91;\n             {\"id\": \"5\", \"title\": \"Excellent\"},\n             {\"id\": \"4\", \"title\": \"Good\"},\n             {\"id\": \"3\", \"title\": \"Average\"},\n             {\"id\": \"2\", \"title\": \"Poor\"}\n          ]},\n          {\"type\": \"Footer\", \"label\": \"Next\",\n           \"on-click-action\": {\n             \"name\": \"navigate\",\n             \"next\": {\"type\": \"screen\", \"name\": \"COMMENTS\"},\n             \"payload\": {}\n          }}\n        ]\n      }\n    },\n    {\n      \"id\": \"COMMENTS\",\n      \"title\": \"Feedback 2 of 2\",\n      \"terminal\": true,\n      \"layout\": {\n        \"type\": \"SingleColumnLayout\",\n        \"children\": &#91;\n          {\"type\": \"TextArea\", \"name\": \"comments\",\n           \"label\": \"Comments (optional)\",\n           \"required\": false},\n          {\"type\": \"Footer\", \"label\": \"Submit\",\n           \"on-click-action\": {\n             \"name\": \"complete\",\n             \"payload\": {\n               \"rating\": \"${screen.RATING.form.rating}\",\n               \"comments\": \"${form.comments}\"\n             }\n          }}\n        ]\n      }\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>navigate<\/code> action moves the user to the second screen with an empty payload. From Flow JSON v4.0 onward, any screen can read another screen&#8217;s input with the global syntax <code>${screen.RATING.form.rating}<\/code>, so the <code>complete<\/code> action on the last screen submits both the rating and the comments.<\/p>\n\n\n\n<h3 id=\"appointment-booking-dynamic-with-endpoint\" class=\"wp-block-heading\">Appointment Booking (Dynamic, With Endpoint)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A dynamic Flow uses the <code>data_exchange<\/code> action to request available time slots from your server, then shows them on a second screen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"version\": \"7.3\",\n  \"data_api_version\": \"4.0\",\n  \"routing_model\": {\n    \"BOOKING\": &#91;\"SLOTS\"],\n    \"SLOTS\": &#91;]\n  },\n  \"screens\": &#91;\n    {\n      \"id\": \"BOOKING\",\n      \"title\": \"Book an appointment\",\n      \"layout\": {\n        \"type\": \"SingleColumnLayout\",\n        \"children\": &#91;\n          {\"type\": \"DatePicker\", \"name\": \"date\",\n           \"label\": \"Select a date\", \"required\": true},\n          {\"type\": \"Footer\",\n           \"label\": \"Check availability\",\n           \"on-click-action\": {\n             \"name\": \"data_exchange\",\n             \"payload\": {\"date\": \"${form.date}\"}\n          }}\n        ]\n      }\n    },\n    {\n      \"id\": \"SLOTS\",\n      \"title\": \"Choose a time\",\n      \"terminal\": true,\n      \"data\": {\n        \"available_slots\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\"type\": \"string\"},\n              \"title\": {\"type\": \"string\"}\n            }\n          },\n          \"__example__\": &#91;\n            {\"id\": \"1\", \"title\": \"08:00\"},\n            {\"id\": \"2\", \"title\": \"09:00\"}\n          ]\n        }\n      },\n      \"layout\": {\n        \"type\": \"SingleColumnLayout\",\n        \"children\": &#91;\n          {\"type\": \"Dropdown\", \"name\": \"slot\",\n           \"label\": \"Available times\", \"required\": true,\n           \"data-source\": \"${data.available_slots}\"},\n          {\"type\": \"Footer\", \"label\": \"Confirm booking\",\n           \"on-click-action\": {\n             \"name\": \"complete\",\n             \"payload\": {\n               \"date\": \"${screen.BOOKING.form.date}\",\n               \"slot\": \"${form.slot}\"\n             }\n          }}\n        ]\n      }\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When the user selects a date and taps the footer, the Flow sends an encrypted POST request to your endpoint containing the selected date. Your server decrypts the request using your RSA private key and AES-128-GCM, queries available slots, and returns an encrypted response with the next screen (<code>\"screen\": \"SLOTS\"<\/code>) and a <code>data<\/code> object containing <code>available_slots<\/code>. The user picks a time, and the <code>complete<\/code> action sends the date and slot to your webhook. Send this Flow with <code>flow_action<\/code> set to <code>\"navigate\"<\/code> and the first screen set to <code>BOOKING<\/code>, so opening the Flow does not call your endpoint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"how-do-you-design-a-flow-people-finish\" class=\"wp-block-heading\">How Do You Design a Flow People Finish?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Meta&#8217;s best practices for Flows focus on keeping each task short and each screen simple, so users can finish what they started. To measure your own results, the Flows Builder in WhatsApp Manager shows interaction statistics for published Flows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meta&#8217;s documented best practices:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep each screen to one task, and keep the total Flow under 5 minutes.<\/li>\n\n\n\n<li>Write a CTA that tells the user exactly what happens when they tap it. Keep the button text short: the 360Dialog docs set a 20-character limit with no emoji.<\/li>\n\n\n\n<li>Use the right component for the input type: DatePicker for dates, Dropdown for 8 or more options, RadioButtonsGroup for a single choice from fewer options, CheckboxGroup for multiple selections.<\/li>\n\n\n\n<li>Build for caching: once a user completes a screen and moves on, WhatsApp caches that screen&#8217;s data. A user who exits loses what they entered on the current screen, so several short screens put less data at risk than one long one.<\/li>\n\n\n\n<li>End multi-step Flows with a summary screen so the user can review before submitting.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For broader context on how Flows fit into your messaging workflows, see our <a href=\"https:\/\/360dialog.com\/blog\/whatsapp-automation-connect-your-business-number-to-any-tool\/\">WhatsApp automation guide<\/a>.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"what-do-flows-cost\" class=\"wp-block-heading\">What Do Flows Cost?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Meta charges per delivered message, so the cost of a Flow is the cost of the message that carries its button.[9] 360Dialog&#8217;s plans are priced per number per month and list no separate charge for Flows. If you send the Flow inside a template message, you pay the rate for that template&#8217;s category (marketing, utility, or authentication), which varies by country.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you send the Flow as an interactive message in reply to a user, it goes out inside the 24-hour customer service window. From October 1, 2026, Meta charges these replies as service messages, at the same rate as utility and authentication messages in that market, and also charges utility templates sent inside the window.[10] Messages from users, including a submitted Flow, are not charged. For current per-message rates by country, see the 360Dialog <a href=\"https:\/\/360dialog.com\/pricing\">pricing page<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SaaS companies and resellers that want to expose Flows through their own products can <a href=\"https:\/\/360dialog.com\/blog\/how-to-build-whatsapp-into-your-saas\/\">build WhatsApp into your SaaS<\/a> using the 360Dialog Partner Platform, which provides the API infrastructure for multi-tenant deployments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you are ready to build your first Flow, <a href=\"https:\/\/360dialog.com\/whatsapp-api\">get API access<\/a> through 360Dialog and, if your Flow uses an endpoint, follow the key pair setup steps in our Flows documentation.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"frequently-asked-questions\" class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 id=\"can-i-send-a-flow-inside-a-template-message\" class=\"wp-block-heading\">Can I Send a Flow Inside a Template Message?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. You attach a Flow to a template message by adding a button with type FLOW during template creation. The button identifies the Flow by its ID or name, and names the first screen when the button&#8217;s action is navigate. When the user taps the button, the Flow opens inside the chat. The template itself goes through the standard <a href=\"https:\/\/360dialog.com\/blog\/why-your-whatsapp-templates-keep-getting-rejected\/\">WhatsApp template approval<\/a> process, so make sure your template content and the Flow&#8217;s purpose align with Meta&#8217;s commerce and messaging policies.<\/p>\n\n\n\n<h3 id=\"what-do-you-need-to-send-a-flow\" class=\"wp-block-heading\">What Do You Need to Send a Flow?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You need a business phone number registered on the WhatsApp Cloud API. Any business can start building Flows in WhatsApp Manager, and to publish and send them, Meta requires a verified business and high message quality.<\/p>\n\n\n\n<h3 id=\"can-i-test-a-flow-before-publishing\" class=\"wp-block-heading\">Can I Test a Flow Before Publishing?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. The Flows Builder in WhatsApp Manager has an interactive preview that behaves like a real device and sends real requests to your endpoint if the Flow has one. You can also send the draft to a test phone, from the Builder&#8217;s Send option or through the API with mode set to draft. Draft messages show a warning banner on the device, and the test phone must have messaged your number within the last 24 hours. Flows created since November 2024 stay editable after publishing, through the API or the Builder, and keep the same Flow ID.<\/p>\n\n\n\n<h3 id=\"what-happens-to-user-input-if-they-close-the-flow-midway\" class=\"wp-block-heading\">What Happens to User Input If They Close the Flow Mid-Way?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WhatsApp caches a screen&#8217;s data once the user completes it and moves to the next screen. Data entered on the current screen, before the user taps the Footer button, is lost if they exit. Meta recommends splitting multi-field forms across several short screens for this reason, so less data is at risk if the user leaves before finishing.<\/p>\n\n\n\n<h3 id=\"is-the-data-encrypted\" class=\"wp-block-heading\">Is the Data Encrypted?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. All data exchanged between the Flow and your endpoint uses RSA 2048-bit key exchange (OAEP-SHA256) combined with AES-128-GCM payload encryption. The incoming request contains three fields: encrypted_flow_data, encrypted_aes_key, and initial_vector. You decrypt the AES key with your RSA private key, then decrypt the payload with AES-GCM. Your response is encrypted with the same AES key using a flipped initialization vector. The full encryption implementation guide, with code examples in six languages, is in the Meta developer documentation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"sources\" class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">[1] Meta, &#8220;WhatsApp Flows,&#8221; developers.facebook.com\/docs\/whatsapp\/flows. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[2] Meta, &#8220;Flow JSON Reference,&#8221; developers.facebook.com\/docs\/whatsapp\/flows\/reference\/flowjson. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[3] Meta, &#8220;Components Reference,&#8221; developers.facebook.com\/docs\/whatsapp\/flows\/reference\/components. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[4] Meta, &#8220;Implementing Your Flow Endpoint,&#8221; developers.facebook.com\/docs\/whatsapp\/flows\/guides\/implementingyourflowendpoint. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[5] 360Dialog, &#8220;Flows,&#8221; docs.360dialog.com\/docs\/messaging\/flows. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[6] Meta, &#8220;Best Practices,&#8221; developers.facebook.com\/docs\/whatsapp\/flows\/guides\/bestpractices. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[7] Meta, &#8220;Changelog,&#8221; developers.facebook.com\/docs\/whatsapp\/flows\/changelogs. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[8] Meta, &#8220;Sending a Flow,&#8221; developers.facebook.com\/documentation\/business-messaging\/whatsapp\/flows\/guides\/sendingaflow. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[9] Meta, &#8220;Pricing on the WhatsApp Business Platform,&#8221; developers.facebook.com\/docs\/whatsapp\/pricing. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[10] Meta, &#8220;Upcoming Pricing Updates for Meta Business Agent, Service and Utility Messages,&#8221; developers.facebook.com\/documentation\/business-messaging\/whatsapp\/pricing\/non-template-messages. Accessed September 29, 2026.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"inLanguage\": \"en-US\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I Send a Flow Inside a Template Message?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. You attach a Flow to a template message by adding a button with type FLOW during template creation. The button identifies the Flow by its ID or name, and names the first screen when the button's action is navigate. When the user taps the button, the Flow opens inside the chat. The template itself goes through the standard WhatsApp template approval process, so make sure your template content and the Flow's purpose align with Meta's commerce and messaging policies.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What Do You Need to Send a Flow?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"You need a business phone number registered on the WhatsApp Cloud API. Any business can start building Flows in WhatsApp Manager, and to publish and send them, Meta requires a verified business and high message quality.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I Test a Flow Before Publishing?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. The Flows Builder in WhatsApp Manager has an interactive preview that behaves like a real device and sends real requests to your endpoint if the Flow has one. You can also send the draft to a test phone, from the Builder's Send option or through the API with mode set to draft. Draft messages show a warning banner on the device, and the test phone must have messaged your number within the last 24 hours. Flows created since November 2024 stay editable after publishing, through the API or the Builder, and keep the same Flow ID.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What Happens to User Input If They Close the Flow Mid-Way?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"WhatsApp caches a screen's data once the user completes it and moves to the next screen. Data entered on the current screen, before the user taps the Footer button, is lost if they exit. Meta recommends splitting multi-field forms across several short screens for this reason, so less data is at risk if the user leaves before finishing.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the Data Encrypted?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. All data exchanged between the Flow and your endpoint uses RSA 2048-bit key exchange (OAEP-SHA256) combined with AES-128-GCM payload encryption. The incoming request contains three fields: encrypted_flow_data, encrypted_aes_key, and initial_vector. You decrypt the AES key with your RSA private key, then decrypt the payload with AES-GCM. Your response is encrypted with the same AES key using a flipped initialization vector. The full encryption implementation guide, with code examples in six languages, is in the Meta developer documentation.\"\n      }\n    }\n  ]\n}\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.<\/p>\n","protected":false},"author":5,"featured_media":2185,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_360d_jsonld":"[{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"inLanguage\":\"en-US\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Can I Send a Flow Inside a Template Message?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. You attach a Flow to a template message by adding a button with type FLOW during template creation. The button identifies the Flow by its ID or name, and names the first screen when the button's action is navigate. When the user taps the button, the Flow opens inside the chat. The template itself goes through the standard WhatsApp template approval process, so make sure your template content and the Flow's purpose align with Meta's commerce and messaging policies.\"}},{\"@type\":\"Question\",\"name\":\"What Do You Need to Send a Flow?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You need a business phone number registered on the WhatsApp Cloud API. Any business can start building Flows in WhatsApp Manager, and to publish and send them, Meta requires a verified business and high message quality.\"}},{\"@type\":\"Question\",\"name\":\"Can I Test a Flow Before Publishing?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. The Flows Builder in WhatsApp Manager has an interactive preview that behaves like a real device and sends real requests to your endpoint if the Flow has one. You can also send the draft to a test phone, from the Builder's Send option or through the API with mode set to draft. Draft messages show a warning banner on the device, and the test phone must have messaged your number within the last 24 hours. Flows created since November 2024 stay editable after publishing, through the API or the Builder, and keep the same Flow ID.\"}},{\"@type\":\"Question\",\"name\":\"What Happens to User Input If They Close the Flow Mid-Way?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"WhatsApp caches a screen's data once the user completes it and moves to the next screen. Data entered on the current screen, before the user taps the Footer button, is lost if they exit. Meta recommends splitting multi-field forms across several short screens for this reason, so less data is at risk if the user leaves before finishing.\"}},{\"@type\":\"Question\",\"name\":\"Is the Data Encrypted?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. All data exchanged between the Flow and your endpoint uses RSA 2048-bit key exchange (OAEP-SHA256) combined with AES-128-GCM payload encryption. The incoming request contains three fields: encrypted_flow_data, encrypted_aes_key, and initial_vector. You decrypt the AES key with your RSA private key, then decrypt the payload with AES-GCM. Your response is encrypted with the same AES key using a flipped initialization vector. The full encryption implementation guide, with code examples in six languages, is in the Meta developer documentation.\"}}]}]","footnotes":""},"categories":[223],"tags":[271],"class_list":["post-2182","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-product-updates","tag-whatsapp-automation"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog<\/title>\n<meta name=\"description\" content=\"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/360dialog.com\/blog\/whatsapp-flows\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog\" \/>\n<meta property=\"og:description\" content=\"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/360dialog.com\/blog\/whatsapp-flows\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog | 360Dialog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-30T13:10:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-01T09:06:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"360Dialog Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"360Dialog Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/\"},\"author\":{\"name\":\"360Dialog Team\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#\\\/schema\\\/person\\\/672f939134088149fd9003ed45f243b8\"},\"headline\":\"WhatsApp Flows: How to Build Forms and Collect Data Inside WhatsApp\",\"datePublished\":\"2026-09-30T13:10:59+00:00\",\"dateModified\":\"2026-10-01T09:06:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/\"},\"wordCount\":2905,\"publisher\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/whatsapp-flows.png\",\"keywords\":[\"WhatsApp Automation\"],\"articleSection\":[\"Product Updates\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/\",\"url\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/\",\"name\":\"WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/whatsapp-flows.png\",\"datePublished\":\"2026-09-30T13:10:59+00:00\",\"dateModified\":\"2026-10-01T09:06:58+00:00\",\"description\":\"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#primaryimage\",\"url\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/whatsapp-flows.png\",\"contentUrl\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/whatsapp-flows.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/whatsapp-flows\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WhatsApp Flows: How to Build Forms and Collect Data Inside WhatsApp\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/\",\"name\":\"360Dialog\",\"description\":\"360Dialog Blog\",\"publisher\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#organization\",\"name\":\"360Dialog\",\"url\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Logo-360Dialog.svg\",\"contentUrl\":\"https:\\\/\\\/360dialogblog.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Logo-360Dialog.svg\",\"width\":208,\"height\":42,\"caption\":\"360Dialog\"},\"image\":{\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/360dialog.com\\\/blog\\\/#\\\/schema\\\/person\\\/672f939134088149fd9003ed45f243b8\",\"name\":\"360Dialog Team\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog","description":"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/","og_locale":"en_US","og_type":"article","og_title":"WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog","og_description":"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.","og_url":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/","og_site_name":"Blog | 360Dialog","article_published_time":"2026-09-30T13:10:59+00:00","article_modified_time":"2026-10-01T09:06:58+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png","type":"image\/png"}],"author":"360Dialog Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"360Dialog Team","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#article","isPartOf":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/"},"author":{"name":"360Dialog Team","@id":"https:\/\/360dialog.com\/blog\/#\/schema\/person\/672f939134088149fd9003ed45f243b8"},"headline":"WhatsApp Flows: How to Build Forms and Collect Data Inside WhatsApp","datePublished":"2026-09-30T13:10:59+00:00","dateModified":"2026-10-01T09:06:58+00:00","mainEntityOfPage":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/"},"wordCount":2905,"publisher":{"@id":"https:\/\/360dialog.com\/blog\/#organization"},"image":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#primaryimage"},"thumbnailUrl":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png","keywords":["WhatsApp Automation"],"articleSection":["Product Updates"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/","url":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/","name":"WhatsApp Flows: Build Forms Inside WhatsApp | 360Dialog","isPartOf":{"@id":"https:\/\/360dialog.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#primaryimage"},"image":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#primaryimage"},"thumbnailUrl":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png","datePublished":"2026-09-30T13:10:59+00:00","dateModified":"2026-10-01T09:06:58+00:00","description":"WhatsApp Flows lets you build multi-screen forms inside WhatsApp chats. Learn to create Flows via the Cloud API with JSON examples and design best practices.","breadcrumb":{"@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/360dialog.com\/blog\/whatsapp-flows\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#primaryimage","url":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png","contentUrl":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/09\/whatsapp-flows.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/360dialog.com\/blog\/whatsapp-flows\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/360dialog.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WhatsApp Flows: How to Build Forms and Collect Data Inside WhatsApp"}]},{"@type":"WebSite","@id":"https:\/\/360dialog.com\/blog\/#website","url":"https:\/\/360dialog.com\/blog\/","name":"360Dialog","description":"360Dialog Blog","publisher":{"@id":"https:\/\/360dialog.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/360dialog.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/360dialog.com\/blog\/#organization","name":"360Dialog","url":"https:\/\/360dialog.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/360dialog.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/04\/Logo-360Dialog.svg","contentUrl":"https:\/\/360dialogblog.com\/wp-content\/uploads\/2026\/04\/Logo-360Dialog.svg","width":208,"height":42,"caption":"360Dialog"},"image":{"@id":"https:\/\/360dialog.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/360dialog.com\/blog\/#\/schema\/person\/672f939134088149fd9003ed45f243b8","name":"360Dialog Team"}]}},"_links":{"self":[{"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/posts\/2182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/comments?post=2182"}],"version-history":[{"count":5,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/posts\/2182\/revisions"}],"predecessor-version":[{"id":2193,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/posts\/2182\/revisions\/2193"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/media\/2185"}],"wp:attachment":[{"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/media?parent=2182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/categories?post=2182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/360dialog.com\/blog\/wp-json\/wp\/v2\/tags?post=2182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}