How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.
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 (an oversized pima cotton T-shirt).The dashboard is in Spanish, so buttons and on-screen messages are quoted here
exactly as you will see them, with the English meaning in parentheses.
Where it is. Go into the dashboard at
optimind.darkfunnels.ai and, in the left-hand
menu, inside Ventas (Sales), under the Comercio (Commerce) divider,
click Catálogo (Catalog). (If you prefer to go straight there, type
optimind.darkfunnels.ai/catalog into the browser’s address bar. The old
address, /catalogo, takes you to the new one on its own.)The catalog is part of the Ventas app. If you do not see Ventas in your
menu, your user does not have access to that app: ask whoever manages your
account for it (see Invite your team).
This is what the Catalog looks like on day one: «Aún no hay productos» (No products yet), and at the top right the Plantilla CSV and Añadir producto buttons.
A shortcut from Home. While your Inicio (Home) shows the Pon tu
empresa a operar (Get your business up and running) card, expand it (if it
is collapsed, with Ver pasos, See steps): under Cuando quieras
(Whenever you like) is the step «Carga tu catálogo para que dé precios
exactos» (Load your catalog so it gives exact prices). As long as you have no
products at all, its Añadir producto (Add product) button takes you to
the Catalog with the new-product form already open.
The screen itself sums it up under the title: «El precio sale de aquí» (The
price comes from here). (If you have more than one funnel, that sentence starts
by saying which funnel you are looking at: «Lo que vende «…», más los productos
sin embudo asignado», What «…» sells, plus the products with no funnel
assigned. The list is trimmed to that funnel.)That is literal: the agent carries a written instruction to check the catalog
every time the customer asks about a product or its price, and not to make
prices up. The practical consequence is simple: if a product is not in the
catalog, your agent has nowhere to get its exact price from.
Loading it is all you have to do. There is no need to link the product to
the sales playbook, 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: what you change can take up to a minute to reach the agent, and if
you tick specific funnels on the product, the others stop seeing it (see
Visible and Active).
The complete record: name, description, photos and price.
Variante (Variant)
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-NEGR-M). It is optional; it is there for searching.
Tipo (Type)
Whether what you sell is a Producto físico (Physical product), a Servicio (Service) or an Infoproducto (Info product). It is chosen first and it changes the rest of the form.
Activo (Active)
Whether the agent can find it when it searches.
Visible en el catálogo (Visible in the catalog)
Whether it appears in the catalog WhatsApp shows inside your business profile. It is not the same as Activo.
It is at the top right, next to another button called Plantilla CSV
(CSV template). With the catalog empty you also have the same button in
the middle of the screen, under «Aún no hay productos».No new page opens. A panel slides in from the right-hand side, top to
bottom, over the dimmed background. It is titled Nuevo producto (New
product) — and Editar producto (Edit product) when you open one that
already exists. Do not look for a “back” button: there is none. It closes
with Cerrar (Close, at the top), with Cancelar (Cancel, at the
bottom) or with the Esc key.
2
Choose what you are going to sell
The first and only thing you will see is the heading «¿Qué vas a
vender?» (What are you going to sell?) with three cards: Producto
físico (Physical product), Servicio (Service) and Infoproducto
(Info product). Until you choose one, the rest of the form does not exist
and the Guardar (Save) button is greyed out: it will not let you click
it.For the Moda Sol T-shirt: Producto físico.
The panel starts by asking what you sell. Each card tells you what the agent will do if you choose it.
3
Give it a name and describe how it is sold
Once the type is chosen, the whole form unfolds. In Título y
descripción (Title and description) there is only one field with an
asterisk: Nombre * (Name). Type Polo oversize de algodón pima.The Descripción (Description) is optional, but it is not decorative:
the field says so — «Detalles que el agente puede usar al vender.»
(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.”
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” (the words for a T-shirt in different countries) only in the
description does not help it find the product: put them in the name.
4
Upload the photos
In Medios (Media), drag the images in or click where it says
«Arrastra o haz clic para subir» (Drag or click to upload).
Underneath it reads «PNG, JPG o WEBP. La primera imagen es la principal.»
(PNG, JPG or WEBP. The first image is the main one.) — that is a
recommendation, not a filter: the dashboard accepts any image file.The first photo carries the Principal (Main) label. Any of them, the
main one included, is removed with the ×. They cannot be reordered by
dragging: to change the main one you have to remove the ones in front of
it.
Photos do not wait for the Guardar 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 from a product that already existed and
then cancel, the photo really has already been deleted, but the product’s
record still names it: it will be left as a broken photo. Open the product,
remove that photo and save.
5
Set the price
In Precios (Prices) there are two fields: Precio * (Price) and
Moneda (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 T-shirt: 79 and PEN (S/). If you have cents, type them with a
point, not a comma: 79.90. If you leave the price empty or type something
that is not a number, on saving you get «Pon un precio válido.» (Enter a
valid price.)Below it you will see the Precios por cantidad (Quantity pricing)
switch. Leave it off for now: we cover it in
its own section.
The form for a physical product, from the top down to Precios: Tipo, Título y descripción with the polo shirt, Medios, and Precios with 79 in PEN (S/) and «Precios por cantidad» off.
6
Decide whether you keep count of stock
In Inventario (Inventory) there is a Controlar stock (Track
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: «El agente avisa cuando algo se agota y no ofrece
lo que no tienes.» (The agent warns when something runs out and does not
offer what you do not have.)
Quantities are not typed here. When you turn on Controlar stock,
Cantidad disponible (Available quantity) appears, but it is
read-only: it will not let you type. Underneath, the panel itself says
so — «Lo lleva Inventario. Para moverlo, registra un movimiento en
Inventario» (Inventario handles it. To change it, record a movement in
Inventario) — with a link to that screen. It is the most common confusion
in this form. See Stock: when to turn it on.
7
Add sizes and colors, if you have them
On a physical product the block is called Variantes (Variants) and
comes with the Generar variantes por opciones (Generate variants from
options) button: you give it the axes (Color: Negro, Blanco, Arena /
Talla: S, M, L, XL) and it creates the combinations in one click, each with
its own code. It takes up to 3 axes and 100 combinations.The Variants section tells the whole story.
8
Save — and check that it shows up in the table
The last block is Disponibilidad (Availability), with Visible en el
catálogo and Activo switched on. Leave them like that and click
Guardar.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.
The table with three products: each row with its SKU, its price, its inventory («Sin control»), the funnels that sell it («Todos»), the «visible» switch on and the Editar button.
Closing the panel throws away everything you typed, with no warning. It
makes no difference whether you click Cerrar at the top, Cancelar
at the bottom, press the Esc key 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 Guardar.
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
Producto físico (Physical product)
«El agente cotiza el envío y genera la guía.» (The agent quotes shipping and generates the waybill.)
A Variantes (Variants) block, with the size and color generator.
Servicio (Service)
«El agente lo vende y coordina por chat. No genera envío.» (The agent sells it and arranges it over chat. It does not generate a shipment.)
The block is called Modalidades (Options): it asks for the name and price of each option.
Infoproducto (Info product)
«Su envío es digital: se entrega solo, apenas se confirma el pago.» (Its delivery is digital: it is delivered on its own as soon as payment is confirmed.)
It has no variants block. Instead, Entrega automática (Automatic delivery) appears.
The stock-tracking notice changes too: on a physical product it talks about
stock on hand, on a service about cupos disponibles (available slots)
(«El agente no ofrece lo que se agotó.», 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.
Does your service need a date and time? When you choose Servicio, the
panel warns you: «¿Necesita fecha y hora (citas)? Eso se programa en
Calendario; aquí solo se vende y cotiza.» (Does it need a date and time
(appointments)? That is scheduled in Calendario; here it is only sold and
quoted.) The catalog sets the price; the schedule lives in the Calendario
(Calendar) app.
Changing the type of a product that already exists does not delete anything
straight away. The panel itself says: «Cambiar el tipo oculta lo que ya no
aplica. Nada se borra hasta que guardes.» (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,
or turning an info product that had automatic delivery into another type — saving
asks you for a two-step confirmation with the Convertir y guardar (Convert
and save) button.
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: «Cuando el pago se confirma (voucher
aprobado), el agente le manda esto al cliente sin que tú hagas nada.» (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 Librería (Library) — only the files already marked as
sendable for the funnel you have open are offered. If there are none, the
panel tells you: «Sube un archivo a la Librería y márcalo como enviable para
poder entregarlo aquí.» (Upload a file to the Library and mark it as
sendable to be able to deliver it here.) They are prepared in
The file Library.
A link — it has to start with http:// or https://. If not, on saving
you get «El enlace debe empezar con http:// o https://» (The link must
start with http:// or https://).
If you save with neither of the two, the product is saved anyway, but the
panel warns you: «Ojo: sin archivo ni enlace, el agente no podrá entregarlo
solo.» (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». It is worth fixing: otherwise the agent
can charge for something it then does not know how to deliver.
Once the type is chosen, the panel shows seven blocks. Six are the same for
all three types; the seventh depends on the type and sits between
Inventario and Disponibilidad.
Order
Block
What it is for
1
Tipo (Type)
What you sell. It is chosen first and it conditions the rest.
2
Título y descripción (Title and description)
The name (required) and the text the agent uses when selling.
3
Medios (Media)
The photos.
4
Precios (Prices)
Price, currency and the quantity scale.
5
Inventario (Inventory)
The stock-tracking switch and the SKU.
6
Variantes / Modalidades / Entrega automática
Depending on the type. The info product has no variants.
7
Disponibilidad (Availability)
Visible, Activo and — if you have more than one funnel — which funnels sell it.
Nombre *. If it is missing: «El nombre es obligatorio.» (The name
is required.)
Precio *. If it is empty or not a number: «Pon un precio válido.»
Everything else — description, photos, SKU, variants, stock, funnels — is
optional and can be filled in later.
With «Precios por cantidad» 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 ask you for the 1-unit price, not
«Pon un precio válido».With variants, the price is asked for on each one, not at the top. See
Variants.
Do not leave products with a price of 0. They are saved without complaint,
but the agent would see a price of 0 and, on top of that, 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 0. Watch
out for variants generated without a base price: they are born at 0.
It is the most powerful feature on this screen and the least obvious. Turn on
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 + Añadir tramo (+ Add tier). And with + De N a más
(precio por unidad) (+ From N up (price per unit)) you define the open tier:
from 6 up, S/ 65 each. Each tier has to cost more than the previous one: if
the 3-unit tier costs less than the 2-unit one, the panel will not let you save
and tells you which one to fix.
Quantity pricing switched on: the total price for each quantity (1 → 79 and 3 → 199 PEN) and, underneath, the promotion (1 → 69 PEN) with its end date.
The moment you turn it on, the «Precio» field at the top is locked and it is
renamed Precio (1 unidad, de la escala) (Price (1 unit, from the scale)).
It is not a fault: the price is now typed into the 1-unit row of the table.
For quantities that are not on your scale, the agent combines tiers and adds
them up. If the customer asks for 10 T-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 De N a más tier. The agent does not do the
arithmetic: when it looks up the product with the quantity the customer asked
for, it receives the total already calculated.There is also Promoción con fecha de fin (Promotion with an end date): a
separate scale, with its own tiers and the Vigente hasta (Valid until)
field. While it is in force, the promotion overrides the list scale in the
conversation.
The scale belongs to the whole product. If you turn it on for a product with
sizes, the agent quotes with the scale and stops looking at each size’s price.
If your sizes cost different amounts, do not use the scale on that product, or
split it into separate products.
The promotion does not travel to the WhatsApp catalog. In the catalog
WhatsApp shows on your business profile, the 1-unit list price is
published, not 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.
In the CSV file, leaving the scale cell blank does not delete it: it leaves
it as it was. To remove it, turn off Precios por cantidad on the product and
save.
Moda Sol sells the same T-shirt in 3 colors and 4 sizes. That is 12
variants, and there is no need to type them one by one.
1
Type the base price first
In Precio, at the top. New combinations are born with that price; if
the field is empty, they are born at 0.
2
Click «Generar variantes por opciones»
It is in the Variantes block. Two axes open, already named Color
and Talla (Size).
3
Type the values for each axis
Separated by commas. Color: Negro, Blanco, Arena (black, white, sand).
Talla: S, M, L, XL. With + Añadir eje (+ Add axis) you can go up to
3 axes (color, size and, for example, sleeve). Underneath, the panel
keeps telling you how many will come out: «Se generarán 12 variantes.»
(12 variants will be generated.)
4
Click «Generar» (Generate)
The 12 combinations come out in one click, with titles like «Negro / M».
The SKU automático (Automatic SKU) checkbox comes ticked: each one is
born with its code (POLO-NEGR-M, for example). The generator goes up to
100 combinations at once.
5
Adjust the prices that fall outside the norm
Each row carries its own price. If the XL costs S/ 10 more, change it on its
row. And if you want to change the price of all of them at once, use the
Mismo precio para las 12 variantes (Same price for the 12 variants)
row and click Aplicar a todas (Apply to all). Then click Guardar:
until then nothing is saved.
With variants, the price at the top is no longer typed. The field is
renamed Desde (el más barato) (From (the cheapest)), it is locked and it
shows the price of the cheapest variant. Underneath it explains: «Lo lleva
cada variante. Para cambiarlo, edítalo abajo en Variantes.» (Each variant
carries it. To change it, edit it below in Variantes.) The SKU at the top
gets the same treatment.The currency is changed at the top, and it applies to all the variants. But
it does not convert anything; the panel warns you: «La moneda se aplica a las
12 variantes. Los precios no se convierten: 79 sigue siendo 79, solo cambia la
moneda.» (The currency applies to the 12 variants. Prices are not converted:
79 is still 79, only the currency changes.) If you switch from PEN to USD,
correct the prices.
If you generate again on a product that already had variants, the ones that
fit the new combination are kept with their price, and those that do not fit are
left at the end of the list with a warning, so that you remove them yourself if
they are not needed. This also happens to the single variant of a product you
created without sizes.
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 are added with Agregar modalidad (Add option) and ask for
a name and a price. The Cupos (Slots) are shown but not typed — same as
stock, Inventario handles them. An info product does not have this block: a
single presentation.
Turn on «Controlar 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 0 (or below): 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. Careful: it also shows like this if you turned on Controlar stock and have not yet recorded any movement in Inventario. In that case the agent treats it as out of stock: do the initial load.
With Controlar stock off (the table reads Sin control) 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 loaded in another app: Inventario. From the catalog you only
declare whether the product is tracked. The first load is done in
Inventario with Registrar movimiento (Record movement) → Carga inicial
(+) (Initial load (+)); after that, every purchase, return or adjustment is
also recorded there.
The Inventario screen, still empty («El catálogo está vacío»): this is where quantities are loaded and moved, with «Registrar movimiento».
Inventario comes switched on in new accounts, but it can be switched off. If
the «Inventario» link in the product panel takes you to a screen that says
«App no activa» (App not active), it is switched off in your company:
switch it on in Administración → Apps (Administration → Apps) (or ask
whoever manages the account). If it says «No tienes acceso a Inventario»
(You do not have access to Inventario), the app is on but your user does not
have it: ask to be given it in Administración → Personas y accesos
(Administration → People and access).In both cases, sort it out before turning on Controlar stock. Otherwise
the agent will treat the product as out of stock (even though the
inventario column reads «Sin control») and you will not be able to load units
into it.
That list, Embudos que lo venden (Funnels that sell it), only appears if
your business has more than one funnel. If you have one, you will not even see
it. And the rule is not the one it looks like: «Sin marcar ninguno, lo cotizan
todos los embudos.» (With none ticked, every funnel quotes it.) — ticking
nothing means “all”, not “none”. As soon as you tick one, the text changes:
«Solo los embudos marcados podrán cotizarlo.» (Only the ticked funnels will
be able to quote it.)
It is an organizing rule, not a security barrier. It is there so that the
agent of your wholesale funnel does not quote the retail one’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.
Funnels are saved in a second step, after the product. If that step fails,
you will see an error message and the panel will stay open, even though the
product has already been saved. If it was a new product, do not click Guardar
again: you would create an identical one. Close the panel, reload the page,
open it with Editar (Edit) and tick the funnels again.And if on saving you take the product away from the funnel you have open, it
warns you — «Ya no lo vende el embudo abierto: sale de esta lista.» (The open
funnel no longer sells it: it leaves this list.) — and it disappears from the
table. It has not been deleted: it stopped belonging to that funnel.Two things other screens do with your products, so they do not take you by
surprise (see Your funnels):
If you duplicate a funnel, the copy is born selling the same products the
original had ticked.
If you accept a funnel that another account shared with you, its products
arrive in your catalog as new products, ticked only for that funnel and
without stock tracking.
With more than one funnel, the list you see is trimmed./catalog shows
what the funnel you have chosen in the funnel selector sells — the dropdown with
its name, just below Ventas in the left-hand menu (with the menu collapsed
it sits at the top; on the phone, inside Más, More) — plus whatever is not
assigned to any funnel. The counter at the foot («Mostrando N de M
productos», Showing N of M products) counts what is already trimmed, and the
CSV template you download will come out trimmed the same way. Before concluding
that you lost products, switch funnels in that selector.One exception: a product ticked only for a funnel you have already deleted
does not appear in any funnel’s list, and your agents stop offering it. That is
why, before deleting a funnel, open each product ticked only for it and tick
it for another funnel too, or untick all the funnels so that all of them sell it.
To load a hundred products, or to raise the price of a whole season, the
one-by-one form is no use. The Plantilla CSV button (next to «Añadir
producto») opens the «Editar catálogo en bloque (CSV)» (Bulk-edit catalog
(CSV)) box, with two numbered steps.
The «Editar catálogo en bloque (CSV)» box: first you download, you edit in your spreadsheet, and then you upload.
1
Download the template
The Descargar plantilla (.csv) (Download template (.csv)) button. It
downloads a file with your current products, which you can open in Excel or
Google Sheets.Watch what it contains. The box itself says so: «los productos editables
de la lista que tienes debajo» (the editable products in the list you
have below). In other words, only those of the funnel you have open,
and at most 1000 products, the most recent ones.
2
Edit it in your spreadsheet
Change what you need and save as CSV. Do not delete any column. The id,
handle and variant_id columns are the ones that let what already exists
be updated, and if the handle, name or currency column is missing,
the whole file is rejected.
3
Upload it and check the preview
Click Elegir archivo CSV (Choose CSV file). Before applying anything,
the box shows you a summary — how many products, how many nuevos
(new), how many a actualizar (to update) and how many variantes
(variants) — and, if there are rows with errors, the list of those that
«se omitirán» (will be skipped) and why.
4
Apply the changes
Aplicar cambios (Apply changes). When it finishes you will see how
many were created, how many were updated and how many gave an error, and
the reason for the errors. The cap is 500 products per upload: with
more, the whole upload is rejected; split it into several files.
A row with an id updates the product that already exists.
A row without an id creates a new product. Careful: if you delete the
id from a template row, the original is not updated: an identical one is
born, because the handle the template comes with is not the one the product
has stored. To change a product that already exists, always keep its id.
And the other way round: if you type by hand a handle equal to the one the
system stores for an existing product, that row without an id updates it.
For a product created in the dashboard, that handle is its name in lowercase
with hyphens (polo-oversize-de-algodon-pima), not the one the template
comes with.
A product that is not in the file is not touched. Deleting a product row
does not delete the product.
Removing a variant’s row deletes that variant from the product.
But removing all the variant rows of a product that has several does not
delete anything: that row is rejected with an error warning that the
product «tiene N variantes y esta fila no las trae» (has N variants and
this row does not include them), and the product is left intact. The same
happens if none of its variant rows carries its variant_id.
With variant rows, the price goes in variant_price, not in price. If
you write a price in the product row, that product is skipped with the
warning «el precio de la fila maestra no se aplica cuando hay filas de
variante» (the master row’s price is not applied when there are variant
rows).
For clothing, one row per combination, with variant_title («Negro / M»)
andvariant_options («Color:Negro; Talla:M»).
What is in charge is the «handle» column, not the name. It is the grouping
key the template comes with already filled in (something like
polo-oversize-de-algodon-pima- followed by a long code). All the rows with
the same handle are a single product. If you copy a row to create another
product and leave the same handle, the product you expect is not born: the two
rows are treated as one thing, and one is ignored or overwrites the other.To really create one: leave the id empty and put in a clearly new
handle, for example with -copia at the end. Do not use the product’s bare
name, in lowercase with hyphens: it is usually the handle the original already
has stored, and you would overwrite it. A row without a handle is not accepted
— it is skipped with «Falta el handle (clave de agrupación).» (The handle
(grouping key) is missing.)From the Añadir producto button this does not happen: two products with the
same name created there are two different products.
What the file does not change.Photos are not edited by CSV (only from
the product editor), nor is an info product’s automatic delivery. 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 Inventario. What the file does declare is whether the product is
tracked, in the track_inventory column.
In the file
What it is
id
The product identifier. With an id, it updates. Always keep it on products that already exist.
handle
The grouping key. It is the one that decides which rows are the same product.
product_type
fisico, servicio or infoproducto (physical product, service or info product). Left empty, it does not touch the type (and a new product is born physical).
variant_id
The identifier of each variant. It is what lets the variant be updated in place.
price_tiers
The quantity pricing scale, like 1:79; 2:149; 3:209. The open tier goes at the end, like 6+:65. Leaving it blank does not delete it.
There is no «Duplicar» (Duplicate) button. If you do not want to fill in
the form again, the shortcut is the template: download the file, copy the
product’s rows, delete their id and give all of them the same new handle
(for example, the one they come with plus -copia at the end), and upload it
again. The copy arrives without photos, without automatic delivery and
with no funnels ticked (all your funnels sell it). You complete that afterwards
with Editar.
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 match at least half the words. And 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.
When the agent looks up a product with the quantity the customer asked for,
it receives the total already calculated, with the scale and the
promotion if there are any.
Translated into a recommendation: the product name has to be the name your
customer would ask for it by.
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 T-shirt appears 12 times, each with the product’s main photo.
Only the products that are both «Activo» and «Visible en el catálogo» get
in, and only if they have a price and a currency.
With quantity pricing, the 1-unit list price is published, not the
promotion.
If you ticked funnels on the product, each number publishes its own. A
product with no funnels ticked — which is the normal case — is published by
all your numbers.
Deactivating or hiding also deletes it from WhatsApp. It is not left
hanging there. And do not worry: only the products the dashboard published are
touched; the ones you had created by hand in WhatsApp stay as they are.
Your agent takes prices from the catalog, but also from the text of its
sales playbook and from the files in the
Library it reads to know how to answer (a price list in
PDF, for example). If the playbook says “the Polo oversize de algodón pima costs
S/ 89” and the catalog has S/ 79, the agent can contradict itself in front of
the customer.That is what the playbook’s Doctor is for: when a line of the playbook puts
a price near the full name of a catalog product (or its SKU) and it does not
match, it warns you. If there is only one possible price, it offers to fix it
in one click with the Poner S/ 79 (precio del catálogo) (Set S/ 79
(catalog price)) button; if the product has several variants, it shows you
their prices and you decide. Products with quantity pricing are not compared.
See The Doctor.
The healthiest approach is not to write prices in the playbook: leave them
in the catalog and let the agent look them up there.
In the actions column of its row, click Editar (Edit). Clicking the
row does not open the product — in this table it only opens with that
action — so if you click on it and it does not open, it is not broken: use
the action.
Withdrawing a product without deleting it (recommended)
Tick the checkbox on its row and click Desactivar (Deactivate) 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 («N seleccionado(s)», N selected) you have the four
bulk actions — Activar (Activate), Desactivar (Deactivate),
Mostrar (Show) and Ocultar (Hide) — which apply straight away to
everything you have ticked. It is the quick way to withdraw a whole season.
Limpiar (Clear) removes the selection.
Really deleting a product
There is no trash can and no delete button inside the product panel. From
the dashboard you delete it like this: tick the checkbox on the row and
click «Eliminar» (Delete, in red) in the selection bar.
That button does not ask for confirmation and cannot be undone. One
click and the product disappears with its variants; it is not archived.
Having orders or sales already recorded does not stop it: the product is
deleted anyway and those records lose their link to it. That is why, almost
always, what you want is Desactivar, not Eliminar.
Finding something in a large catalog
Two tools work: the «Buscar productos…» (Search products…) search
box (it searches by product name and by the SKU of its variants; it does
not search the description) and the Filtrar (Filter) button, which
opens «Filtrar catálogo» (Filter catalog) with three filters: Tipo
(Type), Visibilidad (Visibility: Visible / Oculto, Hidden) and
Estado (Status: Activo / Inactivo, Active / Inactive).The list loads 50 at a time as you scroll down, with no page numbers,
and at the foot it says «Mostrando N de M productos».
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
Ordenar (Sort) button opens its box with «Nombre», «Precio»,
«Inventario» and «Actualizado» (Name, Price, Inventory, Updated), but the
list does not change order: it comes out from the most recent product to
the oldest (the column headers do not sort either). Use the search box and
Filtrar, which do work.
Who on my team can touch the catalog?
Anyone with access to the Ventas app. Inside Ventas there are no finer
permissions for the catalog: that person can create, edit, hide and also
delete products, with the Eliminar button that does not ask for
confirmation. Anyone without Ventas does not see the catalog.Each person’s access is granted in Administración → Personas y accesos.
See Invite your team.
Who sees my product photos?
Photos are stored in a private space belonging to your company, not at a
public internet address. The dashboard shows them to you with temporary
links that expire on their own.What is public is what you publish: the main photo of each product that
goes into the WhatsApp catalog can be seen by anyone who opens your
business profile. If a photo must not be seen by anyone outside, do not
make it the main one on an active, visible product.
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.
«… no tiene nada que vender» (… has nothing to sell) with your funnel’s name, and you know you loaded products
The list is trimmed to the funnel you have chosen and those products belong to another one
Switch funnels in the selector, just below Ventas in the left-hand menu
«Sin resultados» (No results)
You have a search or a filter set
Click Limpiar filtros (Clear filters)
The panel opens almost empty
You have not chosen the type yet
Choose Producto físico, Servicio or Infoproducto
It will not let me type the price and the field says «Precio (1 unidad, de la escala)»
You have Precios por cantidad on
Type it into the 1 unit row of the scale
The price at the top is locked and says «Desde (el más barato)»
The product has variants: each one carries its own price
Change it on the variant’s row, or use Mismo precio para las N variantes and Aplicar a todas
I switched from PEN to USD and the numbers stayed the same
The currency does not convert prices
Correct the prices by hand
It will not let me type the stock quantity
Here you only declare whether it is tracked
Record the movement in Inventario
The Inventario link opens «App no activa»
The Inventario app is switched off in your company
Switch it on in Administración → Apps, or ask whoever manages the account
The Inventario link opens «No tienes acceso a Inventario»
The app is on, but your user does not have it
Ask to be given it in Administración → Personas y accesos
I lost what I was typing
You closed the panel (with Cerrar, Cancelar, Esc or a click outside) without saving
There is no draft: it has to be redone. Always click Guardar
I saved and the product disappeared from the table
You took it away from the funnel you have open
It was not deleted: switch to a funnel that does sell it
On saving, an error message appears and the panel stays open
The second step of the save (the funnels) may have failed: the product may already be saved
If it was new, do not click Guardar again. Close, reload the page and, if the product is already in the table, open it with Editar and tick the funnels again
«Embudo eliminado» in the embudos column
It was ticked for a funnel that no longer exists
Open it and tick the funnels that should sell it
The agent still does not name a product you just created
Changes can take up to a minute to reach it
Wait a minute and try again
The agent does not find it even though it is active
The customer calls it something different from its name
Rename the product with the words the customer uses
I turned «Visible» off and the agent still offers it
«Visible» does not silence the agent
Turn off Activo
The search box and the filters disappeared
You ticked a product’s checkbox: the selection bar replaces them
Click Limpiar
On uploading the CSV, a product gives an error saying it «tiene N variantes» (has N variants)
The sheet is missing its variant rows, or its variant_id
Download the template again and edit on top of it, without removing those rows or that column
On uploading the CSV, a product is skipped with «el precio de la fila maestra no se aplica…»
You put price in the product row and it has variants
Put the price in variant_price and leave price empty
I uploaded the CSV and two products got mixed up
You repeated another product’s handle
To create one, 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 Inventario
«Infoproducto · ⚠️ sin entrega» in the list
You gave it neither a delivery file nor a link
Open it and fill in Entrega automática
It does not appear in the dropdown when recording a sale
Another funnel sells it, it is inactive or its price is 0
Switch to the funnel that sells it in the menu selector (or tick it for this one too), activate it or give it a price greater than 0
This section is optional and only applies if you connected an AI assistant
(Claude, ChatGPT, Codex or another compatible one) to your business. If you
work in the dashboard, you are already done.
Your assistant can read the whole catalog, load it in bulk from a file you hand
it, and correct it. With the link the dashboard gives you (Personalizar →
Asistentes IA → Copiar link, Customize → AI assistants → Copy link, the same
one as in the connection guides), your assistant can already read and write
the catalog, and also delete products. If you connected with the base
address, with nothing after it, it can only read the catalog: to write, you
need to add catalog_write. See The connection URL.
And, as in the dashboard, your user has to have access to the Ventas app.
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 may be left
empty. That is why the right order is to read the record, change only your
part, send it back whole and read it again to check. The system helps quite a
bit: it rejects incomplete rows before touching anything.
Two things that really can cost you dearly from the assistant.
When updating a product with variants you have to send all of them,
each one with its identifier. A variant that is not sent is deleted,
and one sent without its identifier comes in as new and the old one is
deleted — the orders and stock that pointed at it are left with no
reference. There is a safety net: on a product with several variants, if
none arrives with its identifier, or if the assistant says the product has
no variants, that row is rejected without touching anything.
A product with no identifier is looked up by name: a name equal to that
of an existing one overwrites it. Ask your assistant to update using the
identifier.
And three limits worth keeping in mind:
Photos are not touched from the assistant: uploading a batch does not
delete or change your products’ images. They are managed in the dashboard.
Nor is the stock quantity. Even if your assistant sends a number, it is
not written: it lives in Inventario. What it can declare from outside is
whether the product is stock-tracked.
The price scale stays as it is if the assistant does not mention it, and
is deleted if you ask it to remove it.
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 just uploaded and show me the price and currency
of each variant.”
That last phrase matters. In the listing, the price you see is the cheapest
among the variants and the code is that same variant’s, so a batch that
uploaded the wrong currency on a single variant can look correct from a
distance.
The file Library
The photos and the PDFs the agent sends, and where the automatic deliveries
come from.
The sales playbook
The script your agent uses to present and defend those prices.
Orders and metrics
What sold out of all this and how much it brought in.
Last modified on October 19, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"DarkFunnels","description":"Vende por WhatsApp con un agente de ventas IA — y opéralo desde tu asistente.","colors":{"primary":"#C2562A","light":"#D86A3C","dark":"#9A3F1C"},"logo":{"light":"https://mintcdn.com/darkfunnels/Df-1lKh1Aj5k8c-r/logo/light.svg?fit=max\u0026auto=format\u0026n=Df-1lKh1Aj5k8c-r\u0026q=85\u0026s=db60a9a883ed42e13a06aded18a08fb0","dark":"https://mintcdn.com/darkfunnels/Df-1lKh1Aj5k8c-r/logo/dark.svg?fit=max\u0026auto=format\u0026n=Df-1lKh1Aj5k8c-r\u0026q=85\u0026s=ab6a8b17d7e5e0d3b45de82ecd342327"},"favicon":"https://mintcdn.com/darkfunnels/Df-1lKh1Aj5k8c-r/favicon.svg?fit=max\u0026auto=format\u0026n=Df-1lKh1Aj5k8c-r\u0026q=85\u0026s=caa397a60f25d85c3d14d40fc8bb4841","navbar":{"primary":{"type":"button","label":"Entrar al panel","href":"https://optimind.darkfunnels.ai"}},"footer":{"socials":{"website":"https://darkfunnels.ai"}},"seo":{"metatags":{"og:locale":"es_PE"},"organization":{"id":"https://darkfunnels.ai/#organization","name":"DarkFunnels","url":"https://darkfunnels.ai","sameAs":["https://github.com/darkfunnels-ai"]},"indexing":"navigable"},"fonts":{"family":"Manrope"},"errors":{"404":{"redirect":false}},"contextual":{"options":["copy","view","claude","chatgpt","perplexity","cursor","vscode","mcp"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"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?features=all (without parameters it only carries the default, mostly read-only set) so an assistant such as Claude, ChatGPT or Codex can operate the workspace on the owner's behalf, in one company and within the permissions of the person who connects it. 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."]},"styling":{"latex":false},"navigation":{"languages":[{"language":"es","default":true,"href":""},{"language":"en","href":"en"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"darkfunnels","hasAudioNarration":false,"actualSubdomain":"darkfunnels","customDomains":["docs.darkfunnels.ai"],"gitSource":{"type":"github","owner":"darkfunnels-ai","repo":"optimind-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad6a0705c698d64cc0b179c","collectionId":"09c1a31a-e794-4676-b353-1de0e8edd33d","liveDeploymentHistoryId":"6ad6a0705c698d64cc0b179c","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ad6a0705c698d64cc0b179c","clientVersion":"0.0.3894","searchFilterCounts":[{"language":"en","tag":"Guides","count":11},{"language":"es","tag":"Guías","count":11},{"language":"en","tag":"Getting started","count":8},{"language":"es","tag":"Primeros pasos","count":8},{"language":"en","tag":"Optional: run it from Claude or ChatGPT","count":6},{"language":"es","tag":"Opcional: opéralo desde Claude o ChatGPT","count":6},{"language":"en","tag":"Reference","count":3},{"language":"es","tag":"Referencia","count":3},{"language":"en","tag":"Start","count":1},{"language":"en","tag":"Security","count":1},{"language":"es","tag":"Empezar","count":1},{"language":"es","tag":"Seguridad","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2-autocommit","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"teamspace","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"client-snapshot-docs-config","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"@font-face{font-family:'JetBrains Mono';src:url(/fonts/jetbrains-mono-latin.woff2) format('woff2');font-weight:100 800;font-style:normal;font-display:swap}:root{--primary:194 86 42;--primary-light:216 106 60;--primary-dark:154 63 28;--background-light:255 255 255;--background-dark:23 18 14;--gray-50:247 245 241;--gray-100:245 243 239;--gray-200:237 234 228;--gray-300:224 220 212;--gray-400:154 144 137;--gray-500:124 114 106;--gray-600:107 98 91;--gray-700:61 53 47;--gray-800:42 35 29;--gray-900:33 27 23;--gray-950:23 18 14;--font-paper-mono:'JetBrains Mono';--default-mono-font-family:'JetBrains Mono', ui-monospace, SFMono-Regular,\n Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;--rounded-xl:18px}"}],"page":{"pagePath":"en/guides/catalog","slug":"/en/guides/catalog","pageMetadata":{"title":"Product catalog for a WhatsApp AI agent","sidebarTitle":"The catalog","description":"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.","keywords":["product catalog for a WhatsApp AI agent","product variants and SKU","quantity pricing","WhatsApp Business catalog","bulk edit products CSV","stock tracking"],"href":"/en/guides/catalog"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Your agent does not know what anything costs until you tell it. `,_jsx(_components.strong,{children:`The catalog is\nwhere you tell it`}),`: a product, a price, its sizes, its photo. That is where it\ntakes the numbers from when the customer asks “how much is it?”.`]}),`\n`,_jsxs(_components.p,{children:[`This guide is the full walkthrough from the screen, click by click. The examples\nuse a made-up clothing store, `,_jsx(_components.strong,{children:`Moda Sol`}),`, and its star product: the `,_jsx(_components.strong,{children:`Polo\noversize de algodón pima`}),` (an oversized pima cotton T-shirt).`]}),`\n`,_jsx(_components.p,{children:`The dashboard is in Spanish, so buttons and on-screen messages are quoted here\nexactly as you will see them, with the English meaning in parentheses.`}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Where it is.`}),` Go into the dashboard at\n`,_jsx(_components.a,{href:`https://optimind.darkfunnels.ai`,children:`optimind.darkfunnels.ai`}),` and, in the left-hand\nmenu, inside `,_jsx(_components.strong,{children:`Ventas`}),` (`,_jsx(_components.em,{children:`Sales`}),`), under the `,_jsx(_components.strong,{children:`Comercio`}),` (`,_jsx(_components.em,{children:`Commerce`}),`) divider,\nclick `,_jsx(_components.strong,{children:`Catálogo`}),` (`,_jsx(_components.em,{children:`Catalog`}),`). (If you prefer to go straight there, type\n`,_jsx(_components.code,{children:`optimind.darkfunnels.ai/catalog`}),` into the browser’s address bar. The old\naddress, `,_jsx(_components.code,{children:`/catalogo`}),`, takes you to the new one on its own.)`]}),_jsxs(_components.p,{children:[`The catalog is part of the `,_jsx(_components.strong,{children:`Ventas`}),` app. If you do not see `,_jsx(_components.strong,{children:`Ventas`}),` in your\nmenu, your user does not have access to that app: ask whoever manages your\naccount for it (see `,_jsx(_components.a,{href:`/en/getting-started/invite-your-team`,children:`Invite your team`}),`).`]})]}),`\n`,_jsx(Frame,{caption:`This is what the Catalog looks like on day one: «Aún no hay productos» (No products yet), and at the top right the Plantilla CSV and Añadir producto buttons.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=b568a0a43bc647a6554023efe9ce2267`,alt:`Empty Catálogo screen with the message «Aún no hay productos» (No products yet) and the Plantilla CSV and Añadir producto buttons`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/catalogo/01-vacio.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=a59e1fc0246d4d6e0ba632f5374c5433 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=8878edbd4da1ac92ae76da908ea788e7 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=3ab649faca366f1dbf6a1caa4e1a76c8 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=e217821ae922f6d5bcdaeb8ef055152f 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=34ba4715bc5d7a1d6eb37b80fca12e9e 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/01-vacio.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=31c10d2527f7fa1f8cdea2555bd14cc3 2500w`})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`A shortcut from Home.`}),` While your `,_jsx(_components.strong,{children:`Inicio`}),` (`,_jsx(_components.em,{children:`Home`}),`) shows the `,_jsx(_components.strong,{children:`Pon tu\nempresa a operar`}),` (`,_jsx(_components.em,{children:`Get your business up and running`}),`) card, expand it (if it\nis collapsed, with `,_jsx(_components.strong,{children:`Ver pasos`}),`, `,_jsx(_components.em,{children:`See steps`}),`): under `,_jsx(_components.strong,{children:`Cuando quieras`}),`\n(`,_jsx(_components.em,{children:`Whenever you like`}),`) is the step `,_jsx(_components.em,{children:`«Carga tu catálogo para que dé precios\nexactos»`}),` (`,_jsx(_components.em,{children:`Load your catalog so it gives exact prices`}),`). As long as you have no\nproducts at all, its `,_jsx(_components.strong,{children:`Añadir producto`}),` (`,_jsx(_components.em,{children:`Add product`}),`) button takes you to\nthe Catalog with the new-product form already open.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-catalog-is-for`,children:`What the catalog is for`}),`\n`,_jsxs(_components.p,{children:[`The screen itself sums it up under the title: `,_jsx(_components.em,{children:`«El precio sale de aquí»`}),` (`,_jsx(_components.em,{children:`The\nprice comes from here`}),`). (If you have more than one funnel, that sentence starts\nby saying which funnel you are looking at: `,_jsx(_components.em,{children:`«Lo que vende «…», más los productos\nsin embudo asignado»`}),`, `,_jsx(_components.em,{children:`What «…» sells, plus the products with no funnel\nassigned`}),`. The list is trimmed to that funnel.)`]}),`\n`,_jsxs(_components.p,{children:[`That is literal: the agent carries a written instruction to check the catalog\nevery time the customer asks about a product or its price, and not to make\nprices up. The practical consequence is simple: `,_jsx(_components.strong,{children:`if a product is not in the\ncatalog, your agent has nowhere to get its exact price from.`})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Loading it is all you have to do.`}),` There is no need to link the product to\nthe sales playbook, to name it in any chapter, or to switch anything else on. As\nsoon as you save it, the agent can already find it and offer it. Two honest\ncaveats: what you change can take `,_jsx(_components.strong,{children:`up to a minute`}),` to reach the agent, and if\nyou tick specific funnels on the product, the others stop seeing it (see\n`,_jsx(_components.a,{href:`#visible-and-active-are-not-the-same`,children:`Visible and Active`}),`).`]})}),`\n`,_jsx(Heading,{level:`2`,id:`the-words-on-this-screen`,children:`The words on this screen`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Word`}),_jsx(_components.th,{children:`What it means, in plain language`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Producto`}),` (`,_jsx(_components.em,{children:`Product`}),`)`]}),_jsx(_components.td,{children:`The complete record: name, description, photos and price.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Variante`}),` (`,_jsx(_components.em,{children:`Variant`}),`)`]}),_jsxs(_components.td,{children:[`Each sellable version of that product: the black size M, the 500 ml bottle. Each one has `,_jsx(_components.strong,{children:`its own price and its own code`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`SKU`})}),_jsxs(_components.td,{children:[`The code you use to identify a variant (`,_jsx(_components.code,{children:`POLO-NEGR-M`}),`). It is optional; it is there for searching.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Tipo`}),` (`,_jsx(_components.em,{children:`Type`}),`)`]}),_jsxs(_components.td,{children:[`Whether what you sell is a `,_jsx(_components.strong,{children:`Producto físico`}),` (`,_jsx(_components.em,{children:`Physical product`}),`), a `,_jsx(_components.strong,{children:`Servicio`}),` (`,_jsx(_components.em,{children:`Service`}),`) or an `,_jsx(_components.strong,{children:`Infoproducto`}),` (`,_jsx(_components.em,{children:`Info product`}),`). It is chosen first and it changes the rest of the form.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Activo`}),` (`,_jsx(_components.em,{children:`Active`}),`)`]}),_jsx(_components.td,{children:`Whether the agent can find it when it searches.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Visible en el catálogo`}),` (`,_jsx(_components.em,{children:`Visible in the catalog`}),`)`]}),_jsxs(_components.td,{children:[`Whether it appears in the catalog WhatsApp shows inside your business profile. `,_jsx(_components.strong,{children:`It is not the same as Activo.`})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`your-first-product-click-by-click`,children:`Your first product, click by click`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Click «Añadir producto» (Add product)`,children:[_jsxs(_components.p,{children:[`It is at the top right, next to another button called `,_jsx(_components.strong,{children:`Plantilla CSV`}),`\n(`,_jsx(_components.em,{children:`CSV template`}),`). With the catalog empty you also have the same button in\nthe middle of the screen, under `,_jsx(_components.em,{children:`«Aún no hay productos»`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No new page opens.`}),` A panel slides in from the right-hand side, top to\nbottom, over the dimmed background. It is titled `,_jsx(_components.strong,{children:`Nuevo producto`}),` (`,_jsx(_components.em,{children:`New\nproduct`}),`) — and `,_jsx(_components.strong,{children:`Editar producto`}),` (`,_jsx(_components.em,{children:`Edit product`}),`) when you open one that\nalready exists. Do not look for a “back” button: there is none. It closes\nwith `,_jsx(_components.strong,{children:`Cerrar`}),` (`,_jsx(_components.em,{children:`Close`}),`, at the top), with `,_jsx(_components.strong,{children:`Cancelar`}),` (`,_jsx(_components.em,{children:`Cancel`}),`, at the\nbottom) or with the `,_jsx(_components.strong,{children:`Esc`}),` key.`]})]}),_jsxs(Step,{title:`Choose what you are going to sell`,children:[_jsxs(_components.p,{children:[`The first and only thing you will see is the heading `,_jsx(_components.strong,{children:`«¿Qué vas a\nvender?»`}),` (`,_jsx(_components.em,{children:`What are you going to sell?`}),`) with three cards: `,_jsx(_components.strong,{children:`Producto\nfísico`}),` (`,_jsx(_components.em,{children:`Physical product`}),`), `,_jsx(_components.strong,{children:`Servicio`}),` (`,_jsx(_components.em,{children:`Service`}),`) and `,_jsx(_components.strong,{children:`Infoproducto`}),`\n(`,_jsx(_components.em,{children:`Info product`}),`). Until you choose one, the rest of the form does not exist\nand the `,_jsx(_components.strong,{children:`Guardar`}),` (`,_jsx(_components.em,{children:`Save`}),`) button is greyed out: it will not let you click\nit.`]}),_jsxs(_components.p,{children:[`For the Moda Sol T-shirt: `,_jsx(_components.strong,{children:`Producto físico`}),`.`]}),_jsx(Frame,{caption:`The panel starts by asking what you sell. Each card tells you what the agent will do if you choose it.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=b9917db6a214a965428cc2f16a757d7f`,alt:`«Nuevo producto» panel at the «¿Qué vas a vender?» step, with the Producto físico, Servicio and Infoproducto cards`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/catalogo/02-nuevo-producto-tipo.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=88b1b2029222ef5e1f4d97a514aaeb4a 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=a2682ca732220fbae96fb09147c24aa8 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=37533eff6fab6f6be554b66fe0392960 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=fa321a4039d6d1b392dd499828515d9f 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=390544e78bcf431ed51bc5e63179b468 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/02-nuevo-producto-tipo.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=73b71537d6564f7c2c5e42ab623f3ace 2500w`})})]}),_jsxs(Step,{title:`Give it a name and describe how it is sold`,children:[_jsxs(_components.p,{children:[`Once the type is chosen, the whole form unfolds. In `,_jsx(_components.strong,{children:`Título y\ndescripción`}),` (`,_jsx(_components.em,{children:`Title and description`}),`) there is only one field with an\nasterisk: `,_jsx(_components.strong,{children:`Nombre *`}),` (`,_jsx(_components.em,{children:`Name`}),`). Type `,_jsx(_components.code,{children:`Polo oversize de algodón pima`}),`.`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Descripción`}),` (`,_jsx(_components.em,{children:`Description`}),`) is optional, but it is not decorative:\nthe field says so — `,_jsx(_components.em,{children:`«Detalles que el agente puede usar al vender.»`}),`\n(`,_jsx(_components.em,{children:`Details the agent can use when selling.`}),`) — and it is text the agent\nreads when it finds the product. It reaches the agent `,_jsx(_components.strong,{children:`trimmed to around\n240 characters`}),`, so put what sells in the first lines: `,_jsx(_components.em,{children:`“Peruvian pima\ncotton, unisex oversize cut. Machine washable. Shipping anywhere in Peru.”`})]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The name is what the customer has to be able to say.`}),` The agent searches\nby the product name and by the name or the code of its variants — `,_jsx(_components.strong,{children:`it does\nnot search inside the description`}),`. Putting “polo”, “camiseta” and\n“remera” (the words for a T-shirt in different countries) only in the\ndescription does not help it find the product: put them in the name.`]})})]}),_jsxs(Step,{title:`Upload the photos`,children:[_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Medios`}),` (`,_jsx(_components.em,{children:`Media`}),`), drag the images in or click where it says\n`,_jsx(_components.strong,{children:`«Arrastra o haz clic para subir»`}),` (`,_jsx(_components.em,{children:`Drag or click to upload`}),`).\nUnderneath it reads `,_jsx(_components.em,{children:`«PNG, JPG o WEBP. La primera imagen es la principal.»`}),`\n(`,_jsx(_components.em,{children:`PNG, JPG or WEBP. The first image is the main one.`}),`) — that is a\n`,_jsx(_components.strong,{children:`recommendation`}),`, not a filter: the dashboard accepts any image file.`]}),_jsxs(_components.p,{children:[`The first photo carries the `,_jsx(_components.strong,{children:`Principal`}),` (`,_jsx(_components.em,{children:`Main`}),`) label. Any of them, the\nmain one included, is removed with the `,_jsx(_components.strong,{children:`×`}),`. `,_jsx(_components.strong,{children:`They cannot be reordered by\ndragging`}),`: to change the main one you have to remove the ones in front of\nit.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Photos do not wait for the Guardar button.`}),` They are uploaded on the\nspot, and removing one deletes it from storage at that same moment. If you\nupload a photo and then cancel the product, the photo has already been\nuploaded. If you remove a photo from a product that already existed and\nthen cancel, the photo really has already been deleted, but the product’s\nrecord still names it: it will be left as a broken photo. Open the product,\nremove that photo and save.`]})})]}),_jsxs(Step,{title:`Set the price`,children:[_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Precios`}),` (`,_jsx(_components.em,{children:`Prices`}),`) there are two fields: `,_jsx(_components.strong,{children:`Precio *`}),` (`,_jsx(_components.em,{children:`Price`}),`) and\n`,_jsx(_components.strong,{children:`Moneda`}),` (`,_jsx(_components.em,{children:`Currency`}),`). The currency has `,_jsx(_components.strong,{children:`only two options — «PEN (S/)»\nand «USD ($)» — and comes set to PEN`}),`. From this screen there are no other\ncurrencies.`]}),_jsxs(_components.p,{children:[`For the T-shirt: `,_jsx(_components.code,{children:`79`}),` and `,_jsx(_components.code,{children:`PEN (S/)`}),`. If you have cents, type them with a\npoint, not a comma: `,_jsx(_components.code,{children:`79.90`}),`. If you leave the price empty or type something\nthat is not a number, on saving you get `,_jsx(_components.em,{children:`«Pon un precio válido.»`}),` (`,_jsx(_components.em,{children:`Enter a\nvalid price.`}),`)`]}),_jsxs(_components.p,{children:[`Below it you will see the `,_jsx(_components.strong,{children:`Precios por cantidad`}),` (`,_jsx(_components.em,{children:`Quantity pricing`}),`)\nswitch. Leave it off for now: we cover it in\n`,_jsx(_components.a,{href:`#quantity-pricing-wholesale`,children:`its own section`}),`.`]}),_jsx(Frame,{caption:`The form for a physical product, from the top down to Precios: Tipo, Título y descripción with the polo shirt, Medios, and Precios with 79 in PEN (S/) and «Precios por cantidad» off.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=72dfd1e5e49d433f1425c2584e5afdf1`,alt:`Nuevo producto panel with the Producto físico type, the name Polo oversize de algodón pima and its description, the Medios area, the price 79 in PEN (S/) and the Precios por cantidad switch off`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/catalogo/03-formulario-fisico.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=e0a13ba364895fecf31329973f21f008 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=f996b3236302f7407a7ba4b5999774dd 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=83058071d414e4cf4d74fed09e3543fa 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=7fbf40be8167bda25827c373ca77f7fa 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=e5a1e60a525e7cd4180a971695723dcf 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/03-formulario-fisico.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=296976fd34cbd616d8e2d797fc9470aa 2500w`})})]}),_jsxs(Step,{title:`Decide whether you keep count of stock`,children:[_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Inventario`}),` (`,_jsx(_components.em,{children:`Inventory`}),`) there is a `,_jsx(_components.strong,{children:`Controlar stock`}),` (`,_jsx(_components.em,{children:`Track\nstock`}),`) switch and a `,_jsx(_components.strong,{children:`SKU`}),` field (with the example `,_jsx(_components.code,{children:`XL-25`}),`). Turn it on\nonly if you really want the agent to stop offering what has run out — it\nexplains it right there: `,_jsx(_components.em,{children:`«El agente avisa cuando algo se agota y no ofrece\nlo que no tienes.»`}),` (`,_jsx(_components.em,{children:`The agent warns when something runs out and does not\noffer what you do not have.`}),`)`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Quantities are not typed here.`}),` When you turn on `,_jsx(_components.strong,{children:`Controlar stock`}),`,\n`,_jsx(_components.strong,{children:`Cantidad disponible`}),` (`,_jsx(_components.em,{children:`Available quantity`}),`) appears, but it is\n`,_jsx(_components.strong,{children:`read-only`}),`: it will not let you type. Underneath, the panel itself says\nso — `,_jsx(_components.em,{children:`«Lo lleva Inventario. Para moverlo, registra un movimiento en\nInventario»`}),` (`,_jsx(_components.em,{children:`Inventario handles it. To change it, record a movement in\nInventario`}),`) — with a link to that screen. It is the most common confusion\nin this form. See `,_jsx(_components.a,{href:`#stock-when-to-turn-it-on`,children:`Stock: when to turn it on`}),`.`]})})]}),_jsxs(Step,{title:`Add sizes and colors, if you have them`,children:[_jsxs(_components.p,{children:[`On a physical product the block is called `,_jsx(_components.strong,{children:`Variantes`}),` (`,_jsx(_components.em,{children:`Variants`}),`) and\ncomes with the `,_jsx(_components.strong,{children:`Generar variantes por opciones`}),` (`,_jsx(_components.em,{children:`Generate variants from\noptions`}),`) button: you give it the axes (Color: Negro, Blanco, Arena /\nTalla: S, M, L, XL) and it creates the combinations in one click, each with\nits own code. It takes up to `,_jsx(_components.strong,{children:`3 axes`}),` and `,_jsx(_components.strong,{children:`100 combinations`}),`.`]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`#variants-sizes-and-colors`,children:`Variants`}),` section tells the whole story.`]})]}),_jsxs(Step,{title:`Save — and check that it shows up in the table`,children:[_jsxs(_components.p,{children:[`The last block is `,_jsx(_components.strong,{children:`Disponibilidad`}),` (`,_jsx(_components.em,{children:`Availability`}),`), with `,_jsx(_components.strong,{children:`Visible en el\ncatálogo`}),` and `,_jsx(_components.strong,{children:`Activo`}),` switched on. Leave them like that and click\n`,_jsx(_components.strong,{children:`Guardar`}),`.`]}),_jsxs(_components.p,{children:[`The product appears at the very top of the table, with its columns:\n`,_jsx(_components.em,{children:`producto, sku, precio, inventario, embudos, visible, origen`}),` (`,_jsx(_components.em,{children:`product,\nSKU, price, inventory, funnels, visible, source`}),`) and a last one with the\nactions.`]}),_jsx(Frame,{caption:`The table with three products: each row with its SKU, its price, its inventory («Sin control»), the funnels that sell it («Todos»), the «visible» switch on and the Editar button.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=59c5244b4dfcc0b53c267503bb1045b1`,alt:`Catalog table with three products, Polo cuello V de algodón pima, Pack 3 polos básicos pima and Polo oversize de algodón pima, with inventario Sin control, embudos Todos, visible on and origen Propio`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/catalogo/05-tabla-con-producto.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=327252470b5c8ff658f2d64cd0a21cf1 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=18e540fcad3c4e67709e6cde5065e49d 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=860ded14ce1d914aa6781fb0d5bb415b 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=c754f52a5dfa72479cf0b405bed36c86 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=a664767f2ae62970395d0a603b076be0 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/05-tabla-con-producto.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=be110ae33fced9706f3a8c36e544657c 2500w`})}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Closing the panel throws away everything you typed, with no warning.`}),` It\nmakes no difference whether you click `,_jsx(_components.strong,{children:`Cerrar`}),` at the top, `,_jsx(_components.strong,{children:`Cancelar`}),`\nat the bottom, press the `,_jsx(_components.strong,{children:`Esc`}),` key or click outside the panel, on the\ndark area: there is no confirmation and no saved draft. The only thing that\nkeeps your work is `,_jsx(_components.strong,{children:`Guardar`}),`.`]})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-read-the-table`,children:`How to read the table`}),`\n`,_jsx(_components.p,{children:`Each cell in the table tells you something about the product. These are the\nones that raise the most questions:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What you see`}),_jsx(_components.th,{children:`Where`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Desde …»`}),` (`,_jsx(_components.em,{children:`From …`}),`) before the price`]}),_jsx(_components.td,{children:`precio`}),_jsx(_components.td,{children:`The product has variants and that is the price of the cheapest one.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«· 3 tramos»`}),` (`,_jsx(_components.em,{children:`· 3 tiers`}),`) after the price`]}),_jsx(_components.td,{children:`precio`}),_jsxs(_components.td,{children:[`It has `,_jsx(_components.a,{href:`#quantity-pricing-wholesale`,children:`quantity pricing`}),`. The price you see is the 1-unit price.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«PROMO»`}),` before the price`]}),_jsx(_components.td,{children:`precio`}),_jsx(_components.td,{children:`There is a promotion in force, and that is its 1-unit price.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«12 variantes»`}),` (`,_jsx(_components.em,{children:`12 variants`}),`) under the name`]}),_jsx(_components.td,{children:`producto`}),_jsxs(_components.td,{children:[`How many versions it has. On a service it says `,_jsx(_components.strong,{children:`«Servicio · 3 modalidades»`}),` (`,_jsx(_components.em,{children:`Service · 3 options`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Infoproducto · ⚠️ sin entrega»`}),` (`,_jsx(_components.em,{children:`Info product · ⚠️ no delivery`}),`)`]}),_jsx(_components.td,{children:`producto`}),_jsxs(_components.td,{children:[`It is an info product with no delivery file or link. See `,_jsx(_components.a,{href:`#if-you-sell-a-course-or-an-ebook-automatic-delivery`,children:`Automatic delivery`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`A number, `,_jsx(_components.strong,{children:`«Agotado»`}),` (`,_jsx(_components.em,{children:`Out of stock`}),`) or `,_jsx(_components.strong,{children:`«Sin control»`}),` (`,_jsx(_components.em,{children:`Not tracked`}),`)`]}),_jsx(_components.td,{children:`inventario`}),_jsxs(_components.td,{children:[`Explained in `,_jsx(_components.a,{href:`#stock-when-to-turn-it-on`,children:`Stock: when to turn it on`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Todos»`}),` (`,_jsx(_components.em,{children:`All`}),`)`]}),_jsx(_components.td,{children:`embudos`}),_jsx(_components.td,{children:`You did not tick any funnels: all your funnels sell it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Funnel names`}),_jsx(_components.td,{children:`embudos`}),_jsx(_components.td,{children:`Only those funnels sell it.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Embudo eliminado»`}),` (`,_jsx(_components.em,{children:`Funnel deleted`}),`)`]}),_jsx(_components.td,{children:`embudos`}),_jsx(_components.td,{children:`It was ticked for a funnel that is no longer in your list. Open it and tick the funnels that should sell it.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The dimmed rows, with lighter text, are products with `,_jsx(_components.strong,{children:`Activo`}),` switched off.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-three-types-and-how-they-really-differ`,children:`The three types, and how they really differ`}),`\n`,_jsxs(_components.p,{children:[`The type is not a label: `,_jsx(_components.strong,{children:`it changes which fields you see and what the agent\ndoes afterwards`}),`. Each card tells you so when you choose it.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`What the card says`}),_jsx(_components.th,{children:`What changes in the form`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Producto físico`}),` (`,_jsx(_components.em,{children:`Physical product`}),`)`]}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`«El agente cotiza el envío y genera la guía.»`}),` (`,_jsx(_components.em,{children:`The agent quotes shipping and generates the waybill.`}),`)`]}),_jsxs(_components.td,{children:[`A `,_jsx(_components.strong,{children:`Variantes`}),` (`,_jsx(_components.em,{children:`Variants`}),`) block, with the size and color generator.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Servicio`}),` (`,_jsx(_components.em,{children:`Service`}),`)`]}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`«El agente lo vende y coordina por chat. No genera envío.»`}),` (`,_jsx(_components.em,{children:`The agent sells it and arranges it over chat. It does not generate a shipment.`}),`)`]}),_jsxs(_components.td,{children:[`The block is called `,_jsx(_components.strong,{children:`Modalidades`}),` (`,_jsx(_components.em,{children:`Options`}),`): it asks for the name and price of each option.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Infoproducto`}),` (`,_jsx(_components.em,{children:`Info product`}),`)`]}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`«Su envío es digital: se entrega solo, apenas se confirma el pago.»`}),` (`,_jsx(_components.em,{children:`Its delivery is digital: it is delivered on its own as soon as payment is confirmed.`}),`)`]}),_jsxs(_components.td,{children:[`It has `,_jsx(_components.strong,{children:`no`}),` variants block. Instead, `,_jsx(_components.strong,{children:`Entrega automática`}),` (`,_jsx(_components.em,{children:`Automatic delivery`}),`) appears.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The stock-tracking notice changes too: on a physical product it talks about\nstock on hand, on a service about `,_jsx(_components.strong,{children:`cupos disponibles`}),` (`,_jsx(_components.em,{children:`available slots`}),`)\n(`,_jsx(_components.em,{children:`«El agente no ofrece lo que se agotó.»`}),`, `,_jsx(_components.em,{children:`The agent does not offer what has\nrun out.`}),`) and on an info product about `,_jsx(_components.strong,{children:`limited licenses or accesses`}),`. So\n“stock” here is not just boxes in a warehouse.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Does your service need a date and time?`}),` When you choose `,_jsx(_components.strong,{children:`Servicio`}),`, the\npanel warns you: `,_jsx(_components.em,{children:`«¿Necesita fecha y hora (citas)? Eso se programa en\nCalendario; aquí solo se vende y cotiza.»`}),` (`,_jsx(_components.em,{children:`Does it need a date and time\n(appointments)? That is scheduled in Calendario; here it is only sold and\nquoted.`}),`) The catalog sets the price; the schedule lives in the `,_jsx(_components.strong,{children:`Calendario`}),`\n(`,_jsx(_components.em,{children:`Calendar`}),`) app.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Changing the type of a product that already exists does not delete anything\nstraight away.`}),` The panel itself says: `,_jsx(_components.em,{children:`«Cambiar el tipo oculta lo que ya no\naplica. Nada se borra hasta que guardes.»`}),` (`,_jsx(_components.em,{children:`Changing the type hides what no\nlonger applies. Nothing is deleted until you save.`}),`) If the change is going to\nremove data — turning a product that has several variants into an info product,\nor turning an info product that had automatic delivery into another type — saving\nasks you for a two-step confirmation with the `,_jsx(_components.strong,{children:`Convertir y guardar`}),` (`,_jsx(_components.em,{children:`Convert\nand save`}),`) button.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`if-you-sell-a-course-or-an-ebook-automatic-delivery`,children:`If you sell a course or an ebook: automatic delivery`}),`\n`,_jsxs(_components.p,{children:[`On an info product a block appears that is not in the other two, and it\nexplains on its own what it is for: `,_jsx(_components.em,{children:`«Cuando el pago se confirma (voucher\naprobado), el agente le manda esto al cliente sin que tú hagas nada.»`}),` (`,_jsx(_components.em,{children:`When\npayment is confirmed (voucher approved), the agent sends this to the customer\nwithout you doing anything.`}),`) You have two options:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A file from the Librería`}),` (`,_jsx(_components.em,{children:`Library`}),`) — only the files already marked as\nsendable for the funnel you have open are offered. If there are none, the\npanel tells you: `,_jsx(_components.em,{children:`«Sube un archivo a la Librería y márcalo como enviable para\npoder entregarlo aquí.»`}),` (`,_jsx(_components.em,{children:`Upload a file to the Library and mark it as\nsendable to be able to deliver it here.`}),`) They are prepared in\n`,_jsx(_components.a,{href:`/en/guides/library`,children:`The file Library`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A link`}),` — it has to start with `,_jsx(_components.code,{children:`http://`}),` or `,_jsx(_components.code,{children:`https://`}),`. If not, on saving\nyou get `,_jsx(_components.em,{children:`«El enlace debe empezar con http:// o https://»`}),` (`,_jsx(_components.em,{children:`The link must\nstart with http:// or https://`}),`).`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If you save with neither of the two, the product `,_jsx(_components.strong,{children:`is saved anyway`}),`, but the\npanel warns you: `,_jsx(_components.em,{children:`«Ojo: sin archivo ni enlace, el agente no podrá entregarlo\nsolo.»`}),` (`,_jsx(_components.em,{children:`Careful: with no file and no link, the agent will not be able to\ndeliver it on its own.`}),`) And in the list, that product is marked under its name\nas `,_jsx(_components.strong,{children:`«Infoproducto · ⚠️ sin entrega»`}),`. It is worth fixing: otherwise the agent\ncan charge for something it then does not know how to deliver.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-form-block-by-block`,children:`The form, block by block`}),`\n`,_jsxs(_components.p,{children:[`Once the type is chosen, the panel shows `,_jsx(_components.strong,{children:`seven blocks`}),`. Six are the same for\nall three types; the seventh depends on the type and sits between\n`,_jsx(_components.strong,{children:`Inventario`}),` and `,_jsx(_components.strong,{children:`Disponibilidad`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Order`}),_jsx(_components.th,{children:`Block`}),_jsx(_components.th,{children:`What it is for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Tipo`}),` (`,_jsx(_components.em,{children:`Type`}),`)`]}),_jsx(_components.td,{children:`What you sell. It is chosen first and it conditions the rest.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Título y descripción`}),` (`,_jsx(_components.em,{children:`Title and description`}),`)`]}),_jsx(_components.td,{children:`The name (required) and the text the agent uses when selling.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`3`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Medios`}),` (`,_jsx(_components.em,{children:`Media`}),`)`]}),_jsx(_components.td,{children:`The photos.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`4`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Precios`}),` (`,_jsx(_components.em,{children:`Prices`}),`)`]}),_jsx(_components.td,{children:`Price, currency and the quantity scale.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`5`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Inventario`}),` (`,_jsx(_components.em,{children:`Inventory`}),`)`]}),_jsx(_components.td,{children:`The stock-tracking switch and the SKU.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`6`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Variantes`}),` / `,_jsx(_components.strong,{children:`Modalidades`}),` / `,_jsx(_components.strong,{children:`Entrega automática`})]}),_jsx(_components.td,{children:`Depending on the type. The info product has no variants.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`7`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Disponibilidad`}),` (`,_jsx(_components.em,{children:`Availability`}),`)`]}),_jsx(_components.td,{children:`Visible, Activo and — if you have more than one funnel — which funnels sell it.`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`what-is-really-required`,children:`What is really required`}),`\n`,_jsxs(_components.p,{children:[`Not much. `,_jsx(_components.strong,{children:`Three things`}),`, in this order:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The type.`}),` Without it no other field is shown.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Nombre *`}),`. If it is missing: `,_jsx(_components.em,{children:`«El nombre es obligatorio.»`}),` (`,_jsx(_components.em,{children:`The name\nis required.`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Precio *`}),`. If it is empty or not a number: `,_jsx(_components.em,{children:`«Pon un precio válido.»`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Everything else — description, photos, SKU, variants, stock, funnels — is\noptional and can be filled in later.`}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`With «Precios por cantidad» on, the required price moves.`}),` The field at the\ntop is locked and the one you have to fill in becomes the `,_jsx(_components.strong,{children:`1 unit`}),` row of the\nscale. The warning changes too: it will ask you for the 1-unit price, not\n`,_jsx(_components.em,{children:`«Pon un precio válido»`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`With variants, the price is asked for on each one`}),`, not at the top. See\n`,_jsx(_components.a,{href:`#variants-sizes-and-colors`,children:`Variants`}),`.`]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Do not leave products with a price of 0.`}),` They are saved without complaint,\nbut the agent would see a price of 0 and, on top of that, `,_jsx(_components.strong,{children:`they do not appear\nin the product dropdown`}),` when you record a sale or an order by hand: that\ndropdown only brings in active products whose variants cost more than 0. Watch\nout for variants generated without a base price: they are born at 0.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`quantity-pricing-wholesale`,children:`Quantity pricing (wholesale)`}),`\n`,_jsxs(_components.p,{children:[`It is the most powerful feature on this screen and the least obvious. Turn on\n`,_jsx(_components.strong,{children:`Precios por cantidad`}),` and you declare the `,_jsx(_components.strong,{children:`exact total price for each\nquantity`}),`, not a percentage discount:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Quantity`}),_jsx(_components.th,{children:`Total price`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`S/ 79`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`S/ 149`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`3`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`S/ 209`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Rows are added with `,_jsx(_components.strong,{children:`+ Añadir tramo`}),` (`,_jsx(_components.em,{children:`+ Add tier`}),`). And with `,_jsx(_components.strong,{children:`+ De N a más\n(precio por unidad)`}),` (`,_jsx(_components.em,{children:`+ From N up (price per unit)`}),`) you define the open tier:\n`,_jsx(_components.em,{children:`from 6 up, S/ 65 each`}),`. Each tier has to cost more than the previous one: if\nthe 3-unit tier costs less than the 2-unit one, the panel will not let you save\nand tells you which one to fix.`]}),`\n`,_jsx(Frame,{caption:`Quantity pricing switched on: the total price for each quantity (1 → 79 and 3 → 199 PEN) and, underneath, the promotion (1 → 69 PEN) with its end date.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=ecd620029bda92fb8b1ea466232b468e`,alt:`Precios block with the Precios por cantidad switch on, the tiers 1 → 79 and 3 → 199 PEN, and the promotion 1 → 69 PEN with Vigente hasta set to 31/10/2026`,\"data-og-width\":`1120`,width:`1120`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`images/catalogo/07-precios-por-cantidad.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=48a79b6398ea826a514e7288b429efbc 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=f4aab0ba41a149e6769b5d28bd8e0a24 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=2feec26a6401fbd75d966173666e289b 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=170165ba8fecda156866d922f7b18133 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=36566008f171b744fb3ff14e77f35780 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/07-precios-por-cantidad.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=15bd07808c2d04c1089eff6c0e6f72f9 2500w`})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The moment you turn it on, the «Precio» field at the top is locked`}),` and it is\nrenamed `,_jsx(_components.strong,{children:`Precio (1 unidad, de la escala)`}),` (`,_jsx(_components.em,{children:`Price (1 unit, from the scale)`}),`).\nIt is not a fault: the price is now typed into the 1-unit row of the table.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`For quantities that are not on your scale, the agent combines tiers and adds\nthem up.`}),` If the customer asks for 10 T-shirts and your scale goes up to 3, it\ncharges 3 + 3 + 3 + 1. If you prefer a clean per-unit price from a certain\nquantity onwards, define the open `,_jsx(_components.strong,{children:`De N a más`}),` tier. The agent does not do the\narithmetic: when it looks up the product with the quantity the customer asked\nfor, it receives the total already calculated.`]}),`\n`,_jsxs(_components.p,{children:[`There is also `,_jsx(_components.strong,{children:`Promoción con fecha de fin`}),` (`,_jsx(_components.em,{children:`Promotion with an end date`}),`): a\nseparate scale, with its own tiers and the `,_jsx(_components.strong,{children:`Vigente hasta`}),` (`,_jsx(_components.em,{children:`Valid until`}),`)\nfield. While it is in force, the promotion overrides the list scale in the\nconversation.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The scale belongs to the whole product.`}),` If you turn it on for a product with\nsizes, the agent quotes with the scale and stops looking at each size’s price.\nIf your sizes cost different amounts, do not use the scale on that product, or\nsplit it into separate products.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The promotion does not travel to the WhatsApp catalog.`}),` In the catalog\nWhatsApp shows on your business profile, the 1-unit `,_jsx(_components.strong,{children:`list`}),` price is\npublished, not the promotional one. It is on purpose: if the promo were\npublished, it would stay stuck there once it expired. In the chat, the\npromotion does apply.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`In the CSV file, leaving the scale cell blank does not delete it`}),`: it leaves\nit as it was. To remove it, turn off `,_jsx(_components.strong,{children:`Precios por cantidad`}),` on the product and\nsave.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`variants-sizes-and-colors`,children:`Variants: sizes and colors`}),`\n`,_jsxs(_components.p,{children:[`Moda Sol sells the same T-shirt in 3 colors and 4 sizes. That is `,_jsx(_components.strong,{children:`12\nvariants`}),`, and there is no need to type them one by one.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Type the base price first`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Precio`}),`, at the top. New combinations are born with that price; if\nthe field is empty, they are born at 0.`]})}),_jsx(Step,{title:`Click «Generar variantes por opciones»`,children:_jsxs(_components.p,{children:[`It is in the `,_jsx(_components.strong,{children:`Variantes`}),` block. Two axes open, already named `,_jsx(_components.strong,{children:`Color`}),`\nand `,_jsx(_components.strong,{children:`Talla`}),` (`,_jsx(_components.em,{children:`Size`}),`).`]})}),_jsx(Step,{title:`Type the values for each axis`,children:_jsxs(_components.p,{children:[`Separated by commas. `,_jsx(_components.em,{children:`Color`}),`: Negro, Blanco, Arena (black, white, sand).\n`,_jsx(_components.em,{children:`Talla`}),`: S, M, L, XL. With `,_jsx(_components.strong,{children:`+ Añadir eje`}),` (`,_jsx(_components.em,{children:`+ Add axis`}),`) you can go up to\n`,_jsx(_components.strong,{children:`3 axes`}),` (color, size and, for example, sleeve). Underneath, the panel\nkeeps telling you how many will come out: `,_jsx(_components.em,{children:`«Se generarán 12 variantes.»`}),`\n(`,_jsx(_components.em,{children:`12 variants will be generated.`}),`)`]})}),_jsx(Step,{title:`Click «Generar» (Generate)`,children:_jsxs(_components.p,{children:[`The 12 combinations come out in one click, with titles like «Negro / M».\nThe `,_jsx(_components.strong,{children:`SKU automático`}),` (`,_jsx(_components.em,{children:`Automatic SKU`}),`) checkbox comes ticked: each one is\nborn with its code (`,_jsx(_components.code,{children:`POLO-NEGR-M`}),`, for example). The generator goes up to\n`,_jsx(_components.strong,{children:`100 combinations`}),` at once.`]})}),_jsx(Step,{title:`Adjust the prices that fall outside the norm`,children:_jsxs(_components.p,{children:[`Each row carries its own price. If the XL costs S/ 10 more, change it on its\nrow. And if you want to change the price of all of them at once, use the\n`,_jsx(_components.strong,{children:`Mismo precio para las 12 variantes`}),` (`,_jsx(_components.em,{children:`Same price for the 12 variants`}),`)\nrow and click `,_jsx(_components.strong,{children:`Aplicar a todas`}),` (`,_jsx(_components.em,{children:`Apply to all`}),`). Then click `,_jsx(_components.strong,{children:`Guardar`}),`:\nuntil then nothing is saved.`]})})]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`With variants, the price at the top is no longer typed.`}),` The field is\nrenamed `,_jsx(_components.strong,{children:`Desde (el más barato)`}),` (`,_jsx(_components.em,{children:`From (the cheapest)`}),`), it is locked and it\nshows the price of the cheapest variant. Underneath it explains: `,_jsx(_components.em,{children:`«Lo lleva\ncada variante. Para cambiarlo, edítalo abajo en Variantes.»`}),` (`,_jsx(_components.em,{children:`Each variant\ncarries it. To change it, edit it below in Variantes.`}),`) The `,_jsx(_components.strong,{children:`SKU`}),` at the top\ngets the same treatment.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The currency is changed at the top`}),`, and it applies to all the variants. But\nit does not convert anything; the panel warns you: `,_jsx(_components.em,{children:`«La moneda se aplica a las\n12 variantes. Los precios no se convierten: 79 sigue siendo 79, solo cambia la\nmoneda.»`}),` (`,_jsx(_components.em,{children:`The currency applies to the 12 variants. Prices are not converted:\n79 is still 79, only the currency changes.`}),`) If you switch from PEN to USD,\ncorrect the prices.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`If you generate again on a product that already had variants`}),`, the ones that\nfit the new combination are kept with their price, and those that do not fit are\nleft at the end of the list with a warning, so that you remove them yourself if\nthey are not needed. This also happens to the single variant of a product you\ncreated without sizes.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`On a service they are called «Modalidades» and they are the same thing`}),` under\nanother name: `,_jsx(_components.em,{children:`Express consultation`}),`, `,_jsx(_components.em,{children:`Full consultation`}),`, `,_jsx(_components.em,{children:`Package of 4\nsessions`}),`. They are added with `,_jsx(_components.strong,{children:`Agregar modalidad`}),` (`,_jsx(_components.em,{children:`Add option`}),`) and ask for\na name and a price. The `,_jsx(_components.strong,{children:`Cupos`}),` (`,_jsx(_components.em,{children:`Slots`}),`) are shown but not typed — same as\nstock, Inventario handles them. An info product does not have this block: a\nsingle presentation.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`stock-when-to-turn-it-on`,children:`Stock: when to turn it on`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Turn on «Controlar stock» only if you are going to record the movements.`}),` If\nyou turn it on and never load any stock, the agent will believe you have none\nleft.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsxs(_components.th,{children:[`What you see in the `,_jsx(_components.strong,{children:`inventario`}),` column`]}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`A number`}),_jsx(_components.td,{children:`You are tracking and you have that many units left.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Agotado`}),` (`,_jsx(_components.em,{children:`Out of stock`}),`)`]}),_jsx(_components.td,{children:`You are tracking and you are at 0 (or below): it reaches the agent marked as out of stock, with the instruction not to promise it.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Sin control`}),` (`,_jsx(_components.em,{children:`Not tracked`}),`)`]}),_jsxs(_components.td,{children:[`You are not keeping count: the agent can offer it without looking at stock. Careful: it also shows like this if you turned on `,_jsx(_components.strong,{children:`Controlar stock`}),` and have not yet recorded any movement in Inventario. In that case the agent treats it as `,_jsx(_components.strong,{children:`out of stock`}),`: do the initial load.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.strong,{children:`Controlar stock`}),` off (the table reads `,_jsx(_components.strong,{children:`Sin control`}),`) there is nothing\nthat can run out: it is the right option for a service you can provide with no\ncap on slots, or for a product you make to order.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Quantities are loaded in another app: Inventario.`}),` From the catalog you only\ndeclare `,_jsx(_components.strong,{children:`whether`}),` the product is tracked. The first load is done in\nInventario with `,_jsx(_components.strong,{children:`Registrar movimiento`}),` (`,_jsx(_components.em,{children:`Record movement`}),`) → `,_jsx(_components.strong,{children:`Carga inicial\n(+)`}),` (`,_jsx(_components.em,{children:`Initial load (+)`}),`); after that, every purchase, return or adjustment is\nalso recorded there.`]}),`\n`,_jsx(Frame,{caption:`The Inventario screen, still empty («El catálogo está vacío»): this is where quantities are loaded and moved, with «Registrar movimiento».`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=605d82244792e9c15a78b384ff8338ae`,alt:`Inventario screen with the four counters at 0, the Stock and Movimientos tabs, the Registrar movimiento button and the «El catálogo está vacío» notice`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/apps/02-inventario.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=74689f2820396a4d141c1235d8f6976e 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=9deba7c1ccb054b2dc6fd826d0b32fd4 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=72997faa565171dff3e14b6808ffb929 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=188bb56163855176e27608a0f2df2646 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=a9995fbeddc8e1a950e0b55a4fb566c2 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/apps/02-inventario.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=b05c7aeda7883955441fd1d098b138f1 2500w`})}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Inventario comes switched on in new accounts, but it can be switched off.`}),` If\nthe `,_jsx(_components.em,{children:`«Inventario»`}),` link in the product panel takes you to a screen that says\n`,_jsx(_components.strong,{children:`«App no activa»`}),` (`,_jsx(_components.em,{children:`App not active`}),`), it is switched off in your company:\nswitch it on in `,_jsx(_components.strong,{children:`Administración → Apps`}),` (`,_jsx(_components.em,{children:`Administration → Apps`}),`) (or ask\nwhoever manages the account). If it says `,_jsx(_components.strong,{children:`«No tienes acceso a Inventario»`}),`\n(`,_jsx(_components.em,{children:`You do not have access to Inventario`}),`), the app is on but your user does not\nhave it: ask to be given it in `,_jsx(_components.strong,{children:`Administración → Personas y accesos`}),`\n(`,_jsx(_components.em,{children:`Administration → People and access`}),`).`]}),_jsxs(_components.p,{children:[`In both cases, sort it out `,_jsx(_components.strong,{children:`before`}),` turning on `,_jsx(_components.strong,{children:`Controlar stock`}),`. Otherwise\nthe agent will treat the product as `,_jsx(_components.strong,{children:`out of stock`}),` (even though the\ninventario column reads «Sin control») and you will not be able to load units\ninto it.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`visible-and-active-are-not-the-same`,children:`Visible and Active are not the same`}),`\n`,_jsxs(_components.p,{children:[`This is the costliest confusion on the screen. Both switches are in\n`,_jsx(_components.strong,{children:`Disponibilidad`}),` and `,_jsx(_components.strong,{children:`only one of them silences the agent`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Switch`}),_jsx(_components.th,{children:`What it does when you turn it off`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Activo`}),` (`,_jsx(_components.em,{children:`Active`}),`)`]}),_jsxs(_components.td,{children:[`The agent `,_jsx(_components.strong,{children:`stops finding it`}),` when it searches the catalog. It is the right way to withdraw something.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Visible en el catálogo`}),` (`,_jsx(_components.em,{children:`Visible in the catalog`}),`)`]}),_jsxs(_components.td,{children:[`It takes it out of the catalog WhatsApp shows on your business profile, `,_jsx(_components.strong,{children:`but the agent still finds it`}),` and can carry on offering it in the conversation.`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`To withdraw a product, turn off «Activo».`}),` Turning off only «Visible en el\ncatálogo» does not stop the agent from carrying on selling it over chat.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`funnels-that-sell-it`,children:`Funnels that sell it`}),`\n`,_jsxs(_components.p,{children:[`That list, `,_jsx(_components.strong,{children:`Embudos que lo venden`}),` (`,_jsx(_components.em,{children:`Funnels that sell it`}),`), `,_jsx(_components.strong,{children:`only appears if\nyour business has more than one funnel`}),`. If you have one, you will not even see\nit. And the rule is not the one it looks like: `,_jsx(_components.em,{children:`«Sin marcar ninguno, lo cotizan\ntodos los embudos.»`}),` (`,_jsx(_components.em,{children:`With none ticked, every funnel quotes it.`}),`) — `,_jsx(_components.strong,{children:`ticking\nnothing means “all”, not “none”`}),`. As soon as you tick one, the text changes:\n`,_jsx(_components.em,{children:`«Solo los embudos marcados podrán cotizarlo.»`}),` (`,_jsx(_components.em,{children:`Only the ticked funnels will\nbe able to quote it.`}),`)`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`It is an organizing rule, not a security barrier.`}),` It is there so that the\nagent of your wholesale funnel does not quote the retail one’s products. But do\nnot use it to hide sensitive information: if the system cannot read the assignments, it opens\nup instead of closing down, and the agent sees everything.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Funnels are saved in a second step, after the product.`}),` If that step fails,\nyou will see an error message and the panel will stay open, even though the\nproduct has already been saved. If it was a new product, `,_jsx(_components.strong,{children:`do not click Guardar\nagain`}),`: you would create an identical one. Close the panel, reload the page,\nopen it with `,_jsx(_components.strong,{children:`Editar`}),` (`,_jsx(_components.em,{children:`Edit`}),`) and tick the funnels again.`]}),`\n`,_jsxs(_components.p,{children:[`And if on saving you take the product away from the funnel you have open, it\nwarns you — `,_jsx(_components.em,{children:`«Ya no lo vende el embudo abierto: sale de esta lista.»`}),` (`,_jsx(_components.em,{children:`The open\nfunnel no longer sells it: it leaves this list.`}),`) — and it disappears from the\ntable. `,_jsx(_components.strong,{children:`It has not been deleted`}),`: it stopped belonging to that funnel.`]}),`\n`,_jsxs(_components.p,{children:[`Two things other screens do with your products, so they do not take you by\nsurprise (see `,_jsx(_components.a,{href:`/en/guides/your-funnels`,children:`Your funnels`}),`):`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`If you duplicate a funnel`}),`, the copy is born selling the same products the\noriginal had ticked.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`If you accept a funnel that another account shared with you`}),`, its products\narrive in your catalog as new products, ticked only for that funnel and\n`,_jsx(_components.strong,{children:`without stock tracking`}),`.`]}),`\n`]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`With more than one funnel, the list you see is trimmed.`}),` `,_jsx(_components.code,{children:`/catalog`}),` shows\nwhat the funnel you have chosen in the funnel selector sells — the dropdown with\nits name, just below `,_jsx(_components.strong,{children:`Ventas`}),` in the left-hand menu (with the menu collapsed\nit sits at the top; on the phone, inside `,_jsx(_components.strong,{children:`Más`}),`, `,_jsx(_components.em,{children:`More`}),`) — plus whatever is not\nassigned to any funnel. The counter at the foot (`,_jsx(_components.em,{children:`«Mostrando N de M\nproductos»`}),`, `,_jsx(_components.em,{children:`Showing N of M products`}),`) counts what is already trimmed, and the\nCSV template you download will come out trimmed the same way. Before concluding\nthat you lost products, `,_jsx(_components.strong,{children:`switch funnels in that selector`}),`.`]}),_jsxs(_components.p,{children:[`One exception: a product ticked `,_jsx(_components.strong,{children:`only`}),` for a funnel you have already deleted\ndoes not appear in any funnel’s list, and your agents stop offering it. That is\nwhy, `,_jsx(_components.strong,{children:`before deleting a funnel`}),`, open each product ticked only for it and tick\nit for another funnel too, or untick all the funnels so that all of them sell it.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`editing-many-products-at-once-the-csv-template`,children:`Editing many products at once: the CSV template`}),`\n`,_jsxs(_components.p,{children:[`To load a hundred products, or to raise the price of a whole season, the\none-by-one form is no use. The `,_jsx(_components.strong,{children:`Plantilla CSV`}),` button (next to «Añadir\nproducto») opens the `,_jsx(_components.strong,{children:`«Editar catálogo en bloque (CSV)»`}),` (`,_jsx(_components.em,{children:`Bulk-edit catalog\n(CSV)`}),`) box, with two numbered steps.`]}),`\n`,_jsx(Frame,{caption:`The «Editar catálogo en bloque (CSV)» box: first you download, you edit in your spreadsheet, and then you upload.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=5d937c31bad2458ada4af41b266708c5`,alt:`«Editar catálogo en bloque (CSV)» window with the Descarga la plantilla and Sube tus cambios steps`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/catalogo/06-plantilla-csv.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=280\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=7fa0b539ce1e4a5a4377d3e8f3a2ffd0 280w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=560\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=0b7fbc1653de5e467e001e2aac8377ea 560w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=840\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=f476dc6846caa7116394dcf45d950bc4 840w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=e3d05d657660d78c89638d24883235e5 1100w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=b92085f6f4d71330ba76e5dbcbe08b8d 1650w, https://mintcdn.com/darkfunnels/fypBH9q351iR9qsC/images/catalogo/06-plantilla-csv.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fypBH9q351iR9qsC\u0026q=85\u0026s=5f7bdd87ceb3cdde11dd25d63bc7b346 2500w`})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Download the template`,children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Descargar plantilla (.csv)`}),` (`,_jsx(_components.em,{children:`Download template (.csv)`}),`) button. It\ndownloads a file with your current products, which you can open in Excel or\nGoogle Sheets.`]}),_jsxs(_components.p,{children:[`Watch what it contains. The box itself says so: `,_jsx(_components.em,{children:`«los productos editables\nde la lista que tienes debajo»`}),` (`,_jsx(_components.em,{children:`the editable products in the list you\nhave below`}),`). In other words, `,_jsx(_components.strong,{children:`only those of the funnel you have open`}),`,\nand at most `,_jsx(_components.strong,{children:`1000 products, the most recent ones`}),`.`]})]}),_jsx(Step,{title:`Edit it in your spreadsheet`,children:_jsxs(_components.p,{children:[`Change what you need and save as CSV. Do not delete any column. The `,_jsx(_components.code,{children:`id`}),`,\n`,_jsx(_components.code,{children:`handle`}),` and `,_jsx(_components.code,{children:`variant_id`}),` columns are the ones that let what already exists\nbe updated, and if the `,_jsx(_components.code,{children:`handle`}),`, `,_jsx(_components.code,{children:`name`}),` or `,_jsx(_components.code,{children:`currency`}),` column is missing,\nthe whole file is rejected.`]})}),_jsx(Step,{title:`Upload it and check the preview`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Elegir archivo CSV`}),` (`,_jsx(_components.em,{children:`Choose CSV file`}),`). Before applying anything,\nthe box shows you a summary — how many products, how many `,_jsx(_components.strong,{children:`nuevos`}),`\n(`,_jsx(_components.em,{children:`new`}),`), how many `,_jsx(_components.strong,{children:`a actualizar`}),` (`,_jsx(_components.em,{children:`to update`}),`) and how many `,_jsx(_components.strong,{children:`variantes`}),`\n(`,_jsx(_components.em,{children:`variants`}),`) — and, if there are rows with errors, the list of those that\n`,_jsx(_components.em,{children:`«se omitirán»`}),` (`,_jsx(_components.em,{children:`will be skipped`}),`) and why.`]})}),_jsx(Step,{title:`Apply the changes`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Aplicar cambios`}),` (`,_jsx(_components.em,{children:`Apply changes`}),`). When it finishes you will see how\nmany were created, how many were updated and how many gave an error, and\nthe reason for the errors. The cap is `,_jsx(_components.strong,{children:`500 products per upload`}),`: with\nmore, the whole upload is rejected; split it into several files.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`the-rules-of-the-file`,children:`The rules of the file`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A row `,_jsx(_components.strong,{children:`with an id`}),` updates the product that already exists.`]}),`\n`,_jsxs(_components.li,{children:[`A row `,_jsx(_components.strong,{children:`without an id`}),` creates a new product. `,_jsx(_components.strong,{children:`Careful:`}),` if you delete the\nid from a template row, the original is not updated: an identical one is\nborn, because the handle the template comes with is not the one the product\nhas stored. To change a product that already exists, always keep its id.`]}),`\n`,_jsxs(_components.li,{children:[`And the other way round: if you type by hand a `,_jsx(_components.strong,{children:`handle`}),` equal to the one the\nsystem stores for an existing product, that row without an id `,_jsx(_components.strong,{children:`updates it`}),`.\nFor a product created in the dashboard, that handle is its name in lowercase\nwith hyphens (`,_jsx(_components.code,{children:`polo-oversize-de-algodon-pima`}),`), not the one the template\ncomes with.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A product that is not in the file is not touched.`}),` Deleting a product row\ndoes not delete the product.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Removing a variant’s row deletes that variant`}),` from the product.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`But removing all the variant rows of a product that has several does not\ndelete anything`}),`: that row is rejected with an error warning that the\nproduct `,_jsx(_components.em,{children:`«tiene N variantes y esta fila no las trae»`}),` (`,_jsx(_components.em,{children:`has N variants and\nthis row does not include them`}),`), and the product is left intact. The same\nhappens if none of its variant rows carries its `,_jsx(_components.code,{children:`variant_id`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`With variant rows, the price goes in `,_jsx(_components.code,{children:`variant_price`})]}),`, not in `,_jsx(_components.code,{children:`price`}),`. If\nyou write a price in the product row, that product is skipped with the\nwarning `,_jsx(_components.em,{children:`«el precio de la fila maestra no se aplica cuando hay filas de\nvariante»`}),` (`,_jsx(_components.em,{children:`the master row’s price is not applied when there are variant\nrows`}),`).`]}),`\n`,_jsxs(_components.li,{children:[`For clothing, one row per combination, with `,_jsx(_components.code,{children:`variant_title`}),` («Negro / M»)\n`,_jsx(_components.strong,{children:`and`}),` `,_jsx(_components.code,{children:`variant_options`}),` («Color:Negro; Talla:M»).`]}),`\n`]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`What is in charge is the «handle» column, not the name.`}),` It is the grouping\nkey the template comes with already filled in (something like\n`,_jsx(_components.code,{children:`polo-oversize-de-algodon-pima-`}),` followed by a long code). `,_jsx(_components.strong,{children:`All the rows with\nthe same handle are a single product.`}),` If you copy a row to create another\nproduct and leave the same handle, the product you expect is not born: the two\nrows are treated as one thing, and one is ignored or overwrites the other.`]}),_jsxs(_components.p,{children:[`To really create one: leave the `,_jsx(_components.strong,{children:`id`}),` empty and put in a clearly new\n`,_jsx(_components.strong,{children:`handle`}),`, for example with `,_jsx(_components.code,{children:`-copia`}),` at the end. Do not use the product’s bare\nname, in lowercase with hyphens: it is usually the handle the original already\nhas stored, and you would overwrite it. A row without a handle is not accepted\n— it is skipped with `,_jsx(_components.em,{children:`«Falta el handle (clave de agrupación).»`}),` (`,_jsx(_components.em,{children:`The handle\n(grouping key) is missing.`}),`)`]}),_jsxs(_components.p,{children:[`From the `,_jsx(_components.strong,{children:`Añadir producto`}),` button this does not happen: two products with the\nsame name created there are two different products.`]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`What the file does not change.`}),` `,_jsx(_components.strong,{children:`Photos are not edited by CSV`}),` (only from\nthe product editor), nor is an info product’s `,_jsx(_components.strong,{children:`automatic delivery`}),`. And `,_jsx(_components.strong,{children:`the\nstock quantity is exported but ignored on import`}),`: you can write «40» in the\nsheet, upload it, and nothing will happen and you will see no error. Stock is\nmoved in `,_jsx(_components.strong,{children:`Inventario`}),`. What the file does declare is `,_jsx(_components.em,{children:`whether`}),` the product is\ntracked, in the `,_jsx(_components.code,{children:`track_inventory`}),` column.`]})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`In the file`}),_jsx(_components.th,{children:`What it is`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`id`})}),_jsx(_components.td,{children:`The product identifier. With an id, it updates. Always keep it on products that already exist.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`handle`})}),_jsxs(_components.td,{children:[`The grouping key. `,_jsx(_components.strong,{children:`It is the one that decides which rows are the same product.`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product_type`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`fisico`}),`, `,_jsx(_components.code,{children:`servicio`}),` or `,_jsx(_components.code,{children:`infoproducto`}),` (physical product, service or info product). Left empty, it does not touch the type (and a new product is born physical).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`variant_id`})}),_jsx(_components.td,{children:`The identifier of each variant. It is what lets the variant be updated in place.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`price_tiers`})}),_jsxs(_components.td,{children:[`The quantity pricing scale, like `,_jsx(_components.code,{children:`1:79; 2:149; 3:209`}),`. The open tier goes at the end, like `,_jsx(_components.code,{children:`6+:65`}),`. Leaving it blank does not delete it.`]})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`There is no «Duplicar» (`,_jsx(_components.em,{children:`Duplicate`}),`) button.`]}),` If you do not want to fill in\nthe form again, the shortcut is the template: download the file, copy the\nproduct’s rows, `,_jsx(_components.strong,{children:`delete their id and give all of them the same new handle`}),`\n(for example, the one they come with plus `,_jsx(_components.code,{children:`-copia`}),` at the end), and upload it\nagain. The copy arrives `,_jsx(_components.strong,{children:`without photos`}),`, without `,_jsx(_components.strong,{children:`automatic delivery`}),` and\nwith no funnels ticked (all your funnels sell it). You complete that afterwards\nwith `,_jsx(_components.strong,{children:`Editar`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-your-catalog-reaches-the-customer`,children:`How your catalog reaches the customer`}),`\n`,_jsx(_components.p,{children:`There are two different routes, and it is worth not mixing them up.`}),`\n`,_jsx(Heading,{level:`3`,id:`1-in-the-conversation-the-important-one`,children:`1. In the conversation (the important one)`}),`\n`,_jsxs(_components.p,{children:[`When the customer asks about a product or its price, the agent searches the\ncatalog and answers with what it finds. It searches by `,_jsx(_components.strong,{children:`the product name`}),` and\nby `,_jsx(_components.strong,{children:`the name or the code (SKU) of its variants`}),`. Useful things to know:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It does not search inside the description`}),`, although it does show it to\nthe agent (trimmed) once it has found the product.`]}),`\n`,_jsxs(_components.li,{children:[`It has to match `,_jsx(_components.strong,{children:`at least half the words`}),`. And one- or two-letter words —\n«S», «M», «XL» — have to stand on their own to count.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`It returns at most 5 products.`}),` If you have forty similar items, the agent\nwill name a few, not the whole list.`]}),`\n`,_jsxs(_components.li,{children:[`The variant’s color and size help to `,_jsx(_components.strong,{children:`narrow down among what it already\nfound`}),`, not to find something that did not match by name or by code.`]}),`\n`,_jsxs(_components.li,{children:[`When the agent looks up a product with the quantity the customer asked for,\nit receives `,_jsx(_components.strong,{children:`the total already calculated`}),`, with the scale and the\npromotion if there are any.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Translated into a recommendation: `,_jsx(_components.strong,{children:`the product name has to be the name your\ncustomer would ask for it by.`})]}),`\n`,_jsx(Heading,{level:`3`,id:`2-in-the-native-whatsapp-catalog`,children:`2. In the native WhatsApp catalog`}),`\n`,_jsx(_components.p,{children:`It is the products tab WhatsApp shows inside your business profile. It fills\nitself, but with conditions:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Your number has to be a `,_jsx(_components.strong,{children:`WhatsApp Business account`}),` and be connected. If it\nis not, nothing is published there (and the agent carries on selling over\nchat all the same).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`One entry is published per variant`}),`, not per product. That is why the\n12-combination T-shirt appears 12 times, each with the product’s main photo.`]}),`\n`,_jsxs(_components.li,{children:[`Only the products that are `,_jsx(_components.strong,{children:`both «Activo» and «Visible en el catálogo»`}),` get\nin, and only if they have a price and a currency.`]}),`\n`,_jsxs(_components.li,{children:[`With quantity pricing, the 1-unit `,_jsx(_components.strong,{children:`list`}),` price is published, not the\npromotion.`]}),`\n`,_jsxs(_components.li,{children:[`If you ticked funnels on the product, each number publishes its own. `,_jsx(_components.strong,{children:`A\nproduct with no funnels ticked — which is the normal case — is published by\nall your numbers.`})]}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Deactivating or hiding also deletes it from WhatsApp.`}),` It is not left\nhanging there. And do not worry: only the products the dashboard published are\ntouched; the ones you had created by hand in WhatsApp stay as they are.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`if-the-playbook-says-a-different-price`,children:`If the playbook says a different price`}),`\n`,_jsxs(_components.p,{children:[`Your agent takes prices from the catalog, but also from the text of its\n`,_jsx(_components.a,{href:`/en/guides/sales-playbook`,children:`sales playbook`}),` and from the files in the\n`,_jsx(_components.a,{href:`/en/guides/library`,children:`Library`}),` it reads to know how to answer (a price list in\nPDF, for example). If the playbook says “the Polo oversize de algodón pima costs\nS/ 89” and the catalog has S/ 79, the agent can contradict itself in front of\nthe customer.`]}),`\n`,_jsxs(_components.p,{children:[`That is what the playbook’s `,_jsx(_components.strong,{children:`Doctor`}),` is for: when a line of the playbook puts\na price near the full name of a catalog product (or its SKU) and it does not\nmatch, it warns you. If there is only one possible price, it offers to fix it\nin one click with the `,_jsx(_components.strong,{children:`Poner S/ 79 (precio del catálogo)`}),` (`,_jsx(_components.em,{children:`Set S/ 79\n(catalog price)`}),`) button; if the product has several variants, it shows you\ntheir prices and you decide. Products with quantity pricing are not compared.\nSee `,_jsx(_components.a,{href:`/en/guides/sales-playbook#the-doctor`,children:`The Doctor`}),`.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`The healthiest approach is `,_jsx(_components.strong,{children:`not to write prices in the playbook`}),`: leave them\nin the catalog and let the agent look them up there.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`things-you-are-going-to-need-later`,children:`Things you are going to need later`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Editing a product that already exists`,id:`editing-a-product-that-already-exists`,children:_jsxs(_components.p,{children:[`In the actions column of its row, click `,_jsx(_components.strong,{children:`Editar`}),` (`,_jsx(_components.em,{children:`Edit`}),`). `,_jsx(_components.strong,{children:`Clicking the\nrow does not open the product`}),` — in this table it only opens with that\naction — so if you click on it and it does not open, it is not broken: use\nthe action.`]})}),_jsxs(Accordion,{title:`Withdrawing a product without deleting it (recommended)`,id:`withdrawing-a-product-without-deleting-it-recommended`,children:[_jsxs(_components.p,{children:[`Tick the checkbox on its row and click `,_jsx(_components.strong,{children:`Desactivar`}),` (`,_jsx(_components.em,{children:`Deactivate`}),`) in the\nbar that appears at the top. The product stays in your catalog with all its\nhistory, but the agent stops finding it.`]}),_jsxs(_components.p,{children:[`In that same bar (`,_jsx(_components.em,{children:`«N seleccionado(s)»`}),`, `,_jsx(_components.em,{children:`N selected`}),`) you have the four\nbulk actions — `,_jsx(_components.strong,{children:`Activar`}),` (`,_jsx(_components.em,{children:`Activate`}),`), `,_jsx(_components.strong,{children:`Desactivar`}),` (`,_jsx(_components.em,{children:`Deactivate`}),`),\n`,_jsx(_components.strong,{children:`Mostrar`}),` (`,_jsx(_components.em,{children:`Show`}),`) and `,_jsx(_components.strong,{children:`Ocultar`}),` (`,_jsx(_components.em,{children:`Hide`}),`) — which apply straight away to\neverything you have ticked. It is the quick way to withdraw a whole season.\n`,_jsx(_components.strong,{children:`Limpiar`}),` (`,_jsx(_components.em,{children:`Clear`}),`) removes the selection.`]})]}),_jsxs(Accordion,{title:`Really deleting a product`,id:`really-deleting-a-product`,children:[_jsxs(_components.p,{children:[`There is no trash can and no delete button inside the product panel. From\nthe dashboard you delete it like this: `,_jsx(_components.strong,{children:`tick the checkbox on the row and\nclick «Eliminar»`}),` (`,_jsx(_components.em,{children:`Delete`}),`, in red) in the selection bar.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`That button does not ask for confirmation and cannot be undone.`}),` One\nclick and the product disappears with its variants; it is not archived.\nHaving orders or sales already recorded does `,_jsx(_components.strong,{children:`not`}),` stop it: the product is\ndeleted anyway and those records lose their link to it. That is why, almost\nalways, what you want is `,_jsx(_components.strong,{children:`Desactivar`}),`, not `,_jsx(_components.strong,{children:`Eliminar`}),`.`]})})]}),_jsxs(Accordion,{title:`Finding something in a large catalog`,id:`finding-something-in-a-large-catalog`,children:[_jsxs(_components.p,{children:[`Two tools work: the `,_jsx(_components.strong,{children:`«Buscar productos…»`}),` (`,_jsx(_components.em,{children:`Search products…`}),`) search\nbox (it searches by product name and by the SKU of its variants; it does\nnot search the description) and the `,_jsx(_components.strong,{children:`Filtrar`}),` (`,_jsx(_components.em,{children:`Filter`}),`) button, which\nopens `,_jsx(_components.strong,{children:`«Filtrar catálogo»`}),` (`,_jsx(_components.em,{children:`Filter catalog`}),`) with three filters: `,_jsx(_components.strong,{children:`Tipo`}),`\n(`,_jsx(_components.em,{children:`Type`}),`), `,_jsx(_components.strong,{children:`Visibilidad`}),` (`,_jsx(_components.em,{children:`Visibility`}),`: Visible / Oculto, `,_jsx(_components.em,{children:`Hidden`}),`) and\n`,_jsx(_components.strong,{children:`Estado`}),` (`,_jsx(_components.em,{children:`Status`}),`: Activo / Inactivo, `,_jsx(_components.em,{children:`Active / Inactive`}),`).`]}),_jsxs(_components.p,{children:[`The list loads `,_jsx(_components.strong,{children:`50 at a time`}),` as you scroll down, with no page numbers,\nand at the foot it says `,_jsx(_components.strong,{children:`«Mostrando N de M productos»`}),`.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Two controls on this screen do nothing today, and we would rather tell\nyou.`}),` The `,_jsx(_components.strong,{children:`Todos · Manual · Shopify`}),` (`,_jsx(_components.em,{children:`All · Manual · Shopify`}),`) tabs do\nnot filter: switching tabs does not change what you see. And the\n`,_jsx(_components.strong,{children:`Ordenar`}),` (`,_jsx(_components.em,{children:`Sort`}),`) button opens its box with «Nombre», «Precio»,\n«Inventario» and «Actualizado» (`,_jsx(_components.em,{children:`Name, Price, Inventory, Updated`}),`), but the\nlist does not change order: it comes out from the most recent product to\nthe oldest (the column headers do not sort either). Use the search box and\n`,_jsx(_components.strong,{children:`Filtrar`}),`, which do work.`]})})]}),_jsxs(Accordion,{title:`Who on my team can touch the catalog?`,id:`who-on-my-team-can-touch-the-catalog`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Anyone with access to the Ventas app.`}),` Inside Ventas there are no finer\npermissions for the catalog: that person can create, edit, hide and also\n`,_jsx(_components.strong,{children:`delete`}),` products, with the `,_jsx(_components.strong,{children:`Eliminar`}),` button that does not ask for\nconfirmation. Anyone without Ventas does not see the catalog.`]}),_jsxs(_components.p,{children:[`Each person’s access is granted in `,_jsx(_components.strong,{children:`Administración → Personas y accesos`}),`.\nSee `,_jsx(_components.a,{href:`/en/getting-started/invite-your-team`,children:`Invite your team`}),`.`]})]}),_jsxs(Accordion,{title:`Who sees my product photos?`,id:`who-sees-my-product-photos`,children:[_jsx(_components.p,{children:`Photos are stored in a private space belonging to your company, not at a\npublic internet address. The dashboard shows them to you with temporary\nlinks that expire on their own.`}),_jsxs(_components.p,{children:[`What is public is what you publish: `,_jsx(_components.strong,{children:`the main photo of each product that\ngoes into the WhatsApp catalog can be seen by anyone who opens your\nbusiness profile`}),`. If a photo must not be seen by anyone outside, do not\nmake it the main one on an active, visible product.`]})]}),_jsx(Accordion,{title:`Things this screen does not have`,id:`things-this-screen-does-not-have`,children:_jsxs(_components.p,{children:[`So that you do not go looking for them: `,_jsx(_components.strong,{children:`there are no categories, no tags,\nno weight, and no “was price / struck-through price”`}),`. There is no\n`,_jsx(_components.strong,{children:`duplicate`}),` button (it is done by CSV), `,_jsx(_components.strong,{children:`no undo`}),` and `,_jsx(_components.strong,{children:`no trash can`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`if-something-does-not-work`,children:`If something does not work`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What you see`}),_jsx(_components.th,{children:`Almost always it is`}),_jsx(_components.th,{children:`How to fix it`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«… no tiene nada que vender»`}),` (`,_jsx(_components.em,{children:`… has nothing to sell`}),`) with your funnel’s name, and you know you loaded products`]}),_jsx(_components.td,{children:`The list is trimmed to the funnel you have chosen and those products belong to another one`}),_jsxs(_components.td,{children:[`Switch funnels in the selector, just below `,_jsx(_components.strong,{children:`Ventas`}),` in the left-hand menu`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Sin resultados»`}),` (`,_jsx(_components.em,{children:`No results`}),`)`]}),_jsx(_components.td,{children:`You have a search or a filter set`}),_jsxs(_components.td,{children:[`Click `,_jsx(_components.strong,{children:`Limpiar filtros`}),` (`,_jsx(_components.em,{children:`Clear filters`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The panel opens `,_jsx(_components.strong,{children:`almost empty`})]}),_jsx(_components.td,{children:`You have not chosen the type yet`}),_jsxs(_components.td,{children:[`Choose `,_jsx(_components.strong,{children:`Producto físico`}),`, `,_jsx(_components.strong,{children:`Servicio`}),` or `,_jsx(_components.strong,{children:`Infoproducto`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`It will not let me type the price`}),` and the field says `,_jsx(_components.strong,{children:`«Precio (1 unidad, de la escala)»`})]}),_jsxs(_components.td,{children:[`You have `,_jsx(_components.strong,{children:`Precios por cantidad`}),` on`]}),_jsxs(_components.td,{children:[`Type it into the `,_jsx(_components.strong,{children:`1 unit`}),` row of the scale`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The price at the top is locked and says `,_jsx(_components.strong,{children:`«Desde (el más barato)»`})]}),_jsx(_components.td,{children:`The product has variants: each one carries its own price`}),_jsxs(_components.td,{children:[`Change it on the variant’s row, or use `,_jsx(_components.strong,{children:`Mismo precio para las N variantes`}),` and `,_jsx(_components.strong,{children:`Aplicar a todas`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`I switched from PEN to USD and the numbers stayed the same`})}),_jsx(_components.td,{children:`The currency does not convert prices`}),_jsx(_components.td,{children:`Correct the prices by hand`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`It will not let me type the stock quantity`})}),_jsxs(_components.td,{children:[`Here you only declare `,_jsx(_components.em,{children:`whether`}),` it is tracked`]}),_jsxs(_components.td,{children:[`Record the movement in `,_jsx(_components.strong,{children:`Inventario`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The Inventario link opens `,_jsx(_components.strong,{children:`«App no activa»`})]}),_jsx(_components.td,{children:`The Inventario app is switched off in your company`}),_jsxs(_components.td,{children:[`Switch it on in `,_jsx(_components.strong,{children:`Administración → Apps`}),`, or ask whoever manages the account`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The Inventario link opens `,_jsx(_components.strong,{children:`«No tienes acceso a Inventario»`})]}),_jsx(_components.td,{children:`The app is on, but your user does not have it`}),_jsxs(_components.td,{children:[`Ask to be given it in `,_jsx(_components.strong,{children:`Administración → Personas y accesos`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`I lost what I was typing`})}),_jsxs(_components.td,{children:[`You closed the panel (with `,_jsx(_components.strong,{children:`Cerrar`}),`, `,_jsx(_components.strong,{children:`Cancelar`}),`, `,_jsx(_components.strong,{children:`Esc`}),` or a click outside) without saving`]}),_jsxs(_components.td,{children:[`There is no draft: it has to be redone. Always click `,_jsx(_components.strong,{children:`Guardar`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`I saved and the product disappeared`}),` from the table`]}),_jsx(_components.td,{children:`You took it away from the funnel you have open`}),_jsx(_components.td,{children:`It was not deleted: switch to a funnel that does sell it`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`On saving, an `,_jsx(_components.strong,{children:`error message`}),` appears and the panel `,_jsx(_components.strong,{children:`stays open`})]}),_jsx(_components.td,{children:`The second step of the save (the funnels) may have failed: the product may already be saved`}),_jsxs(_components.td,{children:[`If it was new, do not click `,_jsx(_components.strong,{children:`Guardar`}),` again. Close, reload the page and, if the product is already in the table, open it with `,_jsx(_components.strong,{children:`Editar`}),` and tick the funnels again`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Embudo eliminado»`}),` in the embudos column`]}),_jsx(_components.td,{children:`It was ticked for a funnel that no longer exists`}),_jsx(_components.td,{children:`Open it and tick the funnels that should sell it`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The agent `,_jsx(_components.strong,{children:`still does not name`}),` a product you just created`]}),_jsx(_components.td,{children:`Changes can take up to a minute to reach it`}),_jsx(_components.td,{children:`Wait a minute and try again`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`The agent `,_jsx(_components.strong,{children:`does not find it`}),` even though it is active`]}),_jsx(_components.td,{children:`The customer calls it something different from its name`}),_jsx(_components.td,{children:`Rename the product with the words the customer uses`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`I turned «Visible» off and the agent still offers it`})}),_jsx(_components.td,{children:`«Visible» does not silence the agent`}),_jsxs(_components.td,{children:[`Turn off `,_jsx(_components.strong,{children:`Activo`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`The search box and the filters disappeared`})}),_jsx(_components.td,{children:`You ticked a product’s checkbox: the selection bar replaces them`}),_jsxs(_components.td,{children:[`Click `,_jsx(_components.strong,{children:`Limpiar`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`On uploading the CSV, a product gives an error saying it `,_jsx(_components.strong,{children:`«tiene N variantes»`}),` (`,_jsx(_components.em,{children:`has N variants`}),`)`]}),_jsxs(_components.td,{children:[`The sheet is missing its variant rows, or its `,_jsx(_components.code,{children:`variant_id`})]}),_jsx(_components.td,{children:`Download the template again and edit on top of it, without removing those rows or that column`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`On uploading the CSV, a product is skipped with `,_jsx(_components.strong,{children:`«el precio de la fila maestra no se aplica…»`})]}),_jsxs(_components.td,{children:[`You put `,_jsx(_components.code,{children:`price`}),` in the product row and it has variants`]}),_jsxs(_components.td,{children:[`Put the price in `,_jsx(_components.code,{children:`variant_price`}),` and leave `,_jsx(_components.code,{children:`price`}),` empty`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`I uploaded the CSV and two products got mixed up`})}),_jsxs(_components.td,{children:[`You repeated another product’s `,_jsx(_components.strong,{children:`handle`})]}),_jsx(_components.td,{children:`To create one, empty id and a new handle`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`I edited the stock in the CSV and nothing changed`})}),_jsx(_components.td,{children:`That column is exported but ignored on import`}),_jsxs(_components.td,{children:[`Record it in `,_jsx(_components.strong,{children:`Inventario`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`«Infoproducto · ⚠️ sin entrega»`}),` in the list`]}),_jsx(_components.td,{children:`You gave it neither a delivery file nor a link`}),_jsxs(_components.td,{children:[`Open it and fill in `,_jsx(_components.strong,{children:`Entrega automática`})]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`It does not appear in the dropdown`}),` when recording a sale`]}),_jsx(_components.td,{children:`Another funnel sells it, it is inactive or its price is 0`}),_jsx(_components.td,{children:`Switch to the funnel that sells it in the menu selector (or tick it for this one too), activate it or give it a price greater than 0`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`the-same-thing-from-your-assistant`,children:`The same thing, from your assistant`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`This section is `,_jsx(_components.strong,{children:`optional and only applies if you connected an AI assistant`}),`\n(Claude, ChatGPT, Codex or another compatible one) to your business. If you\nwork in the dashboard, you are already done.`]})}),`\n`,_jsxs(_components.p,{children:[`Your assistant can read the whole catalog, load it in bulk from a file you hand\nit, and correct it. With the link the dashboard gives you (`,_jsx(_components.strong,{children:`Personalizar →\nAsistentes IA → Copiar link`}),`, `,_jsx(_components.em,{children:`Customize → AI assistants → Copy link`}),`, the same\none as in the connection guides), your assistant can already `,_jsx(_components.strong,{children:`read and write`}),`\nthe catalog, and also `,_jsx(_components.strong,{children:`delete products`}),`. If you connected with the base\naddress, with nothing after it, it can only read the catalog: to write, you\nneed to add `,_jsx(_components.code,{children:`catalog_write`}),`. See `,_jsx(_components.a,{href:`/en/reference/connection-url`,children:`The connection URL`}),`.\nAnd, as in the dashboard, your user has to have access to the `,_jsx(_components.strong,{children:`Ventas`}),` app.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tool`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`list_products`})}),_jsx(_components.td,{children:`A paginated list. It filters by text, visibility, active and type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`get_product`})}),_jsx(_components.td,{children:`The complete record of a product: description, variants, images and price scale.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`upsert_products`})}),_jsxs(_components.td,{children:[`Creates or updates up to 100 products per call. `,_jsx(_components.strong,{children:`Destructive.`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`delete_product`})}),_jsxs(_components.td,{children:[`Deletes a product. `,_jsx(_components.strong,{children:`Final, with no trash can.`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The rule that avoids disasters:`}),` when writing, each product is a `,_jsx(_components.strong,{children:`complete\nrow that replaces the one that was there`}),` — whatever is not sent may be left\nempty. That is why the right order is to read the record, change only your\npart, send it back whole and read it again to check. The system helps quite a\nbit: it rejects incomplete rows before touching anything.`]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Two things that really can cost you dearly from the assistant.`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`When updating a product with variants you have to send `,_jsx(_components.strong,{children:`all`}),` of them,\n`,_jsx(_components.strong,{children:`each one with its identifier`}),`. A variant that is not sent `,_jsx(_components.strong,{children:`is deleted`}),`,\nand one sent without its identifier comes in as new and the old one is\ndeleted — the orders and stock that pointed at it are left with no\nreference. There is a safety net: on a product with several variants, if\nnone arrives with its identifier, or if the assistant says the product has\nno variants, that row is rejected without touching anything.`]}),`\n`,_jsxs(_components.li,{children:[`A product `,_jsx(_components.strong,{children:`with no identifier`}),` is looked up by name: a name equal to that\nof an existing one `,_jsx(_components.strong,{children:`overwrites it`}),`. Ask your assistant to update using the\nidentifier.`]}),`\n`]})]}),`\n`,_jsx(_components.p,{children:`And three limits worth keeping in mind:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Photos are not touched`}),` from the assistant: uploading a batch does not\ndelete or change your products’ images. They are managed in the dashboard.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Nor is the stock quantity.`}),` Even if your assistant sends a number, it is\nnot written: it lives in Inventario. What it can declare from outside is\n`,_jsx(_components.em,{children:`whether`}),` the product is stock-tracked.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The price scale`}),` stays as it is if the assistant does not mention it, and\nis deleted if you ask it to remove it.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Phrases that work:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.em,{children:`“List my catalog before writing anything, so as not to duplicate.”`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.em,{children:`“Raise the price of the Polo oversize de algodón pima to 89 soles. Read its\nrecord first and send the whole row back with that single change.”`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.em,{children:`“Set the Combo Verano to inactive: read its record, change only that and\nsend the complete row back.”`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.em,{children:`“Open three of the ones you just uploaded and show me the price and currency\nof each variant.”`})}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`That last phrase matters. In the listing, the price you see is `,_jsx(_components.strong,{children:`the cheapest`}),`\namong the variants and the code is that same variant’s, so a batch that\nuploaded the wrong currency on a single variant `,_jsx(_components.strong,{children:`can look correct from a\ndistance`}),`.`]})}),`\n`,_jsxs(CardGroup,{cols:3,children:[_jsx(Card,{title:`The file Library`,icon:`paperclip`,href:`/en/guides/library`,children:_jsx(_components.p,{children:`The photos and the PDFs the agent sends, and where the automatic deliveries\ncome from.`})}),_jsx(Card,{title:`The sales playbook`,icon:`book`,href:`/en/guides/sales-playbook`,children:_jsx(_components.p,{children:`The script your agent uses to present and defend those prices.`})}),_jsx(Card,{title:`Orders and metrics`,icon:`chart-line`,href:`/en/guides/orders-and-metrics`,children:_jsx(_components.p,{children:`What sold out of all this and how much it brought in.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Product catalog for a WhatsApp AI agent","sidebarTitle":"The catalog","description":"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.","keywords":["product catalog for a WhatsApp AI agent","product variants and SKU","quantity pricing","WhatsApp Business catalog","bulk edit products CSV","stock tracking"],"href":"/en/guides/catalog"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What the catalog is for","slug":"what-the-catalog-is-for","depth":2,"children":[]},{"title":"The words on this screen","slug":"the-words-on-this-screen","depth":2,"children":[]},{"title":"Your first product, click by click","slug":"your-first-product-click-by-click","depth":2,"children":[]},{"title":"How to read the table","slug":"how-to-read-the-table","depth":2,"children":[]},{"title":"The three types, and how they really differ","slug":"the-three-types-and-how-they-really-differ","depth":2,"children":[{"title":"If you sell a course or an ebook: automatic delivery","slug":"if-you-sell-a-course-or-an-ebook-automatic-delivery","depth":3,"children":[]}]},{"title":"The form, block by block","slug":"the-form-block-by-block","depth":2,"children":[{"title":"What is really required","slug":"what-is-really-required","depth":3,"children":[]}]},{"title":"Quantity pricing (wholesale)","slug":"quantity-pricing-wholesale","depth":2,"children":[]},{"title":"Variants: sizes and colors","slug":"variants-sizes-and-colors","depth":2,"children":[]},{"title":"Stock: when to turn it on","slug":"stock-when-to-turn-it-on","depth":2,"children":[]},{"title":"Visible and Active are not the same","slug":"visible-and-active-are-not-the-same","depth":2,"children":[{"title":"Funnels that sell it","slug":"funnels-that-sell-it","depth":3,"children":[]}]},{"title":"Editing many products at once: the CSV template","slug":"editing-many-products-at-once-the-csv-template","depth":2,"children":[{"title":"The rules of the file","slug":"the-rules-of-the-file","depth":3,"children":[]}]},{"title":"How your catalog reaches the customer","slug":"how-your-catalog-reaches-the-customer","depth":2,"children":[{"title":"1. In the conversation (the important one)","slug":"1-in-the-conversation-the-important-one","depth":3,"children":[]},{"title":"2. In the native WhatsApp catalog","slug":"2-in-the-native-whatsapp-catalog","depth":3,"children":[]},{"title":"If the playbook says a different price","slug":"if-the-playbook-says-a-different-price","depth":3,"children":[]}]},{"title":"Things you are going to need later","slug":"things-you-are-going-to-need-later","depth":2,"children":[]},{"title":"If something does not work","slug":"if-something-does-not-work","depth":2,"children":[]},{"title":"The same thing, from your assistant","slug":"the-same-thing-from-your-assistant","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"darkfunnels","siteName":"DarkFunnels","title":"Product catalog for a WhatsApp AI agent - DarkFunnels","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"es":{"href":"/","matchLevel":3},"en":{"href":"/en/guides/catalog","matchLevel":0}}},"lastModified":"2026-10-19T21:13:26.300Z","gitLastModified":"2026-10-19T21:13:00.000Z","originalFileLocation":"en/guides/catalog.mdx","locale":"en"},"headHtml":"\u003cmeta data-mint-head name=\"description\" content=\"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\">\u003cmeta data-mint-head name=\"application-name\" content=\"DarkFunnels\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Product catalog for a WhatsApp AI agent - DarkFunnels\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"DarkFunnels\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.darkfunnels.ai/en/guides/catalog\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Product catalog for a WhatsApp AI agent - DarkFunnels\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/darkfunnels/HUHwZ7TPMDmPGRFh/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"DarkFunnels\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#C2562A\">\u003cmeta data-mint-head name=\"og:locale\" content=\"es_PE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.darkfunnels.ai/en/guides/catalog\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/guides/catalog.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://darkfunnels.ai/#organization\",\"name\":\"DarkFunnels\",\"url\":\"https://darkfunnels.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/darkfunnels/Df-1lKh1Aj5k8c-r/logo/light.svg?fit=max\u0026auto=format\u0026n=Df-1lKh1Aj5k8c-r\u0026q=85\u0026s=db60a9a883ed42e13a06aded18a08fb0\"},\"sameAs\":[\"https://github.com/darkfunnels-ai\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.darkfunnels.ai#website\",\"name\":\"DarkFunnels\",\"url\":\"https://docs.darkfunnels.ai\",\"publisher\":{\"@id\":\"https://darkfunnels.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.darkfunnels.ai/en/guides/catalog#webpage\",\"url\":\"https://docs.darkfunnels.ai/en/guides/catalog\",\"name\":\"Product catalog for a WhatsApp AI agent\",\"description\":\"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\",\"dateModified\":\"2026-10-19T21:13:00.000Z\",\"isPartOf\":{\"@id\":\"https://docs.darkfunnels.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.darkfunnels.ai/en/guides/catalog#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.darkfunnels.ai/en/guides/catalog#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.darkfunnels.ai/en/guides/sales-playbook\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Product catalog for a WhatsApp AI agent\",\"item\":\"https://docs.darkfunnels.ai/en/guides/catalog\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.darkfunnels.ai/en/guides/catalog#article\",\"headline\":\"Product catalog for a WhatsApp AI agent\",\"name\":\"Product catalog for a WhatsApp AI agent\",\"description\":\"How to load your products into the Catalog (price, sizes and colors, stock, photos, quantity pricing) so your agent quotes exact prices on WhatsApp.\",\"url\":\"https://docs.darkfunnels.ai/en/guides/catalog\",\"mainEntityOfPage\":{\"@id\":\"https://docs.darkfunnels.ai/en/guides/catalog#webpage\"},\"dateModified\":\"2026-10-19T21:13:00.000Z\",\"keywords\":\"product catalog for a WhatsApp AI agent, product variants and SKU, quantity pricing, WhatsApp Business catalog, bulk edit products CSV, stock tracking\",\"publisher\":{\"@id\":\"https://darkfunnels.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.darkfunnels.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"DarkFunnels\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"DarkFunnels","nav":{"global":null,"languages":[{"language":"es","default":true,"pages":[{"title":"es","href":"/"}]},{"language":"en","groups":[{"group":"Start","pages":[{"title":"DarkFunnels documentation","sidebarTitle":"Overview","href":"/en"}]},{"group":"Getting started","pages":[{"title":"Start your WhatsApp AI sales agent free trial","sidebarTitle":"Create your account","href":"/en/getting-started/create-your-account"},{"title":"Your WhatsApp AI agent dashboard, day one","sidebarTitle":"Your first look","href":"/en/getting-started/first-look"},{"title":"WhatsApp sales platform modules: the apps","sidebarTitle":"The apps","href":"/en/getting-started/the-apps"},{"title":"Your first funnel and its WhatsApp AI sales agent","sidebarTitle":"Your first funnel","href":"/en/getting-started/your-first-funnel"},{"title":"Connect WhatsApp without the Business API","sidebarTitle":"Connect WhatsApp","href":"/en/getting-started/connect-whatsapp"},{"title":"WhatsApp AI agent credits and top-ups","sidebarTitle":"Credits and top-ups","href":"/en/getting-started/credits-and-top-ups"},{"title":"WhatsApp AI agent pricing and plans","sidebarTitle":"Pricing","href":"/en/getting-started/pricing"},{"title":"Invite your team","href":"/en/getting-started/invite-your-team"}]},{"group":"Guides","pages":[{"title":"WhatsApp AI agent sales script: the playbook","sidebarTitle":"The sales playbook","href":"/en/guides/sales-playbook"},{"title":"WhatsApp AI sales agent tools: what the agent can do","sidebarTitle":"The agent's tools","href":"/en/guides/tools"},{"title":"Funnel settings","description":"Your funnel's Configuración (Settings) screen, section by section: who it notifies, business details, test numbers, daily summary, model and quiet hours.","href":"/en/guides/funnel-settings"},{"title":"Product catalog for a WhatsApp AI agent","sidebarTitle":"The catalog","href":"/en/guides/catalog"},{"title":"Send files from a WhatsApp AI agent: the Library","sidebarTitle":"The file Library","description":"Upload photos, catalogs, PDFs and audio so your WhatsApp AI agent can send them or use them as memory, and what to do if a file doesn't arrive.","href":"/en/guides/library"},{"title":"WhatsApp shared inbox for AI agents","sidebarTitle":"The conversation inbox","href":"/en/guides/conversations"},{"title":"WhatsApp sales orders and conversion metrics","sidebarTitle":"Orders and metrics","href":"/en/guides/orders-and-metrics"},{"title":"The referral network","href":"/en/guides/referral-network"},{"title":"Your funnels","href":"/en/guides/your-funnels"},{"title":"Meta pixel for WhatsApp conversions","sidebarTitle":"Meta pixel","href":"/en/guides/meta-pixel"},{"title":"Connect your Meta ads","sidebarTitle":"Meta ads","href":"/en/guides/meta-ads"}]},{"group":"Reference","pages":[{"title":"WhatsApp AI sales agent glossary","sidebarTitle":"Glossary","href":"/en/reference/glossary"},{"title":"WhatsApp AI agent troubleshooting FAQ","sidebarTitle":"FAQ","href":"/en/reference/faq"},{"title":"Tool reference","href":"/en/reference/tools"}]},{"group":"Security","pages":[{"title":"WhatsApp AI agent data retention and privacy","sidebarTitle":"Security and privacy","href":"/en/security"}]},{"group":"Optional: run it from Claude or ChatGPT","pages":[{"title":"Connect Claude to your WhatsApp AI agent","sidebarTitle":"claude.ai","href":"/en/quickstarts/claude-ai"},{"title":"Claude Code MCP connector setup","sidebarTitle":"Claude Code","href":"/en/quickstarts/claude-code"},{"title":"Connect Codex to your WhatsApp AI agent","sidebarTitle":"Codex","href":"/en/quickstarts/codex"},{"title":"Connect ChatGPT to your WhatsApp agent","sidebarTitle":"ChatGPT","href":"/en/quickstarts/chatgpt"},{"title":"MCP setup for Cursor, VS Code and others","sidebarTitle":"Cursor, VS Code and others","href":"/en/quickstarts/other-mcp-clients"},{"title":"MCP connection URL parameters","sidebarTitle":"Connection URL","href":"/en/reference/connection-url"}]}]}]},"title":"Product catalog for a WhatsApp AI agent - DarkFunnels","buildId":"dpl_8LJVMfxYNq6LJkohTrn2iyWT8umj","deploymentId":"dpl_8LJVMfxYNq6LJkohTrn2iyWT8umj","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DgIorxK1.js","DynamicMarkdown-43fmNsOD.js","zoom-image-lightbox-D9lJgLSo.js","PlusIcon-C1lem43w.js","lightbox-handle-r17bVUz3.js"]}