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

> ## Agent Instructions
> DarkFunnels is a WhatsApp AI sales-agent platform used mainly in Peru and Latin America. The product interface and most of this documentation are in Spanish; the /en tree is the English mirror.
> A business connects the WhatsApp number it already uses by scanning a QR code from the dashboard, the same linked-device mechanism as WhatsApp Web. It does not go through the Meta Cloud API (WhatsApp Business Platform), so there is no application to get approved and no message templates to submit. DarkFunnels is not a Meta product and is not affiliated with Meta.
> DarkFunnels also publishes a remote MCP server at https://mcp.darkfunnels.ai/mcp so an assistant such as Claude, ChatGPT or Codex can operate the workspace on the owner's behalf. The tool reference is at /referencia/tools and the connection parameters at /referencia/url-de-conexion.
> The dashboard is https://optimind.darkfunnels.ai, the marketing site is https://darkfunnels.ai and the page written for AI agents is https://darkfunnels.ai/agents.

# Product catalog for a WhatsApp AI agent

> Build the product catalog for a WhatsApp AI agent from the dashboard, click by click: price, sizes, stock and photo, so the agent quotes what you entered.

Your agent does not know what anything costs until you tell it. **The catalog is
where you tell it**: a product, a price, its sizes, its photo. That is where it
takes the numbers from when the customer asks "how much is it?".

This guide is the full walkthrough from the screen, click by click. The examples
use a made-up clothing store, **Moda Sol**, and its star product: the **Polo
oversize de algodón pima**.

<Note>
  **Where it is.** Go into the dashboard at
  [optimind.darkfunnels.ai](https://optimind.darkfunnels.ai) and, in the left-hand
  menu, inside the **Ventas** ("Sales") row, press **Catálogo** ("Catalog"). (If
  you prefer to go straight there, type `optimind.darkfunnels.ai/catalog` into the
  browser bar. The old address, `/catalogo`, takes you to the new one on its own.)
</Note>

<Frame caption="This is what the Catalog looks like on day one: «No products yet» and an orange button at the top right.">
  <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/01-vacio.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=8b570e6df867632ca9c3552ed9693b08" alt="Empty Catalog screen with the message «No products yet» and the Add product button" width="3200" height="1704" data-path="images/catalogo/01-vacio.png" />
</Frame>

The dashboard interface is in Spanish, so buttons and labels are given here in
English with the Spanish wording you will actually see in parentheses.

## What the catalog is for

The screen itself sums it up under the title: *"Your products, synced from your
store or created by hand. The price comes from here; the agent never makes it
up."* (If you have more than one agent that sentence changes, and it warns you
that the list is trimmed to the agent you have open.)

That is literal: the agent carries a written instruction to look the catalog up
every time the customer asks about a product or its price, and not to make
prices up. The practical consequence is simple: **what is not in the catalog is
what your agent does not know how to quote.**

