WhatsApp Custom Order Request Flow Template

A two-screen brief for made-to-order work such as cakes, bouquets, printed items and gift boxes. It captures the product type with starting prices, occasion, quantity, needed-by date, pickup or delivery and budget, then design notes, the message to put on the product and contact details.

2 screens 11 fields returned Flow JSON 7.2 Lead generation Bakeries, Florists, Print shops, Gift shops

Use Try it to fill the flow and see the exact response_json it returns.

custom-order-request.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "ORDER_BRIEF",
      "title": "Custom order request",
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_order_brief",
            "children": [
              {
                "type": "TextHeading",
                "text": "What would you like made?"
              },
              {
                "type": "TextBody",
                "text": "Share the basics and we will send you a quote. We will confirm availability for your date before anything is booked."
              },
              {
                "type": "RadioButtonsGroup",
                "name": "product_type",
                "label": "Product type",
                "data-source": [
                  {
                    "id": "celebration_cake",
                    "title": "Celebration cake",
                    "description": "Custom flavours and decoration. Order 5 days ahead.",
                    "metadata": "from $35"
                  },
                  {
                    "id": "cupcake_box",
                    "title": "Cupcakes or cookies",
                    "description": "Boxes of 6, 12 or 24 with themed toppers",
                    "metadata": "from $28"
                  },
                  {
                    "id": "floral_arrangement",
                    "title": "Flower arrangement",
                    "description": "Bouquets, table pieces and event flowers",
                    "metadata": "from $45"
                  },
                  {
                    "id": "gift_hamper",
                    "title": "Gift box or hamper",
                    "description": "Curated treats with a personalised card",
                    "metadata": "from $40"
                  },
                  {
                    "id": "printed_item",
                    "title": "Printed item",
                    "description": "Cards, banners, labels or invitations",
                    "metadata": "from $25"
                  },
                  {
                    "id": "other_custom",
                    "title": "Something else",
                    "description": "Tell us about it on the next screen",
                    "metadata": "Priced on request"
                  }
                ],
                "required": true
              },
              {
                "type": "Dropdown",
                "name": "occasion",
                "label": "Occasion",
                "data-source": [
                  {
                    "id": "birthday",
                    "title": "Birthday"
                  },
                  {
                    "id": "wedding",
                    "title": "Wedding or engagement"
                  },
                  {
                    "id": "anniversary",
                    "title": "Anniversary"
                  },
                  {
                    "id": "baby_shower",
                    "title": "Baby shower or gender reveal"
                  },
                  {
                    "id": "graduation",
                    "title": "Graduation"
                  },
                  {
                    "id": "corporate",
                    "title": "Corporate or client gift"
                  },
                  {
                    "id": "holiday",
                    "title": "Holiday or festival"
                  },
                  {
                    "id": "sympathy",
                    "title": "Sympathy"
                  },
                  {
                    "id": "just_because",
                    "title": "Just because"
                  },
                  {
                    "id": "other_occasion",
                    "title": "Other"
                  }
                ],
                "required": true
              },
              {
                "type": "TextInput",
                "name": "quantity",
                "label": "Quantity or servings",
                "input-type": "number",
                "required": true,
                "helper-text": "Servings for cakes, number of items for everything else"
              },
              {
                "type": "DatePicker",
                "name": "needed_by",
                "label": "Date you need it by",
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "fulfilment_method",
                "label": "Pickup or delivery",
                "data-source": [
                  {
                    "id": "pickup",
                    "title": "I will pick it up"
                  },
                  {
                    "id": "delivery",
                    "title": "Deliver it to me",
                    "description": "Local delivery, fee confirmed with your quote"
                  }
                ],
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "budget_range",
                "label": "Budget",
                "data-source": [
                  {
                    "id": "budget_under_75",
                    "title": "Under $75"
                  },
                  {
                    "id": "budget_75_150",
                    "title": "$75 - $150"
                  },
                  {
                    "id": "budget_150_300",
                    "title": "$150 - $300"
                  },
                  {
                    "id": "budget_over_300",
                    "title": "Over $300"
                  },
                  {
                    "id": "budget_flexible",
                    "title": "Not sure yet"
                  }
                ]
              },
              {
                "type": "Footer",
                "label": "Next: design details",
                "on-click-action": {
                  "name": "navigate",
                  "next": {
                    "type": "screen",
                    "name": "ORDER_DETAILS"
                  },
                  "payload": {}
                }
              }
            ]
          }
        ]
      }
    },
    {
      "id": "ORDER_DETAILS",
      "title": "Design and contact",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_order_details",
            "children": [
              {
                "type": "TextSubheading",
                "text": "Tell us how it should look"
              },
              {
                "type": "TextArea",
                "name": "design_notes",
                "label": "Design notes",
                "required": true,
                "helper-text": "Colours, theme, flavours, size, allergies. Example: pastel blue, nut-free",
                "max-length": 800
              },
              {
                "type": "TextInput",
                "name": "product_message",
                "label": "Message on product",
                "input-type": "text",
                "helper-text": "Exact wording, for example Happy 30th, Sam!",
                "max-chars": 60
              },
              {
                "type": "TextInput",
                "name": "full_name",
                "label": "Full name",
                "input-type": "text",
                "required": true
              },
              {
                "type": "TextInput",
                "name": "email",
                "label": "Email",
                "input-type": "email",
                "helper-text": "For your quote and order summary"
              },
              {
                "type": "TextArea",
                "name": "delivery_address",
                "label": "Delivery address",
                "helper-text": "Only needed if you chose delivery"
              },
              {
                "type": "TextCaption",
                "text": "Feel free to send inspiration photos in this chat after submitting. We will reply with a quote and confirm your date."
              },
              {
                "type": "Footer",
                "label": "Send my request",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "product_type": "${screen.ORDER_BRIEF.form.product_type}",
                    "occasion": "${screen.ORDER_BRIEF.form.occasion}",
                    "quantity": "${screen.ORDER_BRIEF.form.quantity}",
                    "needed_by": "${screen.ORDER_BRIEF.form.needed_by}",
                    "fulfilment_method": "${screen.ORDER_BRIEF.form.fulfilment_method}",
                    "budget_range": "${screen.ORDER_BRIEF.form.budget_range}",
                    "design_notes": "${form.design_notes}",
                    "product_message": "${form.product_message}",
                    "full_name": "${form.full_name}",
                    "email": "${form.email}",
                    "delivery_address": "${form.delivery_address}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/custom-order-request.json

Import in 60 seconds
  1. Copy the JSON above (or edit it first in the Flow Builder).
  2. In WhatsApp Manager, open Account tools > Flows, create a flow and choose Lead generation as the category.
  3. Paste into the JSON editor, check the preview, then Publish.
  4. Send it with the Flow ID, as an interactive message or through a template's Flow button.

Not technical? Skip the JSON and send it from Whautomate with a drag-and-drop editor.

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.

KeyComponentScreenRequiredReturnsExample
product_type
celebration_cake, cupcake_box, floral_arrangement, gift_hamper, printed_item, other_custom
RadioButtonsGroup ORDER_BRIEF Yes item id "celebration_cake"
occasion
birthday, 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_method
pickup, delivery
RadioButtonsGroup ORDER_BRIEF Yes item id "delivery"
budget_range
budget_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.

No developer needed

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.

1

Connect your number

Log in with Facebook and connect your WhatsApp number in a few minutes. No API keys or servers to set up.

2

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.

3

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.

4

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.

7-day free trial, no credit card required.

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.

response_json (parsed)
{
  "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"
}
POST your-webhook (full event)
{
  "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

bash
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

bash
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

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

send-custom-order-request.json
{
  "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"
        }
      }
    }
  }
}
bash
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.json

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

