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?
- 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).
- 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. - Step 3
Send order_details
Inside the 24-hour window, POST an interactive
order_detailsmessage to/{PHONE_NUMBER_ID}/messageswith a freshreference_id. Outside the window, use an approved order details (checkout button) template. - Step 4
Wait for real confirmation
In gateway mode, watch for a
statusesentry withtype: "payment"andstatus: "captured"; in UPI intent mode, your gateway's webhook. Meta advises not relying on webhooks alone, so confirm through its payment lookup API (byreference_id) or your gateway before fulfilling. - Step 5
Update with order_status
Send
order_statuswith the samereference_id—processingonce paid, thenshipped,completedorcanceled.completedandcanceledare 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
canceledwhile 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?+
Which gateways work with payment-gateway mode?+
Can I send it outside the 24-hour window?+
What happens if the customer never pays?+
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.