About this custom order request flow
Custom orders are where small makers lose the most time in chat. A bakery asked for "a cake for Saturday" still needs the size, flavour, theme, wording, pickup or delivery and a rough budget before it can quote, and those answers usually arrive one at a time over a day or two. This flow turns the whole brief into two screens the customer fills in at once.
Screen one covers the commercial facts: what kind of product, what occasion, how many servings or units, the date it is needed by, how it gets to the customer and what they expect to spend. Each product option shows a starting price in its metadata, so a customer who expects a three-tier cake for $20 sees the real range before submitting. Screen two is the creative brief: design notes, the exact text to pipe, print or write on a card, and contact details, with the delivery address left optional for pickup orders.
The flow records a request, not a confirmed order. Your team reviews the brief, checks capacity for that date and replies with a quote in the chat. When the customer accepts, you can take payment and confirm in the same conversation, so there is no separate enquiry email to chase.
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 |
|---|---|---|---|---|---|
product_typecelebration_cake, cupcake_box, floral_arrangement, gift_hamper, printed_item, other_custom |
RadioButtonsGroup | ORDER_BRIEF | Yes | item id | "celebration_cake" |
occasionbirthday, wedding, anniversary, baby_shower, graduation, corporate, holiday, sympathy, just_because, other_occasion |
Dropdown | ORDER_BRIEF | Yes | item id | "birthday" |
quantity |
TextInput (number) | ORDER_BRIEF | Yes | string | "20" |
needed_by |
DatePicker | ORDER_BRIEF | Yes | YYYY-MM-DD | "2026-11-07" |
fulfilment_methodpickup, delivery |
RadioButtonsGroup | ORDER_BRIEF | Yes | item id | "delivery" |
budget_rangebudget_under_75, budget_75_150, budget_150_300, budget_over_300, budget_flexible |
RadioButtonsGroup | ORDER_BRIEF | No | item id | "budget_75_150" |
design_notes |
TextArea | ORDER_DETAILS | Yes | string | "Two tiers, chocolate sponge with raspberry filling. Pastel blue and gold, with a small number 30 topper. Nut-free please." |
product_message |
TextInput | ORDER_DETAILS | No | string | "Happy 30th, Sam!" |
full_name |
TextInput | ORDER_DETAILS | Yes | string | "Alex Morgan" |
email |
TextInput (email) | ORDER_DETAILS | No | string | "[email protected]" |
delivery_address |
TextArea | ORDER_DETAILS | No | string | "14 Harbour View Road, Apt 3B, Springfield 20145" |
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 Custom Order Request 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",
"product_type": "celebration_cake",
"occasion": "birthday",
"quantity": "20",
"needed_by": "2026-11-07",
"fulfilment_method": "delivery",
"budget_range": "budget_75_150",
"design_notes": "Two tiers, chocolate sponge with raspberry filling. Pastel blue and gold, with a small number 30 topper. Nut-free please.",
"product_message": "Happy 30th, Sam!",
"full_name": "Alex Morgan",
"email": "[email protected]",
"delivery_address": "14 Harbour View Road, Apt 3B, Springfield 20145"
}
{
"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\",\"product_type\":\"celebration_cake\",\"occasion\":\"birthday\",\"quantity\":\"20\",\"needed_by\":\"2026-11-07\",\"fulfilment_method\":\"delivery\",\"budget_range\":\"budget_75_150\",\"design_notes\":\"Two tiers, chocolate sponge with raspberry filling. Pastel blue and gold, with a small number 30 topper. Nut-free please.\",\"product_message\":\"Happy 30th, Sam!\",\"full_name\":\"Alex Morgan\",\"email\":\"[email protected]\",\"delivery_address\":\"14 Harbour View Road, Apt 3B, Springfield 20145\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as custom-order-request.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": "custom_order_request", "categories": ["LEAD_GENERATION"]}'
# => {"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": "Let's make something for you"
},
"body": {
"text": "Tell us what you have in mind and when you need it. We will reply with a quote and a few design questions if needed."
},
"footer": {
"text": "Quotes are free, no commitment"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Request custom order",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "ORDER_BRIEF"
}
}
}
}
}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-custom-order-request.jsonWhen to send it
Instagram or ad enquiries
People who see a finished cake or bouquet on social media and message "how much for one like this?" get the brief form as the reply, so the quote conversation starts with real details.
Busy-season lead time
Before Valentine's Day, Mother's Day or graduation season, broadcast the flow to past customers through a Flow-button template so orders arrive early, with dates you can plan around.
Corporate and bulk requests
Branded cupcakes, event programmes or client gift hampers involve quantities and budgets that are easy to misread in chat. The structured quantity and budget fields remove the guesswork.
Link in bio or website button
Point a click-to-chat link at your number with a prefilled "custom order" message, and have your chatbot answer that keyword with the flow.
How to customise this template
- Replace the product types and their "from $" metadata with your own ranges. Keep metadata to 20 characters, which is enough for "from $35" or "Priced on request".
- Use the product description to state your lead time, for example "Order 5 days ahead". Customers then pick a realistic needed-by date without being told off later.
- If you only do pickup, delete the fulfilment radio and the delivery address TextArea. If you deliver to set zones, list the zones as radio options instead of taking a free-text address.
- Change the budget bands to match your price points. For a florist, $40, $75 and $120 bands tell you far more than "low, medium, high".
- Rename the product message field for your trade: "Cake inscription" for a bakery, "Card message" for a florist, "Text to print" for a print shop. Keep the label within 20 characters.
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
- A static flow cannot block fully booked dates. Say "we will confirm availability" on the first screen, and check capacity before promising the date in your reply.
- The needed-by date comes back as YYYY-MM-DD. Compare it to your lead time in the customer's local date, not a UTC timestamp, or a same-week order can look a day earlier than it is.
- Customers often put the inscription inside the design notes, or the notes inside the inscription. Show an example in each helper text so the text you pipe or print is exactly what they wanted.
- Do not make the delivery address required. Pickup customers will type "N/A" or a random address to get past it, and that bad data ends up on a delivery run.
Take real orders inside WhatsApp
Whautomate includes a built-in store checkout flow: products, customer details, address and shipping, coupon codes and the order itself, with an optional payment request sent right after. It is created and published for you and runs on an endpoint Whautomate hosts.
- Live products and coupon checks
- Order created on submit
- Optional payment request after checkout
7-day free trial, no credit card required.