Skip to contentSkip to navigationSkip to topbar
On this page

twilio/flows



Overview

overview page anchor

Flows is an in-app, multi-screen experience available in WhatsApp. Flows can be sent as part of an approved content template. A business's end users can initiate a flow experience using a Flow button. Initiating a flow opens an in-app, multi-screen experience where businesses can add text, images, and solicit user input in multiple ways. Businesses can capture end user input via single-choice, multi-choice, toggles, short-text answers, long-text answers, and date pickers. You can organize these options in up to 10 screens.

(warning)

Flows limitations

Flows isn't designed to transmit HIPAA Eligible Service or PCI data and should not be used to transmit data in workflows that are subject to HIPAA or PCI compliance.

If you are transmitting sensitive information, use Message Redaction. Message Redaction isn't yet compatible with Studio, Proxy Service, and Functions. Don't send Flows containing sensitive information using these products and services because Message Redaction doesn't work with them.

Supported options for end users

supported-options-for-end-users page anchor
  • Businesses can send a multi-screen form of questions to their end users.
  • Get text input, selection, and picker answers to customizable questions.
  • Add images, links, and clarifying text on each screen.

WhatsApp


Flow content template 1 - chat conversation with Twilio Demo with a helpful link and response notification.
Flow content template 2 - Survey form with questions and option to complete.

To create a flow, follow these steps:

  1. Create a twilio/flows content template.
  2. Submit the content template for approval. Submit under the appropriate category (UTILITY or MARKETING) depending on the content of the flow and the message.
  3. Submission of a twilio/flows content template publishes the flow to WhatsApp. You can find the publishing status in the content template approvals. Currently, using flows without an approved content template isn't supported.
  4. Send the flow. For detailed instructions, see send templates created with the Content Template Builder.

Receive a flow submission

receive-a-flow-submission page anchor
  1. Prepare for the follow-up experience when the end user submits the flow.
  2. Review the incoming webhook containing the user's inputs to the flow questions.

ParameterTypeRequiredVariable supportDescription
bodystringYesYesText of the templated message delivering the flow.
Maximum length: 1,024 characters
subtitlestringNoNoFooter of the message.
Maximum length: 1,024 characters
media_urlstringNoNoControls media on the initial flow message.
typeenumYesNoPossible flow category values:
  • SIGN_UP
  • SIGN_IN
  • APPOINTMENT_BOOKING
  • LEAD_GENERATION
  • CONTACT_US
  • CUSTOMER_SUPPORT
  • SURVEY
  • OTHER
button_textstringYesNoControls the text of the button that initiates the flow.
pagesarrayYesNoContains the definitions of each page's components. Up to 10 pages.
PropertyTypeRequiredVariable supportDescription
idstringNoNoIdentifier returned in the webhook.
Maximum length: 20 characters
titlestringNoNoTitle text appearing above the flow page.
subtitlestringNoNoSubtitle text appearing within the flow page at the top of the page.
layoutarrayYesNoQuestions asked within the flow page. Contains one of the following components:
  • SHORT_TEXT
  • LONG_TEXT
  • SINGLE_SELECT
  • MULTI_SELECT
  • DATE_PICKER
  • LIST
  • TEXT_HEADING
  • TEXT_SUBHEADING
  • TEXT_CAPTION
  • TEXT_BODY
  • RICH_TEXT
  • MEDIA
  • FOOTER

SHORT_TEXT object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to SHORT_TEXT.
Maximum length: 80 characters
textYesstringYesHelper text.
labelYesstringYesQuestion being asked.
requiredNoBooleanNoSet to false by default. Whether the end user needs to answer the question
input_typeNoenumNoSet to text by default. Must be one of the following:
  • TEXT
  • NUMBER
  • EMAIL
  • PASSWORD
  • PASSCODE
  • PHONE

LONG_TEXT object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to LONG_TEXT.
Maximum length: 600 characters
textYesstringYesHelper text.
labelYesstringYesQuestion being asked.
requiredNoBooleanNoSet to false by default. Whether the end user needs to answer the question

SINGLE_SELECT object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to SINGLE_SELECT.
textYesstringYesHelper text.
labelYesstringYesQuestion being asked.
optionsYesstringYesStringified array of title and id. If variable is used must replace whole string with variable. Example:
"options": "[{\"id\":\"ff\",\"title\":\"Friends and family\"},{\"id\":\"oo\",\"title\":\"Online\"},{\"id\":\"ip\",\"title\":\"In person\"}]"
options.titleYesstringYesCan be variable if options is variable. Display title of option.
options.idYesstringYesCan be variable if options is variable. Id of option returned in webhook.

