Skip to content

This term

Order Details Message

The WhatsApp Payments API (India) message that shows an itemised bill in chat with a Review and pay button, settled by UPI or a linked gateway.

Also called: order_details · Review and pay message · In-chat checkout · Checkout button template

Often confused with

Payment Link

A hosted checkout URL from a payment gateway, sent in a WhatsApp message or button, that lets a customer pay by UPI, card or netbanking in a few taps.

Read the Payment Link entry

Send a bill and see what comes back

2 / 2
POSThttps://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages

POST 200 in 650 ms

Request

3 headers · body
POST /v26.0/{PHONE_NUMBER_ID}/messages HTTP/1.1
Host: graph.facebook.com
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "919812345678",
"type": "interactive",
"interactive": {
"type": "order_details",
"body": {
"text": "Your bakery order is ready to pay. Tap below to review the bill."
},
"footer": {
"text": "Delivery today, 5–7 pm"
},
"action": {
"name": "review_and_pay",
"parameters": {
"reference_id": "BLR-CAKE-0412",
"type": "physical-goods",
"beneficiaries": [
{
"name": "Kavya R",
"address_line1": "12, 4th Cross, Indiranagar",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"postal_code": "560038"
}
],
"currency": "INR",
"total_amount": {
"value": 189000,
"offset": 100
},
"payment_settings": [
{
"type": "payment_gateway",
"payment_gateway": {
"type": "{GATEWAY}",
"configuration_name": "blr-bakery-pg"
}
}
],
"order": {
"status": "pending",
"catalog_id": "194836987003835",
"items": [
{
"retailer_id": "CAKE-CUSTOM-1KG",
"name": "Custom cake, 1 kg",
"amount": {
"value": 120000,
"offset": 100
},
"quantity": 1
},
{
"retailer_id": "CUPCAKE-DOZEN",
"name": "Cupcakes, one dozen",
"amount": {
"value": 36000,
"offset": 100
},
"quantity": 2
}
],
"subtotal": {
"value": 192000,
"offset": 100
},
"tax": {
"value": 9600,
"offset": 100,
"description": "GST"
},
"shipping": {
"value": 7400,
"offset": 100
},
"discount": {
"value": 20000,
"offset": 100,
"description": "Festive offer"
},
"expiration": {
"timestamp": "1792413000",
"description": "Pay within 2 hours to keep today's slot"
}
}
}
}
}
}

Response

200 OK
HTTP/1.1 200 OK
Content-Type: application/json
{
"messaging_product": "whatsapp",
"contacts": [
{
"input": "919812345678",
"wa_id": "919812345678"
}
],
"messages": [
{
"id": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAERgSQzVGNkQ0QjE4RTlBQjM2AA=="
}
]
}
Try another response
A real-shaped order_details request in payment-gateway mode. Press Send for the accepted response, or switch scenarios to see a bill whose totals do not add up and an expired token (error bodies illustrative).

Response: 200 OK after 650 ms.

What is an order details message?

The order details message is the native checkout of WhatsApp Payments, Meta's Payments API for India. Instead of sending a link, the business sends an interactive message of type: "order_details": the customer sees the items, quantities, tax, delivery charge, discount and total inside the chat, taps Review and pay, and completes the payment through UPI apps or a payment gateway without leaving WhatsApp. It is for businesses in India collecting in INR from customers on Indian numbers.

The action has name: "review_and_pay" and a parameters object: a reference_id unique to this bill (up to 35 characters — letters, digits, _, -, .), type (digital-goods or physical-goods, the latter with beneficiaries for shipped goods), currency: "INR", a total_amount, the payment route, and an order with status: "pending", items and subtotal, plus optional tax, shipping, discount and expiration. Every amount is an integer value with offset: 100, so 21000 means 210.00, and the arithmetic must be exact: item amount × quantity sums to the subtotal, and subtotal + tax + shipping − discount equals the total.

