← Blog

·

WhatsApp for food delivery and restaurants: orders and status via the API

Updated on October 25, 2026

With the official WhatsApp Business API, a restaurant can publish its menu in Meta’s catalog, receive the order the customer builds in WhatsApp’s own cart through a webhook, collect payment with Pix inside the chat, and send every status change (preparing, out for delivery, delivered) to the customer. Because the order starts with a customer message, almost the whole cycle happens inside the 24-hour customer service window, where free-form and interactive replies are service messages. Templates are needed only for notices outside that window and for the next-day review.

This guide walks through a delivery order end to end, with Cloud API payloads, the category of each message and operational tips. (Context: Pix is Brazil’s instant payment system, paid by copying a code into a bank app.)

The full order flow

StepWhat happensMessage type
Customer reaches out“Hi, I’d like to order” or a wa.me link clickInbound message, opens the 24 h window
MenuRestaurant sends the catalog or a selectioncatalog_message or product_list
CartCustomer picks items and sends the cartWebhook type: "order"
AddressRestaurant asks for locationlocation_request_message
PaymentRestaurant sends the summary with Pixorder_details
ConfirmationPSP confirms the Pix, restaurant updatesorder_status
Prep and delivery“Preparing”, “Out for delivery”, “Delivered”Text or order_status inside the window
ReviewSurvey about that orderUtility template, if outside the window

Each step uses a feature documented by Meta.

Menu in the catalog

Meta’s catalog supports products and services with name, description, price, image and availability. You upload the menu through Commerce Manager or the catalog API and connect the catalog to the WhatsApp account (catalogs overview).

There are three ways to show the menu in the chat:

  • Catalog message (catalog_message): a thumbnail with a “View catalog” button that opens the whole menu inside WhatsApp.
  • Multi-product message (product_list): up to 30 items in sections such as “Pizzas”, “Drinks” and “Desserts”. Meta lists re-ordering a regular take-out order as one of its uses.
  • Single product (product): highlights one item, such as the dish of the day.

A multi-product message with two sections:

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "product_list",
    "header": { "type": "text", "text": "Today's menu" },
    "body": { "text": "Pick your items and tap View cart to send the order." },
    "action": {
      "catalog_id": "367025965434465",
      "sections": [
        { "title": "Pizzas", "product_items": [
          { "product_retailer_id": "PIZZA-MARG" },
          { "product_retailer_id": "PIZZA-PEPP" } ] },
        { "title": "Drinks", "product_items": [
          { "product_retailer_id": "SODA-CAN" } ] }
      ]
    }
  }
}

The cart is enabled by default on each number and can be turned off in commerce settings. Sold-out items must leave the catalog (or be marked unavailable) before peak hours, or customers will order something the kitchen does not have. More in catalog and product messages.

Want to try it while you read? Create a Vectalk account and send your first message through the official API. Create free account →

Receiving the order via webhook

When the customer sends the cart, a message webhook arrives with type: "order", per the order webhook reference:

{
  "from": "5584999999999",
  "id": "wamid.HBgM...",
  "timestamp": "1761400000",
  "type": "order",
  "order": {
    "catalog_id": "367025965434465",
    "text": "No onions, please",
    "product_items": [
      { "product_retailer_id": "PIZZA-MARG", "quantity": 1, "item_price": 59.9, "currency": "BRL" },
      { "product_retailer_id": "SODA-CAN", "quantity": 2, "item_price": 7, "currency": "BRL" }
    ]
  }
}

Three details matter for the kitchen:

  • A sent cart cannot be edited. To change something, the customer sends a new cart. Your system must decide whether the new one replaces the old.
  • Notes arrive in order.text. “No onions” and cooking preferences come there. Show that field on the kitchen screen.
  • Recalculate the price in your system. Use product_retailer_id to fetch the current price and delivery fee rules instead of relying only on the webhook value.

Not every item fits a catalog: half-and-half pizzas or bowls with many add-ons usually need another interface. For those, an interactive list or a form built with WhatsApp Flows handles add-on selection inside the chat.

Address and location

For the address, a location_request_message shows a send-location button. The reply arrives in the webhook with latitude, longitude and, when available, an address (documentation):

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "location_request_message",
    "body": { "text": "To calculate the delivery fee, share your location or type the address with number and apartment." },
    "action": { "name": "send_location" }
  }
}

Always ask for the apartment or unit by text. Phone location does not always point to the right building or floor.

Paying with Pix in the chat

In Brazil, Meta offers the Orders API: you send an order_details message with items, total and a dynamic Pix code generated by your bank or payment service provider (PSP). The customer copies the code and pays in the bank app (dynamic Pix). Amounts are integers with offset 100: R$ 73.90 becomes 7390.

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "order_details",
    "body": { "text": "Order #2231: 1 margherita pizza and 2 sodas. Estimated delivery in 45 minutes." },
    "action": {
      "name": "review_and_pay",
      "parameters": {
        "reference_id": "order-2231",
        "type": "physical-goods",
        "payment_type": "br",
        "payment_settings": [
          { "type": "pix_dynamic_code", "pix_dynamic_code": {
            "code": "PIX_COPY_PASTE_CODE", "merchant_name": "Example Pizzeria LTDA",
            "key": "39580525000189", "key_type": "CNPJ" } }
        ],
        "currency": "BRL",
        "total_amount": { "value": 7390, "offset": 100 }
      }
    }
  }
}