MULTI_SELECT object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to MULTI_SELECT.
textYesstringYesHelper text
labelYesstringYesQuestion being asked
optionsYesstringYesStringified array of title and id. If variable is used must replace whole string with variable. Example:
"options": "[{\"id\":\"ff\",\"title\":\"Friends and family\"},{\"id\":\"oo\",\"title\":\"Online\"},{\"id\":\"ip\",\"title\":\"In person\"}]"
options.titleYesstringYesCan be variable if options is variable. Display title of option.
options.idYesstringYesCan be variable if options is variable. Id of option returned in webhook.

DATE_PICKER object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to DATE_PICKER
labelYesstringYesQuestion being asked.
min_dateYesstringYesStart date. Format: YYYY-MM-DD
max_dateYesstringYesEnd date. Format: YYYY-MM-DD
unavailable_datesYesstringYesStringified array of unavailable dates. Format of dates: YYYY-MM-DD. Example: "unavailable_dates": "['\''2024-12-12'\'','\''2024-11-30'\'']"
nameNostringYesName of date picker object.

LIST object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to LIST.
labelYesstringYesQuestion being asked
optionsYesstringYesStringified array of title and id. If variable is used must replace whole string with variable. Example:
"options": "[{\"id\":\"ff\",\"title\":\"Friends and family\"},{\"id\":\"oo\",\"title\":\"Online\"},{\"id\":\"ip\",\"title\":\"In person\"}]"
options.titleYesstringYesCan be variable if options is variable. Display title of option.
options.idYesstringYesCan be variable if options is variable. Id of option returned in webhook.

TEXT_HEADING object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to TEXT_HEADING.
textYesstringYesMarkdown formatted text. Can enable text formatting, including hyperlinks, and all other functions described in the WhatsApp Components syntax cheat sheet(link takes you to an external page).

TEXT_SUBHEADING object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to TEXT_SUBHEADING.
textYesstringYesMarkdown formatted text. Can enable text formatting, including hyperlinks, and all other functions described in the WhatsApp Components syntax cheat sheet(link takes you to an external page).

TEXT_BODY object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to TEXT_BODY.
textYesstringYesMarkdown formatted text. Can enable text formatting, including hyperlinks, and all other functions described in the WhatsApp Components syntax cheat sheet(link takes you to an external page).

TEXT_CAPTION object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to TEXT_CAPTION.
textYesstringYesMarkdown formatted text. Can enable text formatting, including hyperlinks, and all other functions described in the WhatsApp Components syntax cheat sheet(link takes you to an external page).

RICH_TEXT object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to TEXT_CAPTION.
text_listYesarrayYesArray of strings. Markdown formatted text. Can enable text formatting, including hyperlinks, and all other functions described in the WhatsApp Components syntax cheat sheet(link takes you to an external page).

MEDIA object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to MEDIA.
urlYesstringYesImage within layout

FOOTER object

PropertyRequiredTypeVariable supportDescription
typeYesenumNoSet to FOOTER.
labelYesstringYesWhat is displayed in the button to continue the flow.

Code examples and responses

code-examples-and-responses page anchor
Content Templates API - Create a Flow TemplateLink to code sample: Content Templates API - Create a Flow Template
1
curl -X POST 'https://content.twilio.com/v1/Content' \
2
-H 'Content-Type: application/json' \
3
-u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN \
4
-d '{
5
"friendly_name": "info_flow",
6
"language": "en",
7
"types": {
8
"twilio/flows": {
9
"body": "Wow do we have something super cool for you! Thanks for your interest. we have a helpful link there too.",
10
"button_text": "See flow",
11
"subtitle": "Finish flow",
12
"pages": [
13
{
14
"id": "id_one",
15
"next_page_id": "id_two",
16
"title": "Page 1",
17
"layout": [
18
{
19
"label": "Name",
20
"type": "SHORT_TEXT",
21
"text": "Question 1",
22
"required": true
23
},
24
{
25
"label": "Email",
26
"type": "SHORT_TEXT",
27
"text": "Question 2",
28
"input_type": "EMAIL"
29
},
30
{
31
"label": "Address",
32
"type": "LONG_TEXT",
33
"text": "Question 3"
34
}
35
]
36
},
37
{
38
"id": "id_two",
39
"next_page_id": null,
40
"title": "Page 2",
41
"subtitle": "Subtitle of Page 2",
42
"layout": [
43
{
44
"label": "How did you find us?",
45
"type": "SINGLE_SELECT",
46
"options": "[{\"id\":\"ff\",\"title\":\"Friends and family\"},{\"id\":\"oo\",\"title\":\"Online\"},{\"id\":\"ip\",\"title\":\"In person\"}]"
47
},
48
{
49
"label": "What is your favorite number?",
50
"type": "MULTIPLE_SELECT",
51
"options": "[{\"id\":\"one\",\"title\":\"one one\"},{\"id\":\"two\",\"title\":\"two two\"},{\"id\":\"three\",\"title\":\"three three\"}]"
52
},
53
{
54
"type": "TEXT_BODY",
55
"text": "Go to [Google](https://www.google.com/) if you have any questions"
56
},
57
{
58
"type": "TEXT_CAPTION",
59
"text": "No seriously, go to [Google](https://www.google.com/) if you have any questions"
60
},
61
{
62
"label": "If other, tell us where",
63
"type": "SHORT_TEXT",
64
"text": "Question 6"
65
}
66
]
67
}
68
],
69
"type": "OTHER"
70
}
71
}
72
}'

