01What is the in-chat cart?
The in-chat cart is WhatsApp's built-in shopping basket. When a business connects a WhatsApp Catalog to its WhatsApp Business Account, customers can add items while browsing the catalogue, a single-product message or a multi-product message, change quantities, and send the whole basket to the business in one tap. Up to 99 units of each catalogue item can go into a cart, and the cart lives inside that chat, separate from any basket on the business's website.
What the customer sends is neither a payment nor a confirmed sale. It arrives on the Cloud API as an inbound message of type: "order" in the messages webhook, carrying the catalog_id, an optional note in text, and a product_items array in which each line has a product_retailer_id, an integer quantity, the item_price the catalogue showed and the catalogue currency. Once a cart is sent it cannot be edited; a change means the customer sends a new cart.
Because the order is an inbound message, it opens (or restarts) the 24-hour customer service window, so the business can reply with free-form messages: confirm stock and delivery charges, ask for an address, then collect payment with an order details message in India or a payment link. The cart is switched on per phone number with is_cart_enabled in the commerce settings. It is not the same as an abandoned cart, which describes a checkout left unfinished on a website; there is no webhook for a WhatsApp cart that is filled but never sent.
Key takeaways
- The in-chat cart is WhatsApp's native basket: customers add catalogue items and send them to the business as one order message.
- A sent cart arrives as a messages webhook of type order, with product_retailer_id, quantity, item_price and currency per line.
- A cart is an intent to buy, not a payment: re-price it from your own system, then collect payment.
- A cart holds up to 99 units of each item, and carts that are filled but never sent never reach the business.
- The order opens a 24-hour service window; replies to it have been charged in India since 1 October 2026.
02 · How it works, step by step
How does the in-chat cart work?
- Step 1
Connect a catalogue and keep the cart on
Link a Commerce Manager catalogue to the WhatsApp Business Account, then check that
is_cart_enabledis true for the number (it is the default) via/{PHONE_NUMBER_ID}/whatsapp_commerce_settings.is_catalog_visibleseparately controls the storefront icon. - Step 2
Show products in the chat
Customers add items from the catalogue view, a single-product message or a multi-product message. Every item is identified by its product retailer ID (
product_retailer_id), the content ID from your product feed. - Step 3
The customer sends the cart
One tap sends the basket as an
ordermessage. Your webhook receivesmessages[].orderwith the catalogue ID, the line items and any note the customer typed alongside. - Step 4
Validate it against your own system
Look up each
product_retailer_id, re-check price and stock, add delivery and tax, and store a draft order keyed by the messageid(the wamid) so a retried webhook cannot create a second order. - Step 5
Confirm and collect payment
Reply inside the service window with the confirmed total and a way to pay — an order details message where the Payments API is set up, a payment link, or cash on delivery — then send order status updates as utility templates.
03The in-chat cart in code
// Inside your messages-webhook worker (signature already verified, 200 already returned)export async function handleChange(change) {for (const msg of change.value.messages ?? []) {if (msg.type !== "order") continue;if (await orders.exists(msg.id)) continue; // retried webhook: same wamidconst lines = [];for (const item of msg.order.product_items) {const product = await catalog.get(item.product_retailer_id);if (!product || product.stock < item.quantity) {lines.push({ sku: item.product_retailer_id, problem: "unavailable" });continue;}// Price from YOUR system, not item_price from the webhooklines.push({ sku: product.sku, qty: item.quantity, unitPrice: product.price });}await orders.createDraft({wamid: msg.id,customer: msg.from,phoneNumberId: change.value.metadata.phone_number_id,note: msg.order.text ?? "",lines,});}}
Turn a sent cart into a draft order: skip duplicates by wamid, re-price and re-check stock, keep the customer's note.
04Example: A Diwali mithai order in Lucknow
A Lucknow sweet shop sends a multi-product message with its Diwali boxes. A customer adds two 500 g kaju katli boxes and one large dry-fruit hamper, types "Deliver on Friday?" and sends the cart. The webhook shows two lines. The shop's backend notices that the hamper's catalogue price is stale after a price change that morning, recalculates the total from its own price list, and the agent replies within four minutes with the corrected total, a Friday delivery slot and a pay button. The customer pays and the order moves to packing.
05The in-chat cart: key facts and limits
- Webhook message type
- order (in the messages webhook)
- Line item fields
- product_retailer_id, quantity, item_price, currency
- Units per item
- Up to 99 of each catalogue item
- After sending
- Cannot be edited — the customer sends a new cart
- Cart switch
- is_cart_enabled per phone number (default true)
- Unsent carts
- Never reach the business — no webhook
- Service window
- The order opens a 24-hour window
06 · Common mistakes, and the fix
Common mistakes with the in-chat cart
Trusting item_price
The price in the webhook is what the catalogue showed when the item was added, and feeds lag behind price changes and ended sales. Re-price every line from your own system and tell the customer if the total changed.
Treating a cart as a paid order
A sent cart is an intent to buy. Hold stock briefly if you must, but do not dispatch or count revenue until a payment is confirmed or a cash-on-delivery order is confirmed.
Creating duplicate orders on retries
Meta can deliver the same webhook more than once. Apply webhook deduplication: key the draft order on the message
idand ignore any order you have already stored.Letting carts wait
The window closes 24 hours after the customer's last message. A cart answered the next day may need a template just to confirm it, so route orders to a bot or an agent within minutes.
Using different IDs in the feed and the warehouse
If the catalogue and your order system identify the same product differently, webhook lines cannot be matched. Use one ID scheme from feed to fulfilment.
07Why does the in-chat cart matter?
The cart is the moment a browsing conversation becomes a structured order: exact SKUs, quantities and prices instead of "the blue one, 2 pieces" typed in free text. Handling it well — re-pricing against your own system, answering within minutes and moving straight to payment — is what turns catalogue messages into revenue. Handling it badly leaves real orders sitting unanswered in a shared inbox while the customer's window runs down.
08 · Tips from the bench
Best practices for the in-chat cart
- Reply with a short cart summary (items, quantities, total) before asking for payment — it catches mistakes early.
- Read order.text: customers put delivery dates, sizes and gift notes there.
- Log carts that fail validation; a run of unavailable lines usually means a stale product feed.
- Mark out-of-stock items in the catalogue so customers cannot add what you cannot ship.
09In-Chat Cart FAQs
Can I see carts that customers filled but never sent?+
Does the in-chat cart take payment?+
Can I keep the catalogue but switch off the cart?+
Are my replies to a cart charged?+
* Per-message rates for India, ex-GST: marketing, utility and authentication effective 1 July 2026; service messages ₹0.145 since 1 October 2026 (they were ₹0 until 30 September 2026). Volume commitments earn discounts — final rate is confirmed on your account; applicable GST extra. Rates for other countries differ (see the international rate table on /pricing).