The reference_id must be unique per order. WhatsApp does not reconcile payments: your PSP confirms the Pix, and your system notifies the customer with order_status. Payment on delivery (card machine or cash) is still possible; in that case, confirm the order by text. The Brazil payments overview also lists boleto and payment links.

Order status

After payment, the order_status message updates the order in the chat. Meta accepts the statuses pending, processing, partially_shipped, shipped, completed and canceled, and a captured payment shows the paid label (Orders API):

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "order_status",
    "body": { "text": "Payment confirmed! Your order #2231 is being prepared." },
    "action": {
      "name": "review_order",
      "parameters": {
        "reference_id": "order-2231",
        "order": { "status": "processing" },
        "payment": { "status": "captured", "timestamp": 1761400300 }
      }
    }
  }
}

A simple mapping for delivery:

Kitchen eventOrder statusSuggested text
Pix confirmedprocessing“Payment confirmed, order being prepared.”
Rider leftshipped“Your order is out for delivery.”
Deliveredcompleted“Order delivered. Enjoy your meal!”
Canceled before paymentcanceledReason in up to 120 characters

Cancellation fails if there is already a confirmed or pending payment for that order_details. In that case, handle the refund with the PSP and notify by text.

Cost and category of each message

The order starts with a customer message, which opens the 24-hour window. Inside it, text, catalog, order_details and order_status are service messages. Since October 1, 2026, each number gets 1,000 free service messages per month, and Meta charges from the 1,001st. Utility templates sent inside the window are now charged as utility (pricing page). So for status updates inside the window, prefer free-form messages or order_status over templates.

Outside the window, only templates:

MessageCategoryNote
Delay on yesterday’s order, refund processedUtilityOrder data, no offer
Survey about the delivered orderUtilityMust reference the order; a generic survey is not approved as utility
Weekly promo, coupon, “order again”MarketingRequires opt-in to offers

Category rules are in the categorization guidelines. Our article on utility messages in the service window explains the billing change.

Review after delivery

Meta accepts as utility a survey tied to a specific order, such as “We delivered your order {{1}}. If there was any issue, reach out below.” If delivery happened minutes ago, the window is still open and you can send quick-reply buttons without a template:

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "interactive",
  "interactive": {
    "type": "button",
    "body": { "text": "How did order #2231 arrive?" },
    "action": { "buttons": [
      { "type": "reply", "reply": { "id": "rate_2231_good", "title": "Arrived great" } },
      { "type": "reply", "reply": { "id": "rate_2231_issue", "title": "There was a problem" } }
    ] }
  }
}

If the customer taps “There was a problem”, hand the chat to a person. Our guide to post-sale and NPS goes further.

Operations at peak time

  • The kitchen does not read WhatsApp. Orders from the webhook should land in the same order system (KDS or printer) as other channels.
  • Several agents, one number. With the API, several people serve the same number through a support tool. See multiple agents on one number.
  • Opening hours. Outside opening hours, reply automatically with when the kitchen opens. See welcome, away and business hours messages.
  • Queue the webhook. Return 200 immediately and process the order in a queue so you do not lose events at peak.

How to do it with Vectalk

Vectalk is a proxy for Meta’s official WhatsApp Cloud API: catalog, product_list, order_details, order_status and location requests use the same payloads as Meta, sent to https://apis.vectalk.com.br/api/messages. The documentation has examples of product and catalog messages and commerce settings, which turn the cart on or off per number. With coexistence, the restaurant keeps its number on the WhatsApp Business app. Sign up at apps.vectalk.com.br/register.

Frequently asked questions

Do I need a catalog to take orders on WhatsApp?

No. You can take orders by text or interactive lists. The catalog helps because the order arrives structured, with item code and quantity.

Can customers pay with Pix without leaving WhatsApp?

They copy the Pix code in the chat and paste it into their bank app. Meta also describes a mode that opens the bank app directly, but as of this check it requires manual onboarding.

Is an “out for delivery” message charged?

If the 24-hour window is open, it is a service message: free up to 1,000 per number per month. If it is a template, it is charged as utility.

Can I send promotions to past customers?

Only with a marketing template and opt-in to offers. Placing an order is not the same as agreeing to promotions.

Does it work with the number the restaurant already uses on its phone?

Yes, with coexistence: the number stays on the WhatsApp Business app and also works with the API.


Official sources consulted on October 25, 2026: Catalogs overview, Multi-product messages, Commerce settings, Order webhook, Location request messages, Payments in Brazil, Orders API, Dynamic Pix, Template categorization, Pricing, Vectalk documentation.

Put your business on the official WhatsApp

Create your account, connect your number to the official API (you can keep the app with coexistence) and start serving customers and sending messages.