Frequently asked questions

Image upload needs the PhotoPicker component, which is outside what this static template uses. Ask customers to send inspiration photos as normal WhatsApp messages after they submit; they land in the same chat as the brief, so the designer sees both together.
An nfm_reply message with response_json containing the flow_token and all eleven fields. product_type, occasion, fulfilment_method and budget_range arrive as item ids such as celebration_cake or delivery, needed_by as YYYY-MM-DD, and the text fields as plain strings.
Not without an endpoint. Live pricing requires a data_exchange endpoint that returns a price for each combination of product, size and extras. This template shows starting prices in the item metadata and leaves the final quote to your team, which suits handmade work where every order differs.
LEAD_GENERATION fits best, because each submission is a quote request rather than a completed purchase. OTHER also works. The category is used for organisation in WhatsApp Manager and does not change how the flow renders.

The Complete Omnichannel Customer Engagement Platform

Go beyond free tools. Automate conversations, build AI chatbots, send broadcast campaigns, book appointments, sell products, and manage every messaging channel from one powerful platform. Trusted by thousands of businesses worldwide.

  • WhatsApp, Instagram, Messenger, Telegram & Live Chat
  • AI chatbots & no-code automation
  • Broadcast campaigns & analytics
  • Appointment & class booking
  • E-commerce, Shopify & WooCommerce integration
  • CRM, invoicing & payment collection

No credit card required. Free 7-day trial. Visit our pricing page for plans.