<Tip>
  **Loading it is all you have to do.** There is no need to link the product to
  the sales playbook, or to name it in any chapter, or to switch anything else on.
  As soon as you save it, the agent can already find it and offer it. Two honest
  caveats: changes can take **up to a minute** to reach a conversation that is
  already under way, and if you tick specific sales funnels on the product, the
  rest stop seeing it (told in
  [Visible and Active are not the same](#visible-and-active-are-not-the-same)).
</Tip>

## The words on this screen

| Word                                                  | What it means, in plain language                                                                                                               |
| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **Product** (*Producto*)                              | The complete record: name, description, photos and price.                                                                                      |
| **Variant** (*Variante*)                              | Each sellable version of that product: the black size M, the 500 ml bottle. Each one has **its own price and its own code**.                   |
| **SKU**                                               | The code you use to identify a variant (`POLO-NEG-M`). It is optional; it is there for searching.                                              |
| **Type** (*Tipo*)                                     | Whether what you sell is a **Physical product**, a **Service** or an **Info product**. It is chosen first and it changes the rest of the form. |
| **Active** (*Activo*)                                 | Whether the agent can find it when it searches.                                                                                                |
| **Visible in the catalog** (*Visible en el catálogo*) | Whether it appears in the catalog WhatsApp shows inside your business profile. **It is not the same as Active.**                               |

## Your first product, click by click

<Steps>
  <Step title="Press «Add product»">
    It is at the top right, in orange, next to another button called **CSV
    template** (*Plantilla CSV*). With the catalog empty you also have the same
    button in the middle of the screen, under *"No products yet"*.

    **No new page opens.** A panel slides in from the right-hand side, top to
    bottom, over the dimmed background. It is titled **New product** (*Nuevo
    producto*) — and **Edit product** (*Editar producto*) when you open one that
    already exists. Do not look for a "back" button: there is none, it closes
    with **Close** (*Cerrar*) or **Cancel** (*Cancelar*).
  </Step>

  <Step title="Choose what you are going to sell">
    The first and only thing you will see is the heading **"What are you going to
    sell?"** (*"¿Qué vas a vender?"*) with three cards: **Physical product**
    (*Producto físico*), **Service** (*Servicio*) and **Info product**
    (*Infoproducto*). Until you choose one, the rest of the form does not exist
    and the **Save** (*Guardar*) button is off: it will not let you press it.

    For the Moda Sol polo shirt: **Physical product**.

    <Frame caption="The panel starts by asking what you sell. Each card tells you what the agent will do if you choose it.">
      <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/02-nuevo-producto-tipo.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=ea5c294b5b1666bba9ec2d990e1fa0c3" alt="«New product» panel at the «What are you going to sell?» step with the Physical product, Service and Info product cards" width="3200" height="1800" data-path="images/catalogo/02-nuevo-producto-tipo.png" />
    </Frame>
  </Step>

  <Step title="Give it a name and describe how it is sold">
    Once the type is chosen the whole form unfolds. In **Title and description**
    (*Título y descripción*) there is only one field with an asterisk: **Name
    \*** (*Nombre \**). Type `Polo oversize de algodón pima`.

    The **Description** (*Descripción*) is optional, but it is not decorative:
    the field says so — *"Details the agent can use when selling."* — and it is
    text the agent reads when it finds the product. It reaches the agent
    **trimmed to around 240 characters**, so put what sells in the first lines:
    *"Peruvian pima cotton, unisex oversize cut. Machine washable. Shipping
    anywhere in Peru."*

    <Warning>
      **The name is what the customer has to be able to say.** The agent searches
      by the product name and by the name or the code of its variants — **it does
      not search inside the description**. Putting "polo", "camiseta" and "remera"
      only in the description does not help it find the product: put them in the
      name.
    </Warning>
  </Step>

  <Step title="Upload the photos">
    In **Media** (*Medios*), drag the images in or press where it says **"Drag or
    click to upload"** (*"Arrastra o haz clic para subir"*). Underneath it reads
    *"PNG, JPG or WEBP. The first image is the main one."* — that is a
    **recommendation**, not a filter: the system accepts any image file, so a GIF
    or a HEIC also gets in.

    The first photo carries the **Main** (*Principal*) label; the others are
    removed with the **×**. **They cannot be reordered by dragging**: to change
    the main one you have to remove the ones in front of it.

    <Warning>
      **The photos are the only thing in this panel that does not wait for the save
      button.** They are uploaded on the spot, and removing one deletes it from
      storage at that same moment. If you upload a photo and then cancel the
      product, the photo has already been uploaded. If you remove a photo and then
      cancel, the photo really has already been deleted — and on a product that
      already existed, its record is left pointing at a file that is no longer
      there until you save it again.
    </Warning>

    <Frame caption="The form for a physical product: Type, Title and description, Media and Prices.">
      <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/03-formulario-fisico.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=4989b0d1f6ca73546dda488058b3cd3d" alt="Physical product form filled in with name, description, photo and price" width="3200" height="1800" data-path="images/catalogo/03-formulario-fisico.png" />
    </Frame>
  </Step>

  <Step title="Set the price">
    In **Prices** (*Precios*) there are two fields: **Price \*** (*Precio \**)
    and the currency. The currency has **only two options — "PEN (S/)" and "USD
    (\$)" — and comes set to PEN**. From this screen there are no other
    currencies.

    For the polo shirt: `79` and `PEN (S/)`. If you leave the price empty or type
    something that is not a number, on saving you get *"Enter a valid price."*
    (*"Pon un precio válido."*)

    Underneath you will see the **Quantity pricing** (*Precios por cantidad*)
    switch. Leave it off for now: we look at it in
    [its own section](#quantity-pricing-wholesale).
  </Step>

  <Step title="Decide whether you keep count of stock">
    In **Inventory** (*Inventario*) there is a **Track stock** (*Controlar
    stock*) switch and a **SKU** field (with the example `XL-25`). Turn it on
    only if you really want the agent to stop offering what has run out — it
    explains it right there: *"The agent warns when something runs out and does
    not offer what you do not have."*

    <Warning>
      **Quantities are not typed here.** When you turn on **Track stock**,
      **Available quantity** (*Cantidad disponible*) appears, but it is
      **read-only**: it will not let you type. Underneath, the panel itself says so
      — *"Inventory handles it. To move it, record a movement in Inventory"* —
      with a link to that screen. It is the most common confusion in this form.
    </Warning>
  </Step>

  <Step title="Add sizes and colors, if you have them">
    On a physical product the block is called **Variants** (*Variantes*) and
    comes with the **Generate variants from options** (*Generar variantes por
    opciones*) button: you give it the axes (Color: black, white, sand / Size: S,
    M, L, XL) and it creates the combinations for you in one click, with an
    **automatic SKU** (*SKU automático*) if you ask for it. It takes up to **3
    axes** and **100 combinations**.

    The [Variants](#variants-sizes-and-colors) section tells the whole story.

    <Frame caption="The bottom half of the panel: Inventory with its SKU, the Variants and Availability.">
      <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/04-inventario-variantes.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=b923c185e2659912814332ef5e93cc7d" alt="Inventory, SKU, Variants and Availability blocks of the product form" width="3200" height="1800" data-path="images/catalogo/04-inventario-variantes.png" />
    </Frame>
  </Step>

  <Step title="Save — and check that it turned up in the table">
    The last block is **Availability** (*Disponibilidad*), with **Visible in the
    catalog** and **Active** switched on. Leave them like that and press
    **Save**.

    The product appears at the very top of the table, with its columns:
    *producto, sku, precio, inventario, embudos, visible, origen* ("product, sku,
    price, inventory, funnels, visible, source") and a last one with the actions.

    <Frame caption="The saved product, with its columns. The «inventario» column says «Sin control» (Not tracked) when you do not track it.">
      <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/05-tabla-con-producto.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=242c61070a1d9e8def2d4b0a5a8a3975" alt="Catalog table with a saved product and all its columns" width="3200" height="1704" data-path="images/catalogo/05-tabla-con-producto.png" />
    </Frame>

    <Warning>
      **Closing the panel throws away everything you typed, with no warning.** It
      makes no difference whether you press **Close** at the top, **Cancel** at the
      bottom, or click outside the panel, on the dark area: there is no
      confirmation and no saved draft. The only thing that keeps your work is
      **Save**.
    </Warning>
  </Step>
</Steps>

## The three types, and how they really differ

The type is not a label: **it changes which fields you see and what the agent
does afterwards**. Each card tells you so when you choose it.

| Type                                     | What the card says                                                                        | What changes in the form                                                                                |
| ---------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| **Physical product** (*Producto físico*) | *"The agent quotes shipping and generates the waybill."*                                  | A **Variants** block, with the size and color generator.                                                |
| **Service** (*Servicio*)                 | *"The agent sells it and arranges it over chat. It does not generate shipping."*          | The block is called **Modalidades** ("Service options"): it asks for the name and price of each option. |
| **Info product** (*Infoproducto*)        | *"Its delivery is digital: it is delivered on its own, as soon as payment is confirmed."* | It has **no** variants block. Instead, **Automatic delivery** (*Entrega automática*) appears.           |

The stock-tracking notice changes too: on a physical product it talks about
stock on hand, on a service about **available slots** (*cupos disponibles*)
(*"The agent does not offer what has run out."*) and on an info product about
**limited licenses or accesses**. So "stock" here is not just boxes in a
warehouse.

<Note>
  **Changing the type of a product that already exists does not delete anything
  straight away.** The panel itself says: *"Changing the type hides what no longer
  applies. Nothing is deleted until you save."* If the change is going to remove
  data — turning a product that has several variants into an info product, for
  example — saving asks you for a two-step confirmation with the **Convert and
  save** (*Convertir y guardar*) button.
</Note>

### If you sell a course or an ebook: "Automatic delivery"

On an info product a block appears that is not in the other two, and it explains
on its own what it is for: *"When payment is confirmed (voucher approved), the
agent sends this to the customer without you doing anything."* You have two
options:

* **A file from the Library** — only the files already marked as sendable for the
  agent you have open are offered. They are prepared in
  [The file Library](/en/guides/library).
* **A link** — it has to start with `http://` or `https://`.

If you save with neither of the two, the product **is saved anyway**, but the
panel warns you: *"Careful: with no file and no link, the agent will not be able
to deliver it on its own."* And in the list, that product is marked under its
name as **"Infoproducto · ⚠️ sin entrega"** ("Info product · ⚠️ no delivery"). It
is worth fixing: otherwise the agent can charge for something it then does not
know how to deliver.

## The form, block by block

Once the type is chosen, the panel shows **seven blocks**. Six are always the
same; the seventh depends on the type and sits between **Inventory** and
**Availability**.

| Order | Block                                                   | What it is for                                                                       |
| ----- | ------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| 1     | **Type** (*Tipo*)                                       | What you sell. It is chosen first and it conditions the rest.                        |
| 2     | **Title and description** (*Título y descripción*)      | The name (required) and the text the agent uses when selling.                        |
| 3     | **Media** (*Medios*)                                    | The photos.                                                                          |
| 4     | **Prices** (*Precios*)                                  | Price, currency and the quantity scale.                                              |
| 5     | **Inventory** (*Inventario*)                            | The stock-tracking switch and the SKU.                                               |
| 6     | **Variants** / **Modalidades** / **Automatic delivery** | Depending on the type. The info product has no variants.                             |
| 7     | **Availability** (*Disponibilidad*)                     | Visible, Active and — if you have more than one agent — which sales funnels sell it. |

### What is really required

Not much. **Three things**, in this order:

1. **The type.** Without it no other field is shown.
2. **Name \***. If it is missing: *"Name is required."* (*"El nombre es
   obligatorio."*)
3. **Price \***. If it is empty or not a number: *"Enter a valid price."*

Everything else — description, photos, SKU, variants, stock, sales funnels — is
optional and can be filled in later.

<Note>
  **With "Quantity pricing" on, the required price moves.** The field at the top is
  locked and the one you have to fill in becomes the **1 unit** row of the scale.
  The warning changes too: it will talk to you about the price for 1 unit, not
  about "Enter a valid price".
</Note>

<Warning>
  **Do not leave products with a price of 0.** They are saved without complaint,
  but afterwards **they do not appear in the product dropdown** when you record a
  sale or an order by hand: that dropdown only brings in active products whose
  variants cost more than zero.
</Warning>

## Quantity pricing (wholesale)

It is the most powerful feature on this screen and the least obvious. Turn on
**Quantity pricing** (*Precios por cantidad*) and you declare the **exact total
price for each quantity**, not a percentage discount:

| Quantity | Total price |
| -------- | ----------- |
| 1        | S/ 79       |
| 2        | S/ 149      |
| 3        | S/ 209      |

Rows are added with **+ Add tier** (*+ Añadir tramo*). And with **+ From N and
up (price per unit)** (*+ De N a más (precio por unidad)*) you define the open
tier: *from 6 and up, S/ 65 each*.

<Warning>
  **The moment you turn it on, the "Price" field at the top is locked** and it is
  renamed **Price (1 unit, from the scale)** (*Precio (1 unidad, de la escala)*).
  It is not a fault: the price is now typed into the 1-unit row of the table.
</Warning>

**For the quantities that are not on your scale, the agent combines tiers and
adds them up.** If the customer asks for 10 polo shirts and your scale goes up to
3, it charges 3 + 3 + 3 + 1. If you prefer a clean per-unit price from a certain
quantity onwards, define the open **From N and up** tier.

There is also a **Promotion with an end date** (*Promoción con fecha de fin*),
with the **Valid until** (*Vigente hasta*) field. While it is in force, that
price overrides the list scale in the conversation.

<Note>
  **The promotion does not travel to the WhatsApp catalog.** In the catalog
  WhatsApp shows on your business profile, the **list** price for 1 unit is always
  published, never the promotional one. It is on purpose: if the promo were
  published, it would stay stuck there once it expired. In the chat, the promotion
  does apply.
</Note>

<Note>
  **The scale is only removed from this panel.** Leaving its cell blank in the CSV
  file does not delete it: it leaves it as it was.
</Note>

## Variants: sizes and colors

Moda Sol sells the same polo shirt in 3 colors and 4 sizes. That is **12
variants**, and there is no need to type them one by one.

<Steps>
  <Step title="Press «Generate variants from options»">
    It is in the **Variants** (*Variantes*) block.
  </Step>

  <Step title="Declare the axes">
    *Color*: black, white, sand. *Size*: S, M, L, XL. You can use up to **3
    axes** (color, size and, for example, sleeve).
  </Step>

  <Step title="Generate">
    The 12 combinations come out in one click. Tick **Automatic SKU** (*SKU
    automático*) and each one is born with its code. The cap is **100
    combinations** per product.
  </Step>

  <Step title="Adjust the prices that fall outside the norm">
    Each row carries its own price. If the XL costs S/ 10 more, it is changed
    there.
  </Step>
</Steps>

<Warning>
  **The moment the product has several variants, the "Price" and the "SKU" at the
  top stop being in charge.** Each variant keeps its own, and what you type at the
  top is not saved: it only serves as the base price when generating the matrix.
  When you reopen the product, that field at the top shows you **the cheapest** of
  its variants.

  If you change the price at the top and swear it did not save, this is why.
  **Change the price on the variant's row.**
</Warning>

<Note>
  **On a service they are called "Modalidades" and they are the same thing** under
  another name: *Express consultation*, *Full consultation*, *Package of 4
  sessions*. They ask for a name and a price. The **Slots** (*Cupos*) are shown but
  not typed — same as stock, Inventory handles them. An info product does not have
  this block: a single presentation.
</Note>

## Stock: when to turn it on

**Turn on "Track stock" only if you are going to record the movements.** If you
turn it on and never load any stock, the agent will believe you have none left.

| What you see in the **inventario** column | What it means                                                                                                              |
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| A number                                  | You are tracking and you have that many units left.                                                                        |
| **Agotado** ("Out of stock")              | You are tracking and you are at zero: it reaches the agent marked as out of stock, with the instruction not to promise it. |
| **Sin control** ("Not tracked")           | You are not keeping count. The agent can offer it without looking at stock.                                                |

With tracking on and stock at zero, that variant reaches the agent marked as
**out of stock and with the instruction not to promise it** — which is what the
screen sums up as *"The agent warns when something runs out and does not offer
what you do not have."* With tracking off there is nothing that can run out: it
is the right option for a service you can provide with no cap on slots, or for a
product you make to order.

Quantities are moved on the **Inventory** screen, by recording a movement. From
the catalog you only declare **whether** the product is tracked.

## Visible and Active are not the same

This is the costliest confusion on the screen. Both switches are in
**Availability** and **only one of them silences the agent**.

| Switch                                                | What it does when you turn it off                                                                                                                          |
| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Active** (*Activo*)                                 | The agent **stops finding it** when it searches the catalog. It is the right way to withdraw something.                                                    |
| **Visible in the catalog** (*Visible en el catálogo*) | It takes it out of the catalog WhatsApp shows on your business profile, **but the agent still finds it** and can carry on offering it in the conversation. |

<Warning>
  **To withdraw a product, turn off "Active".** Turning off only "Visible in the
  catalog" does not stop the agent from carrying on selling it over chat.
</Warning>

### "Sales funnels that sell it"

That list **only appears if your business has more than one agent**. If you have
one, you will not even see it. And the rule is not the one it looks like: *"With
none ticked, every sales funnel quotes it."* — **ticking nothing means "all",
not "none"**.

<Note>
  **It is an organizing rule, not a security barrier.** It is there so that your
  wholesale agent does not quote the retailer's products. But do not use it to
  hide sensitive information: if the system cannot read the assignments, it opens
  up instead of closing down, and the agent sees everything.
</Note>

**The sales funnels are saved in a second step, after the product.** If that step
fails you will see *"The product was saved, but the sales funnels were not"*: the
product is fine; reopen it and tick them again.

And if on saving you take the product away from the agent you have open, it
warns you — *"The open sales funnel no longer sells it: it drops out of this
list."* — and it disappears from the table. **It has not been deleted**: it
stopped belonging to that sales funnel.

<Warning>
  **With more than one agent, the list you see is trimmed.** `/catalog` shows what
  the agent you have selected in the top bar sells, plus whatever is not assigned
  to any of them. The counter at the foot (*"Showing N of M products"*) counts
  already trimmed, and the CSV template you download will come out trimmed the
  same way. Before concluding that you lost products, **switch agents in that
  selector**.
</Warning>

## Editing many products at once: the CSV template

To load a hundred products, or to raise the price of a whole season, the
one-by-one form is no use. The **CSV template** (*Plantilla CSV*) button (next to
"Add product") opens the **"Bulk-edit catalog (CSV)"** (*"Editar catálogo en
bloque (CSV)"*) box, with two numbered steps.

<Frame caption="The «Bulk-edit catalog (CSV)» box: first you download, you edit in your spreadsheet, and then you upload.">
  <img src="https://mintcdn.com/darkfunnels/HdZeOTT5Hr2QnEvb/images/catalogo/06-plantilla-csv.png?fit=max&auto=format&n=HdZeOTT5Hr2QnEvb&q=85&s=3712a930b332175a5334dcd5599d9855" alt="«Bulk-edit catalog (CSV)» modal with the Download the template and Upload your changes steps" width="3200" height="1704" data-path="images/catalogo/06-plantilla-csv.png" />
</Frame>

<Steps>
  <Step title="Download the template">
    **Download template (.csv)** (*Descargar plantilla (.csv)*) button. It
    downloads a file with your current products, which you can open in Excel or
    in Google Sheets.

    Watch what it brings: **only your own products** (the ones synced from a
    store do not come out) and **only those of the agent you have open**.
  </Step>

  <Step title="Edit it in your spreadsheet">
    Change what you need and save as CSV.
  </Step>

  <Step title="Upload it">
    **Choose CSV file** (*Elegir archivo CSV*) and then **Apply changes**
    (*Aplicar cambios*). The cap is **500 products per upload**.
  </Step>
</Steps>

### The rules of the file

* A row **with an id** updates the product that already exists.
* A row **without an id** creates a new one… unless it repeats the **handle** of
  a product that is already there, and then **it overwrites it**.
* **A product that is not in the file is not touched.** Deleting a product row
  does not delete the product.
* **But removing a variant's row does delete that variant** from the product.

<Warning>
  **What is in charge is the "handle" column, not the name.** It is the grouping
  key that the template comes with already filled in (something like
  `polo-oversize-de-algodon-pima-` followed by a long code). If you copy a whole
  row to create a variation of the polo shirt and leave the handle the same, **you
  wipe out the original product in silence**.

  To really create: leave the **id** empty and put in a **handle** that does not
  exist. A row without a handle is not accepted — the file rejects it with *"The
  handle (grouping key) is missing."*

  From the **Add product** button this does not happen: two products with the same
  name created there are two different products.
</Warning>

<Note>
  **Two columns that do not do what they look like.** **Photos are not edited by
  CSV** (only from the product editor), and **the stock quantity is exported but
  ignored on import**: you can write "40" in the sheet, upload it, and nothing will
  happen and you will see no error. Stock is moved in **Inventory**.
</Note>

| In the file   | What it is                                                                 |
| ------------- | -------------------------------------------------------------------------- |
| `id`          | The product identifier. With an id, it updates; without an id, it creates. |
| `handle`      | The grouping key. **It is the one that decides what gets overwritten.**    |
| `price_tiers` | The quantity pricing scale. Leaving it blank does not delete it.           |

<Tip>
  **From the dashboard, it is the only route for duplicating a product.** The
  screen does not know how to clone: there is no "Duplicate" button. The real route
  is to download the template, copy the product's row, **delete its id and change
  its handle**, and upload it again.
</Tip>

## How your catalog reaches the customer

There are two different routes, and it is worth not mixing them up.

### 1. In the conversation (the important one)

When the customer asks about a product or its price, the agent searches the
catalog and answers with what it finds. It searches by **the product name** and
by **the name or the code (SKU) of its variants**. Useful things to know:

* **It does not search inside the description**, although it does show it to the
  agent (trimmed) once it has found the product.
* It has to get **at least half the words** right. And the one- or two-letter
  words — "S", "M", "XL" — have to stand on their own to count.
* **It returns at most 5 products.** If you have forty similar items, the agent
  will name a few, not the whole list.
* The variant's color and size help to **narrow down among what it already
  found**, not to find something that did not match by name or by code.

Translated into a recommendation: **the product name has to be the name your
customer would ask for it by.**

### 2. In the native WhatsApp catalog

It is the products tab WhatsApp shows inside your business profile. It fills
itself, but with conditions:

* Your number has to be a **WhatsApp Business account** and be connected. If it
  is not, nothing is published there (and the agent carries on selling over chat
  all the same).
* **One entry is published per variant**, not per product. That is why the
  12-combination polo shirt appears 12 times.
* Only the products that are **"Active" and "Visible in the catalog" at the same
  time** get in, and only if they have a price and a currency.
* With quantity pricing, the **1 unit list** price is published, never the
  promotion.
* If you ticked sales funnels on the product, each number publishes its own. **A
  product with no sales funnels ticked — which is the normal case — is published
  by all your numbers.**

<Note>
  **Deactivating or hiding also deletes it from WhatsApp.** It is not left hanging
  there. And do not worry: only the products DarkFunnels published are touched; the
  ones you had created by hand in WhatsApp stay as they are.
</Note>

## Things you are going to need later

<AccordionGroup>
  <Accordion title="Editing a product that already exists">
    In the actions column of its row, press **Edit** (*Editar*). **Pressing the
    row does not open anything** — no row in this table is clickable — so if you
    click on it and nothing happens, it is not broken: use the action.
  </Accordion>

  <Accordion title="Withdrawing a product without deleting it (the recommended way)">
    Tick the checkbox on its row and press **Deactivate** (*Desactivar*) in the
    bar that appears at the top. The product stays in your catalog with all its
    history, but the agent stops finding it.

    In that same bar you have the four bulk actions — **Activate** (*Activar*),
    **Deactivate** (*Desactivar*), **Show** (*Mostrar*) and **Hide** (*Ocultar*)
    — which are applied straight away to everything you have ticked. It is the
    quick way to withdraw a whole season.
  </Accordion>

  <Accordion title="Really deleting a product">
    There is no trash can and no delete button inside the product panel. **From
    the dashboard, the only way is to tick the checkbox on the row and press
    "Delete"** (*Eliminar*) in the selection bar.

    <Warning>
      **That button does not ask for confirmation and cannot be undone.** One click
      and the product disappears with its variants; it is not archived. The only
      thing that does stop it is one of its variants having an open charge: then
      the deletion bounces back with an error.

      An order or a sale that has already been recorded does **not** stop it: the
      product is deleted and those records are left not knowing which variant was
      sold. That is why, almost always, what you want is **Deactivate**, not
      **Delete**.
    </Warning>
  </Accordion>

  <Accordion title="Finding something in a large catalog">
    Two tools work: the search box **"Search products..."** (*"Buscar
    productos..."*) (it searches by product name and by the SKU of its variants;
    it does not search the description) and the **Filter** (*Filtrar*) button,
    which opens **"Filter catalog"** (*"Filtrar catálogo"*) with three filters:
    **Type** (*Tipo*), **Visibility** (*Visibilidad*) (Visible / Hidden) and
    **Status** (*Estado*) (Active / Inactive).

    The list loads **50 at a time** as you scroll down, with no page numbers, and
    at the foot it says **"Showing N of M products"**.

    <Warning>
      **Two controls on this screen do nothing today, and we would rather tell
      you.** The **Todos · Manual · Shopify** ("All · Manual · Shopify") tabs do not
      filter: switching tabs does not change what you see. And the **Sort**
      (*Ordenar*) button opens its box with "Name", "Price", "Inventory" and
      "Updated", but the list does not change order: it always comes out from the
      most recent product to the oldest (the column headers do not sort either).
      Use the search box and **Filter**, which do work.
    </Warning>
  </Accordion>

  <Accordion title="My products come from Shopify and it will not let me touch them">
    The products synced from a store are **read-only**. On their row you will not
    see **Edit** but **Import** (*Importar*) (*"Copy to the editable catalog"*),
    and they cannot be ticked with the checkbox or have their **visible** switch
    changed either.

    Import them first and then edit the copy.
  </Accordion>

  <Accordion title="Who on my team can touch the catalog?">
    **Anyone invited to your business**: there are no role permissions on this
    screen. They can create, edit, hide and also **delete** products, with the
    **Delete** button that does not ask for confirmation. Bear it in mind when
    you invite people.
  </Accordion>

  <Accordion title="Things this screen does not have">
    So that you do not go looking for them: **there are no categories, no tags, no
    weight, and no "was price / struck-through price"**. There is no
    **duplicate** button (it is done by CSV), **no undo** and **no trash can**.
  </Accordion>
</AccordionGroup>

## If something does not work

| What you see                                                                                                      | Almost always it is                                                  | How it is fixed                                               |
| ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------- |
| **"No products yet"** — or **"… has nothing to sell"** with the name of your agent — and you know you loaded them | You have another agent selected and the list is trimmed to it        | Switch agents in the selector in the top bar                  |
| **"No results"** (*"Sin resultados"*)                                                                             | You have a search or a filter set                                    | Press **Clear filters** (*Limpiar filtros*)                   |
| The panel opens **almost empty**                                                                                  | You have not chosen the type yet                                     | Choose **Physical product**, **Service** or **Info product**  |
| **It will not let me type the price**                                                                             | You have **Quantity pricing** on                                     | Type it into the **1 unit** row of the scale                  |
| **I change the price at the top and it does not save**                                                            | The product has several variants: the price of each one is in charge | Change the price on the variant's row                         |
| **It will not let me type the stock quantity**                                                                    | Here you only declare *whether* it is tracked                        | Record the movement in **Inventory**                          |
| **I lost what I was typing**                                                                                      | You closed the panel (or clicked outside) without saving             | There is no draft: it has to be redone. Always press **Save** |
| **I saved and the product disappeared** from the table                                                            | You took it away from the agent you have open                        | It was not deleted: switch to an agent that does sell it      |
| **"The product was saved, but the sales funnels were not"**                                                       | The second step of the save failed                                   | Reopen the product and tick the sales funnels again           |
| The agent **still does not name** a product you have just created                                                 | Changes can take up to a minute to reach a conversation under way    | Wait a minute and try again                                   |
| The agent **does not find it** even though it is active                                                           | The customer names it differently from what it is called             | Rename the product with the words the customer uses           |
| **I turned "Visible" off and the agent carries on offering it**                                                   | "Visible" does not silence the agent                                 | Turn off **Active**                                           |
| **The search box and the filters disappeared**                                                                    | You ticked a product's checkbox: the selection bar replaces them     | Press **Clear** (*Limpiar*)                                   |
| **I uploaded the CSV and wiped out a product**                                                                    | You repeated the **handle** of one that already existed              | To create, empty id and a new handle                          |
| **I edited the stock in the CSV and nothing changed**                                                             | That column is exported but ignored on import                        | Record it in **Inventory**                                    |
| **"Infoproducto · ⚠️ sin entrega"** in the list                                                                   | You gave it neither a delivery file nor a link                       | Open it and fill in **Automatic delivery**                    |
| **It does not come up in the dropdown** when recording a sale                                                     | Its price is 0                                                       | Give it a price greater than zero                             |

<Warning>
  **Your product photos sit at a public internet address.** It has to be that way
  so that WhatsApp can show them: anyone with that link sees it, without logging
  into your account. And **deleting the product does not delete the photo**: that
  link carries on working. Do not upload anything here that should not be public.
</Warning>

## The same thing, from your assistant

<Note>
  This section is **optional and only applies if you connected Claude, ChatGPT or
  Codex** to your business. If you work in the dashboard, you are already done.
</Note>

Your assistant can read the whole catalog, load it in bulk from a file you hand
it, and correct it. **Reading works with the basic connection; writing does
not**: you have to ask for the catalog write permission in the address you
connect with. It is set up ready to copy and paste in
[The connection URL](/en/reference/connection-url).

| Tool              | What it does                                                                     |
| ----------------- | -------------------------------------------------------------------------------- |
| `list_products`   | A paginated list. It filters by text, visibility, active and type.               |
| `get_product`     | The complete record of a product: description, variants, images and price scale. |
| `upsert_products` | Creates or updates up to 100 products per call. **Destructive.**                 |
| `delete_product`  | Deletes a product. **Final, with no trash can.**                                 |

**The rule that avoids disasters:** when writing, each product is a **complete
row that replaces the one that was there** — whatever is not sent is written
empty. That is why the right order is always to read the record, change only your
own bit, send it back whole and read it again to check. The system does force your
hand quite a bit: it rejects incomplete rows before touching anything.

<Warning>
  **Three things that can indeed cost you dearly from the assistant.**

  1. Telling it that a product **has no variants** when it does **wipes out all of
     them** and replaces them with a single one. It is the costliest mistake in the
     catalog.
  2. When updating a product with variants you have to send **all** of them: a
     variant that is not sent **is deleted**, and one that is sent without its
     identifier creates another new one and deletes the old one — the orders and
     the stock that pointed at it are left with no reference.
  3. A product **with no identifier** is looked up by name: a name equal to that of
     one that already exists **overwrites it**. Have your assistant always use the
     identifier when updating.
</Warning>

And three limits worth keeping in mind:

* **The photos are not touched** from the assistant: uploading a batch does not
  delete or change your products' images. They are managed in the dashboard.
* **The stock quantity is not either.** Even if your assistant sends a number, it
  is not written: it lives in Inventory. What it can declare from outside is
  *whether* the product is stock-tracked.
* **The products synced from a store are read, not edited.**

Phrases that work:

* *"List my catalog before writing anything, so as not to duplicate."*
* *"Raise the price of the Polo oversize de algodón pima to 89 soles. Read its
  record first and send the whole row back with that single change."*
* *"Set the Combo Verano to inactive: read its record, change only that and send
  the complete row back."*
* *"Open three of the ones you have just uploaded and show me the price and the
  currency of each variant."*

<Tip>
  That last phrase matters. In the listing, the price you see is **the cheapest**
  among the variants and the code is the one from that same variant, so a batch
  that uploaded the wrong currency on a single variant **can look correct from a
  distance**.
</Tip>

<CardGroup cols={3}>
  <Card title="The file Library" icon="paperclip" href="/en/guides/library">
    The photos and the PDFs the agent sends, and where the automatic deliveries
    come from.
  </Card>

  <Card title="The sales playbook" icon="book" href="/en/guides/sales-playbook">
    The script your agent uses to present and defend those prices.
  </Card>

  <Card title="Orders and metrics" icon="chart-line" href="/en/guides/orders-and-metrics">
    What sold out of all this and how much it brought in.
  </Card>
</CardGroup>
