About this support ticket flow
Support chats often open with "hi", "hello?" or "I have a problem", and the first few minutes of an agent's time go into finding out what the problem is. This flow replaces that opening with a single screen: the customer picks a category, says how urgent it is, adds an order or booking reference if they have one, and describes the issue in their own words.
The category Dropdown and priority radio give you two structured values to sort and route on, while the subject line, capped at 60 characters, gives agents a scannable one-line summary. The description is a TextArea with a length limit so customers can explain properly without pasting an entire email thread. A preferred reply time lets you avoid messaging someone during their working day when they told you evenings are better.
Everything fits on one screen on purpose. Support forms lose people with every extra tap, and a customer with a problem is already less patient than one who is browsing. The reference field is optional because many questions, such as billing or login issues, have no order or booking attached.
Fields this flow returns
When the customer taps the final button, the complete action sends these keys back in response_json. Fields from earlier screens are pulled in with global references (${screen.SCREEN_ID.form.field}), so nothing is lost between screens.
| Key | Component | Screen | Required | Returns | Example |
|---|---|---|---|---|---|
issue_categoryorder_delivery, billing_payment, booking_appointment, account_login, product_question, technical_problem, complaint, something_else |
Dropdown | SUPPORT_REQUEST | Yes | item id | "billing_payment" |
prioritylow, normal, urgent |
RadioButtonsGroup | SUPPORT_REQUEST | Yes | item id | "normal" |
reference_number |
TextInput | SUPPORT_REQUEST | No | string | "Order #10482" |
subject |
TextInput | SUPPORT_REQUEST | Yes | string | "Charged twice for one order" |
issue_description |
TextArea | SUPPORT_REQUEST | Yes | string | "I placed one order on Tuesday but my card statement shows two charges of $64.90. Please refund the duplicate payment." |
reply_timeanytime, morning, afternoon, evening |
Dropdown | SUPPORT_REQUEST | No | item id | "evening" |
Optional fields the customer leaves empty may be missing from response_json or arrive empty. Treat every optional key as nullable in your handler.
Send the Support Ticket flow without touching code
You do not need to be technical to use WhatsApp Flows. Connect your WhatsApp number, set the flow up in our drag-and-drop editor and send it to customers in a few clicks. No JSON, no API calls, no WhatsApp Manager.
Connect your number
Log in with Facebook and connect your WhatsApp number in a few minutes. No API keys or servers to set up.
Set up the flow
Start from a ready-made form or import this one, then drag fields in, change the wording and try it on a live phone preview. Click Publish when it looks right.
Send it anywhere
Send it from any chat in the Team Inbox, on web or mobile, send it automatically from an automation, or broadcast it to a list.
Get the answers
Every answer is saved on the customer's profile and chat, and your team can be notified the moment a form comes in.
Sample webhook payload (nfm_reply)
This is what your webhook receives when a customer submits the flow. response_json is a JSON string: parse it, then match flow_token to the record you created when you sent the message. The customer's WhatsApp number is in messages[0].from.
{
"flow_token": "bk_8f2c41",
"issue_category": "billing_payment",
"priority": "normal",
"reference_number": "Order #10482",
"subject": "Charged twice for one order",
"issue_description": "I placed one order on Tuesday but my card statement shows two charges of $64.90. Please refund the duplicate payment.",
"reply_time": "evening"
}
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
"changes": [
{
"field": "messages",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "15550001234",
"phone_number_id": "PHONE_NUMBER_ID"
},
"contacts": [
{
"profile": {
"name": "Alex Morgan"
},
"wa_id": "14155550123"
}
],
"messages": [
{
"context": {
"from": "15550001234",
"id": "wamid.SENT_FLOW_MESSAGE_ID"
},
"from": "14155550123",
"id": "wamid.INCOMING_MESSAGE_ID",
"timestamp": "1760000000",
"type": "interactive",
"interactive": {
"type": "nfm_reply",
"nfm_reply": {
"name": "flow",
"body": "Sent",
"response_json": "{\"flow_token\":\"bk_8f2c41\",\"issue_category\":\"billing_payment\",\"priority\":\"normal\",\"reference_number\":\"Order #10482\",\"subject\":\"Charged twice for one order\",\"issue_description\":\"I placed one order on Tuesday but my card statement shows two charges of $64.90. Please refund the duplicate payment.\",\"reply_time\":\"evening\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as support-ticket.json and run these calls with a system user token that has whatsapp_business_management and whatsapp_business_messaging permissions.
1. Create the flow
curl -X POST 'https://graph.facebook.com/v23.0/{WABA_ID}/flows' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Content-Type: application/json' \
-d '{"name": "support_ticket", "categories": ["CUSTOMER_SUPPORT"]}'
# => {"id": "{FLOW_ID}"}2. Upload the Flow JSON
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/assets' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-F '[email protected];type=application/json' \
-F 'name=flow.json' \
-F 'asset_type=FLOW_JSON'
# => {"success": true, "validation_errors": []}3. Publish it
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/publish' \
-H 'Authorization: Bearer {ACCESS_TOKEN}'Publishing is permanent: a published flow cannot be edited. To change it later, create a new flow (or clone it with clone_flow_id) and publish the new version.
4. Send it to a customer
Inside the 24-hour customer service window, send an interactive flow message. Outside it, create a message template with a Flow button that points to this flow, and send the template instead.
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "14155550123",
"type": "interactive",
"interactive": {
"type": "flow",
"header": {
"type": "text",
"text": "How can we help?"
},
"body": {
"text": "Tell us what is going on in one short form. Including your order or booking reference helps us sort it out faster."
},
"footer": {
"text": "Our team replies in this chat"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Open support request",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "SUPPORT_REQUEST"
}
}
}
}
}curl -X POST 'https://graph.facebook.com/v23.0/{PHONE_NUMBER_ID}/messages' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Content-Type: application/json' \
-d @send-support-ticket.jsonWhen to send it
Out-of-hours messages
When someone writes outside opening hours, reply with the flow so the request is fully described and waiting in the queue when your team starts the day.
"Help" or "problem" keywords
Send the form when a customer types "help", "support", "issue" or "not working", instead of a menu of numbered options they have to reply to.
Escalation from a chatbot
When a chatbot cannot answer a question, hand over with the flow so the human agent receives a structured summary rather than a long bot transcript.
Post-purchase help message
Add a "Get help" Flow button to an order or booking confirmation template, so customers with a problem later can open a request from that same message.
How to customise this template
- Build the category list from your last few hundred support chats. Use the top six to eight reasons as categories and keep "Something else" last; more than ten slows people down in a Dropdown.
- Change the reference helper text to show your real format, such as "Order #10482" for a store or "Booking BK-2291" for a studio, so customers know which number to look for.
- If you do not triage by urgency, remove the priority radio instead of keeping it for show. If you do, describe each level in the item description so "urgent" means the same thing to everyone.
- Swap the reply-time options for your staffed hours. A business closed on Sundays should not offer "Weekend" as a choice.
Open this template in the Flow Builder to make these changes visually. The builder keeps field names unique and regenerates the completion payload for you.
Common mistakes to avoid
- Almost everyone picks "Urgent" when it has no description. Define each priority level, for example "I cannot use the service right now", and route on it only if the definitions hold up.
- Do not promise a response time in the form that your team cannot meet. A caption such as "We usually reply within a few hours" is safer than a hard deadline.
- The reference field is free text, so a customer may type an email address or phone number instead. Validate it in your webhook handler before trying to match a record.
- Setting max-chars on the subject and max-length on the description helps readability, but tell customers about the limit in the helper text so they are not surprised when typing stops.
Structured requests, handled in one inbox
In Whautomate, import this flow into the built-in flow editor and click Publish. Agents send it from the Team Inbox in two clicks when a customer reports a problem, or an automation sends it for them. Each submission shows on the chat with every field laid out and can assign the chat to the right queue, so an agent can resolve it without asking follow-up questions.
- Send from the Team Inbox, web or mobile
- Route submissions to a queue or agent automatically
- Shopify and WooCommerce order triggers
7-day free trial, no credit card required.