Output

1
{
2
"account_sid": "ACXXXXXXXXXXXXX",
3
"date_created": "2025-01-22T22:35:25Z",
4
"date_updated": "2025-01-22T22:35:25Z",
5
"friendly_name": "info_flow",
6
"language": "en",
7
"links": {
8
"approval_create": "https://content.twilio.com/v1/Content/HXXXXXXXXXXXX/ApprovalRequests/whatsapp",
9
"approval_fetch": "https://content.twilio.com/v1/Content/HXXXXXXXXXXXX/ApprovalRequests"
10
},
11
"sid": "HXXXXXXXXXXXX",
12
"types": {
13
"twilio/flows": {
14
"body": "Wow do we have something super cool for you! Thanks for your interest. we have a helpful link there too.",
15
"button_text": "See flow",
16
"media_url": null,
17
"pages": [
18
{
19
"id": "id_one",
20
"layout": [
21
{
22
"input_type": "TEXT",
23
"label": "Name",
24
"name": null,
25
"required": true,
26
"text": "Question 1",
27
"type": "SHORT_TEXT"
28
},
29
{
30
"input_type": "EMAIL",
31
"label": "Email",
32
"name": null,
33
"required": null,
34
"text": "Question 2",
35
"type": "SHORT_TEXT"
36
},
37
{
38
"input_type": null,
39
"label": "Address",
40
"name": null,
41
"required": null,
42
"text": "Question 3",
43
"type": "LONG_TEXT"
44
}
45
],
46
"next_page_id": "id_two",
47
"subtitle": null,
48
"title": "Page 1"
49
},
50
{
51
"id": "id_two",
52
"layout": [
53
{
54
"label": "How did you find us?",
55
"name": null,
56
"options": "[{\"id\":\"ff\",\"title\":\"Friends and family\"},{\"id\":\"oo\",\"title\":\"Online\"},{\"id\":\"ip\",\"title\":\"In person\"}]",
57
"required": null,
58
"type": "SINGLE_SELECT"
59
},
60
{
61
"label": "What's your favorite number?",
62
"name": null,
63
"options": "[{\"id\":\"one\",\"title\":\"one one\"},{\"id\":\"two\",\"title\":\"two two\"},{\"id\":\"three\",\"title\":\"three three\"}]",
64
"required": null,
65
"type": "MULTIPLE_SELECT"
66
},
67
{
68
"text": "Go to [Google](https://www.google.com/) if you have any questions",
69
"type": "TEXT_BODY"
70
},
71
{
72
"text": "No seriously, go to [Google](https://www.google.com/) if you have any questions",
73
"type": "TEXT_CAPTION"
74
},
75
{
76
"input_type": "TEXT",
77
"label": "If other, tell us where",
78
"name": null,
79
"required": null,
80
"text": "Question 6",
81
"type": "SHORT_TEXT"
82
}
83
],
84
"next_page_id": null,
85
"subtitle": "Subtitle of Page 2",
86
"title": "Page 2"
87
}
88
],
89
"subtitle": "Finish flow",
90
"type": "OTHER"
91
}
92
},
93
"url": "https://content.twilio.com/v1/Content/HXXXXXXXXXXXX",
94
"variables": {}
95
}

Sending your message template

sending-your-message-template page anchor

Sending a flow template using content templates is the same as sending other types of content templates. For detailed instructions, see send templates created with the Content Template Builder.


Flow-specific webhook fields

flow-specific-webhook-fields page anchor
ComponentDescription
FlowDataRaw data string from the channel provider.
InteractiveDataAll information from the end user in a JSON-formatted field.