# Send Products (WhatsApp catalog)

Send WhatsApp product cards from the number's own Commerce Manager catalog — one product, a list of up to 30, swipeable cards, or the whole catalog — so the customer can add to cart from inside the chat.

## Getting here

**Automate → Workflows**, open a workflow, click **+** on the canvas, then pick **Send Products (WhatsApp catalog)** under **Add Steps**.

## Before you start

- An **owner**, **admin** or **agent** can add this step and save the workflow. Publishing that workflow — the thing that makes it run on live conversations — is an **owner** or **admin** action.
- Building and running workflows depends on your plan; see [pricing](/pricing).
- The number needs a product catalog connected in Meta Commerce Manager. With none connected there is nothing for **catalogId** left blank to resolve to, and the send fails.
- WhatsApp only — the step has nothing to send on Messenger, Instagram or any other channel.

## Set up

1. Open the workflow and click **+** where the product message belongs.
2. Pick **Send Products (WhatsApp catalog)**.
3. Under **What to send**, choose a list of products (up to 30), swipeable cards (2–10), one product, or the whole catalog.
4. Write the message body. For a list, add an optional header; a header and footer are also available outside carousel mode.
5. List the **Content ID** of each product to include, one per line — the SKU set in Commerce Manager, not Meta's internal product id. Leave this empty only for the whole-catalog mode.
6. Leave **Catalog id** blank to use the number's own catalog, or paste a specific catalog id.
7. Save the step, then publish the workflow. A saved but unpublished workflow sends nothing.

## Fields

| Field | What it means | Default | Limits |
| --- | --- | --- | --- |
| What to send | **A list of products** (up to 30), **Swipeable product cards** (2–10), **One product**, or **The whole catalog**. | A list of products | — |
| Header | Shown above the product list. Not offered in carousel mode. | — | Up to 60 characters. |
| Message text | The body of the message, sent alongside the product cards. Interpolated. | — | Up to 1024 characters. |
| Product ids | One **Content ID** (your Commerce Manager SKU) per line — not Meta's internal product id. | — | Empty for the whole-catalog mode (an optional single id there sets the card's thumbnail); required otherwise, 2–10 lines for the carousel. |
| Footer | Shown below the product list. | empty | Not offered in carousel mode. |
| Catalog id | Which Commerce Manager catalog to read the products from. | blank — the number's own connected catalog, resolved at send time | — |

## How it works

- The step shares its delivery, receipts and audit row with **Send a Message**: only the content is a WhatsApp product message instead of plain text, so the same 24-hour session-window check and the same message-row bookkeeping apply.
- A blank **Catalog id** is resolved to the number's own catalog from its WABA at send time — the step does not need the id typed in for the common case.
- The message body (and the header, if set) is interpolated against the run's variables before it is sent, the same as **Send a Message**'s text.
- The customer can add items to cart from the product cards and send the cart back in the chat; that arrives on the thread as an ordinary inbound message, not as a distinct order event — nothing in this step creates an order on its own.

## When it fails

- Outside the WhatsApp session window: the step is refused before it reaches WhatsApp, with the run log reading **Messaging window closed — free-form send blocked. Use a send_template step (approved WhatsApp / utility template) instead.**
- No catalog connected to the number (and no **Catalog id** typed on the step): for the **A list of products**, **One product** and **Swipeable product cards** modes, Inchat refuses the send before it reaches Meta, with its own message — **No product catalog is connected to this WhatsApp number — link one under Settings › Catalog, or set the catalog id on the step.** The **whole-catalog** mode skips this lookup entirely — it never needs a catalog id — so with no catalog actually connected there, whatever happens next is Meta's rejection to make, not Inchat's.
- A wrong or unlisted **Content ID**: the step does not check the id against the catalog itself before sending, so this one reaches Meta and fails with WhatsApp's own rejection reason instead.
- A failed send does not end the run. The step is recorded failed and the flow moves on to the next step, exactly as **Send a Message** does — there is no way to author a different path for this step's own failure (see Limits).
- You read the reason in the workflow's **Activity** tab: pick the run under **Execution log**, and the failed step carries its own line of text.

## Limits

- There is no failure-branch option for this step — the field the builder uses to run a different path on a failed send (`onFailure`) does not exist on Send Products, unlike Send a Message, Send WhatsApp Template and Send a File. A failed send here can only fall through to whatever comes next.
- It does not create an order, a deal or any record from the cart the customer sends back. That cart arrives as a plain inbound message on the thread; turning it into an order is a separate step or a person reading the chat.
- It cannot fan out to other channels or track links the way **Send a Message** can — those options are not offered on this step.
- WhatsApp only. The step has no Messenger, Instagram or other-channel equivalent, and a workflow reaching this step on a non-WhatsApp conversation has no channel to send it from.

## Use cases

- After **Ask a Question** narrows down what the customer wants, send a filtered list of 2–3 matching products instead of the whole catalog.

## FAQ and troubleshooting

### The customer picked products and sent them back — did that create an order?

No. Their reply arrives on the thread as an ordinary message; nothing in this step reads it or writes an order. Add a step after this one, or have an agent or the AI read the reply, if the cart should turn into a recorded order.

### Can I branch the flow when the product send fails?

Not from this step — it has no failure-branch field to author one, and no Condition field reports whether a previous step sent or failed. The only way to react to a failure here is to check the workflow's Activity tab by hand.

### I left Catalog id blank and nothing sends.

A blank id means "the number's own catalog," resolved automatically — it is not the reason for a failure. Check instead, under **Settings › Catalog**, that a catalog is actually connected to this number (Inchat refuses the send itself, with its own message pointing there, for every mode except the whole-catalog one — that mode skips the lookup and leaves any rejection to Meta), and that the Content IDs you listed exist in the catalog in Commerce Manager.

## Related

- [Send a Message](https://inchat.inseller.my/help/workflows/send-a-message)
- [Send WhatsApp Template](https://inchat.inseller.my/help/workflows/send-whatsapp-template)
- [Condition](https://inchat.inseller.my/help/workflows/condition)
- [Workflows: how a flow runs](https://inchat.inseller.my/help/workflows/workflows-overview)

---

Source files: `src/lib/workflows/ai-builder/spec.ts`, `src/lib/workflows/canvas-model.ts`, `src/lib/workflows/types.ts`, `src/components/workflows/WorkflowStepConfigDrawer.tsx`, `src/lib/workflows/engine-message-actions.ts`, `src/lib/workflows/dispatch-send.ts`, `src/lib/channels/whatsapp-catalog.ts`, `src/lib/send/whatsapp.ts`, `src/lib/send/shared.ts`, `src/lib/workflows/condition-catalog.ts`, `src/lib/inbox/wa-window.ts`, `src/lib/access/permissions.ts`, `src/lib/workflows/engine.ts`
