> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dmly.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sell on WhatsApp

> Show your catalogue in the chat, take the customer's cart, and collect payment with a Pay now button, end to end.

WhatsApp has a native shop front: customers browse your catalogue without leaving the chat,
add to a cart, and send you the cart as an order. DMLY picks it up from there: a flow
thanks them, totals the order, and sends a **Pay now** button. This page walks the whole
pipeline: switching commerce on, showing products, catching the cart, and taking the money.

Three things need to exist before any of it works:

1. **A WhatsApp Cloud channel**: see [Connect WhatsApp](/channels/whatsapp).
2. **A product catalogue connected to your WhatsApp Business Account** in Meta's Commerce
   Manager. The catalogue is Meta's, not DMLY's. You build and connect it on Meta's side,
   and the builder's own hint says exactly that: *"Requires a catalog connected to your
   WhatsApp Business Account in Commerce Manager."*
3. **A payment gateway**, for the checkout at the end. See
   [Payments and gateways](/finance/payments-and-gateways).

## Step 1: switch commerce on

Open **Bot Setup** on your WhatsApp channel and go to the **Commerce** tab: *"Control how
your catalog and cart appear to customers in chat."* Two switches:

* **Show catalog**: *"Let customers browse your connected product catalog."* The catalogue
  icon appears in your WhatsApp business profile and chats.
* **Enable cart**: *"Allow customers to add products to a cart and send an order."* Without
  it customers can look but not order.

**Save changes** writes both straight to WhatsApp: these are your number's own commerce
settings on Meta's side, and DMLY is setting them for you. Enabling the cart is also what
makes the **Cart order received** trigger available in the automation builder.

## Step 2: put products in the conversation

The **Catalog / Product** step, in the flow builder's **WhatsApp** group, sends the shop
into the chat. **What to send** offers three shapes:

| Option             | What the customer gets                                                                                                       |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **Full catalog**   | A browsable view of your whole catalogue: the default, and the reliable choice.                                              |
| **Single product** | One product card, by its **Product ID** (the retailer ID / SKU from your Meta catalogue).                                    |
| **Product list**   | A titled section of several products: **Product IDs (comma-separated)**, e.g. `SKU-001, SKU-002`, under a **Section title**. |

The **Body** text above the products takes [variables](/automation/variables), so
*"Browse our products 🛍️"* can just as well be *"Hi `{{first_name}}`, here's what's new"*.
Wire it into a keyword flow: someone texts *menu* or *shop*, the catalogue appears.

## Step 3: catch the cart

When a customer sends their cart, DMLY logs it in the [Inbox](/inbox/overview) as a
🛒 cart-order line and looks for an automation on the **Cart order received** trigger. In
that flow, the cart is data. Type these into any message
(they're not in the `{}` picker):

* `{{cart.items_summary}}` is the order in one line: `2× Blue Shirt, 1× Hat`
* `{{cart.total}}` and `{{cart.currency}}`
* `{{cart.item_count}}`, and `{{cart.note}}` if they attached one

<Warning>
  **Build this flow in the flow builder, not as a quick automation.** A quick automation on
  the cart trigger does fire, but the `cart.*` tokens don't resolve in its reply; the
  customer would get a message with holes in it. The one-click template below is the
  fast way to get it right.
</Warning>

**When DMLY won't process a cart, it hands it to you instead.** An empty cart, a currency
your gateway doesn't take, an out-of-stock or unrecognised product (or no cart automation
published at all) pauses the bot on that conversation and drops a line in the thread:
`🙋 WhatsApp cart needs a human (<reason>) — bot paused.` A person finishes the sale, then
selects **Resume bot**. So until your cart flow is live, every cart order lands with your
team: nothing is lost, just manual.

## Step 4: take the money

The **Request Payment** step (in the **Finance** group) turns the cart into cash. Give it
the **Amount** `{{cart.total}}` and **Currency** `{{cart.currency}}`, pick the **Gateway**,
and it mints a payment link and sends it as a tappable **Pay now** button. When the customer
pays, the payment lands in [Finance → Payments](/finance/payments-and-gateways) like any
other gateway payment, and the **Payment succeeded** trigger can drive the follow-up if you
want one.

The step has a **FAILED** output for when the link can't be minted. Wire it to a human
handover rather than leaving the customer at a dead end.

<Note>
  A WhatsApp cart doesn't become an order under [Finance → Orders](/finance/orders): no
  stock is committed and no order record is created. The cart's money side is the payment.
  If you track stock through Finance orders, create the order by hand for what sold.
</Note>

## Or install the whole thing in one click

The template library ships this pipeline as **WhatsApp Cart Checkout**: *"Turn a sent
WhatsApp cart into a payment link, with a human fallback if anything goes wrong."* It wires:
the cart trigger → a thank-you quoting `{{cart.items_summary}}` and the total → **Request
Payment** with a **Pay now** button → a "once your payment clears" confirmation, with the
failure path handing over to a human and pausing the bot. Install it from
[Templates](/automation/templates) (it needs the cart enabled and a gateway connected),
reword the messages, publish.

## Sending and requesting locations

Two more WhatsApp-group steps round out selling in chat, especially for pickup:

* **Send Location** drops a real map pin in the conversation: a **Place name**, an
  **Address**, and the exact spot picked on a map. Put it after the payment confirmation for
  collection orders, or behind a *"where are you?"* keyword.
* **Request Location** sends WhatsApp's native prompt with a one-tap share-location button.
  The step's own hint: *"Shows a native 'Send location' button. The RECEIVED port continues
  once the contact shares it."* What they share is captured: it appears as a map pin in the
  [Inbox](/inbox/overview), and on the RECEIVED path the coordinates are available as
  `{{location.latitude}}`, `{{location.longitude}}`, `{{location.name}}` and
  `{{location.address}}`, so the next step can echo the spot back, save it to a
  [custom field](/contacts/custom-fields), or send it to your own system with an
  [HTTP Request](/automation/webhook-step). See the [variables reference](/automation/variables).

<Note>
  The RECEIVED port continues on **any** reply, not only a shared location. If the contact
  types a message instead of tapping **Send location**, the flow still moves on, but the
  `{{location.*}}` tokens come out empty. Branch on `{{location.latitude}}` being present if
  the next step depends on a real pin.
</Note>

<Columns cols={2}>
  <Card title="Templates" icon="copy" href="/automation/templates">
    Install WhatsApp Cart Checkout and edit it on the canvas.
  </Card>

  <Card title="Variables reference" icon="brackets-curly" href="/automation/variables">
    The cart tokens, and everything else.
  </Card>

  <Card title="Payments and gateways" icon="credit-card" href="/finance/payments-and-gateways">
    Connect the gateway behind the Pay now button.
  </Card>

  <Card title="Store automations" icon="cart-shopping" href="/automation/store-automations">
    Selling through Shopify or WooCommerce instead? Start here.
  </Card>
</Columns>