Meta documents two routes. In payment-gateway mode (often called Deep Integration), payment_settings names a gateway account linked to the WhatsApp Business Account as a payment configuration; Meta reports the result in the statuses webhook, as an entry of type: "payment", and supports refunds. In UPI intent mode, payment_settings instead carries a upi_intent_link your gateway generated for this order; the customer pays in their UPI app, and confirmation comes from your gateway's webhook and Meta's payment lookup API. Either way the business closes the loop with an order_status message — processing, partially-shipped, shipped, completed or canceled — carrying the same reference_id. That message is narrower than an order status update in general, which is a utility template that works however the order was paid.

A common flow starts with the in-chat cart: the customer sends a cart, the business re-prices it on its own server and answers with an order details message. A payment link is the simpler alternative: it works with any gateway and in any country but leaves the chat for a hosted page. The order details message keeps the whole checkout native, at the cost of a payment configuration and more backend work. Meta's order-details flows for other markets, such as Pix in Brazil, are separate products with their own fields and rules; this page covers India.

Key takeaways

  • An order details message is an interactive order_details message that shows an itemised INR bill in chat with a Review and pay button.
  • Amounts are integers with offset 100, and subtotal + tax + shipping − discount must equal total_amount exactly.
  • It is paid through a gateway linked in WhatsApp Manager or a gateway-generated UPI intent, by customers on Indian numbers.
  • Each bill needs a unique reference_id of up to 35 characters, which the order_status follow-up reuses.
  • Confirm the payment through Meta's lookup API or your gateway before fulfilling; Meta advises against relying on webhooks alone.

An order details message: key facts and limits

Interactive type
order_details, action name review_and_pay
reference_id
Unique per bill, up to 35 characters
Amounts
Integer value with offset 100 (paise)
Currency
INR only
Totals rule
subtotal + tax + shipping − discount = total
Payment routes
Linked payment gateway, or UPI intent
Follow-up message
order_status: processing, partially-shipped, shipped, completed, canceled
Expiration
Optional, at least 300 seconds ahead

How does an order details message work?

  1. Step 1

    Link a payment configuration

    Gateway mode: link an account with one of the gateways Meta supports for this mode in WhatsApp Manager, and note the payment configuration name you will reference when sending. UPI intent mode: have your gateway generate a UPI intent per order (it carries the merchant VPA, merchant category code, purpose code and transaction reference).

  2. Step 2

    Compute the bill on your server

    Build items, subtotal, tax, shipping and discount from your own prices in integer paise (offset: 100), and assert that the totals add up exactly before sending anything.

  3. Step 3

    Send order_details

    Inside the 24-hour window, POST an interactive order_details message to /{PHONE_NUMBER_ID}/messages with a fresh reference_id. Outside the window, use an approved order details (checkout button) template.

  4. Step 4

    Wait for real confirmation

    In gateway mode, watch for a statuses entry with type: "payment" and status: "captured"; in UPI intent mode, your gateway's webhook. Meta advises not relying on webhooks alone, so confirm through its payment lookup API (by reference_id) or your gateway before fulfilling.

  5. Step 5

    Update with order_status

    Send order_status with the same reference_id — processing once paid, then shipped, completed or canceled. completed and canceled are final, and cancelling fails once the customer has paid (error 2047, "Cannot cancel order").

An order details message in code

curl -X POST "https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "919812345678",
"type": "interactive",
"interactive": {
"type": "order_details",
"body": { "text": "Your bakery order is ready to pay." },
"action": {
"name": "review_and_pay",
"parameters": {
"reference_id": "BLR-CAKE-0412",
"type": "physical-goods",
"beneficiaries": [{
"name": "Kavya R", "address_line1": "12, 4th Cross, Indiranagar",
"city": "Bengaluru", "state": "Karnataka", "country": "India", "postal_code": "560038"
}],
"currency": "INR",
"total_amount": { "value": 189000, "offset": 100 },
"payment_settings": [{
"type": "payment_gateway",
"payment_gateway": { "type": "{GATEWAY}", "configuration_name": "{PAYMENT_CONFIGURATION}" }
}],
"order": {
"status": "pending",
"catalog_id": "{CATALOG_ID}",
"items": [
{ "retailer_id": "CAKE-CUSTOM-1KG", "name": "Custom cake, 1 kg",
"amount": { "value": 120000, "offset": 100 }, "quantity": 1 },
{ "retailer_id": "CUPCAKE-DOZEN", "name": "Cupcakes, one dozen",
"amount": { "value": 36000, "offset": 100 }, "quantity": 2 }
],
"subtotal": { "value": 192000, "offset": 100 },
"tax": { "value": 9600, "offset": 100, "description": "GST" },
"shipping": { "value": 7400, "offset": 100 },
"discount": { "value": 20000, "offset": 100, "description": "Festive offer" }
}
}
}
}
}'
# 120000×1 + 36000×2 = 192000 subtotal; 192000 + 9600 + 7400 − 20000 = 189000 total

Physical goods that are shipped carry beneficiaries (the delivery address). {GATEWAY} is one of the gateways Meta supports for this mode; the configuration name is the one linked in WhatsApp Manager.

Common mix-ups

Common mistakes with an order details message

  • Totals that are off by a paisa

    Rounding tax per item and again on the total produces a mismatch, and the message is rejected. Compute in integer paise and derive the total from its parts, never the other way round.

  • Reusing a reference_id

    The ID must be unique per business for each order_details message. Generate a new one for every bill, store it before sending, and never resend a changed bill under an old ID.

  • Fulfilling on the webhook alone

    Meta's guidance is not to rely solely on webhooks. Confirm the payment through Meta's payment lookup API or your gateway before dispatching goods or unlocking a service.

  • Sending it to a cold contact

    The interactive order_details message needs an open customer service window. Outside it, use an approved order details template.

  • Cancelling after the customer paid

    Meta only allows canceled while the customer has not paid; on a paid order it fails with error 2047, and completed or canceled orders cannot change. Refund first (gateway mode has a refunds endpoint, /{PHONE_NUMBER_ID}/payments_refund), then send the status that matches reality.

Example: A Bengaluru bakery's custom-cake checkout

A customer orders a 1 kg custom cake and two dozen cupcakes from a Bengaluru bakery over WhatsApp. The bakery's system replies with an order details message: two catalogue items, GST as tax, a delivery charge as shipping, a festive discount and an expiration two hours out so the delivery slot is not paid for after it is gone. The reference ID BLR-CAKE-0412 is stored with the order. The customer taps Review and pay and pays by UPI; the payment status webhook arrives with captured, the bakery confirms the transaction with its gateway, and sends order_status: processing with a note that the cake is being made. On delivery it sends completed.

Order Details Message FAQs

Is an order details message the same as a payment link?+
No. A payment link opens a hosted checkout page in a browser; the order details message shows the bill natively in WhatsApp and is paid from there. Links work with any gateway and in any country; this India checkout needs an Indian business, INR and either a linked gateway or gateway-generated UPI intents.
Which gateways work with payment-gateway mode?+
Only the short list Meta documents for payment-gateway mode, which at the time of writing names Razorpay, PayU, BillDesk and Zaakpay. Any other gateway that can generate UPI intents works in UPI intent mode, which accepts UPI only. Check Meta's Payments API page before you build, as the list can change.
Can I send it outside the 24-hour window?+
Not as an interactive message. Use an approved order details template, which carries the same bill behind a button.
What happens if the customer never pays?+
The order stays pending. Set an expiration so it lapses, send a reminder template if it is appropriate, and send canceled if you withdraw the bill before any payment is made.

Why the difference matters

Why does an order details message matter?

For Indian businesses selling in chat, the order details message removes the hop where many buyers drop off — the jump from WhatsApp to a browser checkout. The bill is structured, the reference ID ties chat, payment and fulfilment together, and in gateway mode the payment status arrives in the same webhook stream as messages. It suits businesses with steady order volume and a backend that already computes the bill; occasional sellers are usually better served by payment links.

Rules of thumb

Best practices for an order details message

  • Set expiration on time-bound orders — food, tickets, slots — so nobody pays for something you can no longer fulfil.
  • Send retailer_id with catalog_id so items show catalogue images and stay matched to your feed.
  • Show discounts as a discount line with a description rather than silently lowering item prices; it reconciles cleanly.
  • Send order_status processing straight after payment — silence after paying is where support tickets start.

See InfiQ pricing

Try it on the official WhatsApp Business API

InfiQ is an official Meta Business Partner. Start a 7-day free trial — no card needed — and see this running on your own number.