Productos: cómo funciona
Productos es el catálogo de tu espacio: qué vendes, a qué precio, con qué promociones y cuánto stock queda. Bentho consulta aquí esas cifras cuando atiende a tus clientes, en vez de inventarlas.
Por API mantienes el catálogo al día desde tu propio sistema, cotizas un carrito con sus descuentos, apartas stock mientras tu cliente paga y confirmas la venta para que las existencias bajen.
También puedes hacerlo desde la consola: en el Estudio de un espacio con el módulo activo, abre Productos. El panel permite crear productos, fijar su precio y su stock, cambiar su estado, importar un catálogo y gestionar listas de precios y promociones.
Antes de empezar
- El espacio tiene que tener el módulo Productos:
productossale en sus módulos enGET /api/companies. Si no, cada ruta responde 403módulo no habilitado para este espacio. - Leer vale con cualquier clave. Todo lo que no es GET pide una clave escribe, también cotizar, que no cambia nada pero es un POST.
- Las rutas cuelgan de
/api/mod/productos/{espacio}/, con la misma clave y los mismos límites que el resto de la API. Si el módulo no está disponible en ese momento, responde 502: reintenta en unos segundos. products/,product-types/ycatalog/imports/llevan la barra final. Sin ella no responden con los datos.- Productos no gasta créditos: ninguna de sus rutas descuenta de la bolsa.
Del alta a la venta, paso a paso
- Crea el producto (o importa tu catálogo de un archivo). Nace en
borrador, con su variante única. - Ponlo a la venta con
{"estado": "activo"}: solo los activos salen en la búsqueda. - Crea una lista de precios y fija el precio de cada variante en ella.
- Fija su stock, o súbelo de un archivo.
- Cuando un cliente compra: cotiza el carrito, reserva lo que lleva mientras paga y, al cobrar, confirma la venta con las promociones que se aplicaron.
POST …/price-quote → total, adjustments, catalog_version
POST …/inventory/reservations → id de la reserva (15 min por defecto)
POST …/inventory/sale { lines: [{ variant_id, cantidad, reservation_id }],
sale_ref, promociones_aplicadas }Productos, variantes y tipos
- Un producto es lo que ves en la carta: «Café molido La Loma 500 g». Tiene nombre, descripción, imágenes (URL), atributos y un estado.
- Una variante es lo que se vende: tiene su SKU, su precio y su stock. Un producto sin opciones tiene una sola; uno con opciones («Molienda»: en grano o molido) tiene una por combinación, que añades con Crea una variante.
- Un tipo de producto («Café», «Repuesto», «Plan») dice qué atributos llevan sus productos y cuáles son obligatorios. Es opcional: sin tipo, los atributos son libres.
borrador → activo → archivado
(cualquiera se cambia con PATCH products/{producto})
borrador recién creado; no sale en la búsqueda
activo a la venta; sale en la búsqueda
archivado retirado; se conserva, no sale en la búsquedaImportar desde un archivo
Sube un CSV, un Excel (.xlsx) o un PDF con una tabla a importar. Queda en draft: revisa sus filas en la importación, descarta las que sobren y actívala. Hasta entonces el catálogo no cambia.
| CAMPO | COLUMNAS QUE ENTIENDE |
|---|---|
| nombre | producto, nombre, artículo, ítem |
| sku | sku, referencia, ref, código, cod, código de barras, ean |
| tipo | tipo, categoría, tipo de producto |
| descripcion | descripción, detalle |
| precio | precio, valor, precio unitario, pvp |
| atributos | Cualquier otra columna, con su encabezado como nombre. |
- Hace falta una columna de nombre o una de SKU. Los encabezados no distinguen tildes ni mayúsculas, y el CSV puede ir separado por comas o por punto y coma.
- Los precios se leen en formato colombiano:
$45.000es 45000 y12,5es 12.5. - Cada fila activada crea un producto nuevo y
activo. Activar dos veces el mismo archivo duplica el catálogo. - El precio del archivo no se cobra: queda en
metadata.precio_sugeridopara que lo pases a una lista con Fija un precio. - Un .xls antiguo no se lee: guárdalo como .xlsx o como CSV. Hasta 25 MB por archivo.
Cómo se elige un precio
Los precios viven en listas. Una variante puede tener precio en varias (la de la tienda, una oferta de temporada, uno puntual) y en varios escalones de cantidad. Al cotizar, entre los precios que valen para esa línea —lista activa y vigente en la fecha, misma moneda, min_qty no mayor que la cantidad— gana:
- El de la lista con más
prioridad. - A igual prioridad, por tipo de lista:
override, luegooferta, luegobase. - Luego el escalón más alto que aplica (
min_qty12 antes que 1 si compran 12). - Luego el monto más bajo.
- Fijar un precio añade otro; no reemplaza el anterior. Para cambiarlo, borra el viejo: si no, con el mismo escalón y en la misma lista gana el más bajo.
- Una variante sin precio vigente no se cobra a 0: sale en
no_cotizados. - Cada cotización trae
catalog_version, una huella de los precios, promociones y catálogo con que se calculó. Guárdala con el pedido. - Importes y cantidades viajan como texto decimal: «32000», «1.5».
Promociones
Una promoción es una regla: cuándo aplica (predicado) y cuánto descuenta (metodo). Se aplica sola en cada cotización que la cumple; cada descuento sale en el adjustments de su línea.
{
"nombre": "10 % de bienvenida",
"codigo": "BIENVENIDA",
"predicado": {
"op": "and",
"clauses": [
{ "field": "codigos_promo", "cmp": "contains", "value": "BIENVENIDA" },
{ "field": "subtotal", "cmp": "gte", "value": 50000 }
]
},
"metodo": { "metodo": "percentage", "target": "order", "valor": 10 }
}- El
codigoes solo una etiqueta. Para que la promoción pida el código, ponlo en el predicado como arriba, y manda en la cotización loscodigos_promoque escribió tu cliente. - El predicado mira
subtotal,cantidad_total,variant_ids,codigos_promoycanal. Vacío, aplica siempre. target: "item"rebaja líneas; si el predicado nombra variantes convariant_ids contains, solo esas.target: "order"rebaja el subtotal y se aplica después de las de línea.- Las de un mismo
grupo_exclusividadno se suman: aplica la de mayorprioridad. Las que no tienen grupo se suman todas. limite_usosy el presupuesto de una campaña solo avanzan cuando confirmas una venta declarandopromociones_aplicadas. Cotizar no gasta usos.- Una promoción no se edita ni se pausa por la API: para cambiarla o pararla, bórrala y, si hace falta, créala de nuevo.
Stock, reservas y ventas
- El stock es por variante y por bodega (texto vacío: la única). Disponible es
stocked − reserved, nunca menos de 0. - Fijar pone las existencias en absoluto; ajustar suma o resta. Subir un archivo o sincronizar con tu software contable fija, cruzando por SKU. El archivo necesita una columna de cantidad (cantidad, stock, existencias, disponible, inventario, unidades, saldo, qty) y una de SKU; admite también unidad, bodega y umbral (mínimo, reorden).
- Una reserva aparta unidades durante
ttl_ssegundos (por defecto 15 minutos). Al vencer, vuelven solas. - Confirmar la venta descuenta todo de una vez. Pasa el
reservation_iden la línea si la reservaste y unsale_refpor pedido: repetir la llamada no descuenta dos veces. - La disponibilidad responde
no_rastreadosi la variante no tiene stock cargado: no es un «no hay». Si tu negocio no controla stock, apágalo en la configuración. - Los cambios de precios, promociones y stock los usa Bentho en sus respuestas siguientes.
activa → liberada (DELETE inventory/reservations/{reserva})
→ consumida (venta con su reservation_id)
→ expirada (venció ttl_s; el stock vuelve solo)Rutas
| MÉTODO | RUTA | PARA QUÉ | PERMISO |
|---|---|---|---|
| CATÁLOGO | |||
| GET | /products/ | Los productos del espacio | lee |
| POST | /products/ | Crea un producto | escribe |
| GET | /products/{producto} | Un producto | lee |
| PATCH | /products/{producto} | Edita un producto | escribe |
| DEL | /products/{producto} | Borra un producto | escribe |
| POST | /products/{producto}/variants | Crea una variante | escribe |
| PATCH | /variants/{variante} | Edita una variante | escribe |
| DEL | /variants/{variante} | Borra una variante | escribe |
| GET | /product-types/ | Los tipos de producto | lee |
| POST | /product-types/ | Crea un tipo de producto | escribe |
| GET | /product-types/{tipo_producto} | Un tipo de producto | lee |
| DEL | /product-types/{tipo_producto} | Borra un tipo de producto | escribe |
| GET | /catalog/search | Busca en el catálogo | lee |
| GET | /catalog/context | Las fichas de unas variantes | lee |
| GET | /catalog/bundle-components | Los componentes de un combo | lee |
| IMPORTAR | |||
| POST | /catalog/import | Importa un catálogo desde un archivo | escribe |
| GET | /catalog/imports/ | Las importaciones | lee |
| GET | /catalog/imports/{importacion} | Una importación y sus filas | lee |
| DEL | /catalog/imports/{importacion}/rows/{fila} | Descarta una fila | escribe |
| POST | /catalog/imports/{importacion}/activate | Activa una importación | escribe |
| PRECIOS | |||
| GET | /price-lists | Las listas de precios | lee |
| POST | /price-lists | Crea una lista de precios | escribe |
| GET | /price-lists/{lista} | Una lista de precios | lee |
| PATCH | /price-lists/{lista} | Edita una lista de precios | escribe |
| DEL | /price-lists/{lista} | Borra una lista de precios | escribe |
| POST | /prices | Fija un precio | escribe |
| GET | /prices | Los precios | lee |
| DEL | /prices/{precio} | Borra un precio | escribe |
| POST | /price-quote | Cotiza un carrito | escribe |
| PROMOCIONES | |||
| GET | /promotions | Las promociones | lee |
| POST | /promotions | Crea una promoción | escribe |
| GET | /promotions/{promocion} | Una promoción | lee |
| DEL | /promotions/{promocion} | Borra una promoción | escribe |
| POST | /campaigns | Crea una campaña | escribe |
| STOCK | |||
| GET | /inventory/availability | La disponibilidad de una variante | lee |
| GET | /inventory/levels | El stock del espacio | lee |
| GET | /inventory/items/{variante} | El stock de una variante | lee |
| POST | /inventory/items | Fija el stock de una variante | escribe |
| PATCH | /inventory/items/{variante} | Ajusta el stock de una variante | escribe |
| DEL | /inventory/items/{variante} | Borra el stock de una variante | escribe |
| GET | /inventory/low-stock | El stock bajo | lee |
| GET | /inventory/summary | El resumen del stock | lee |
| GET | /inventory/suggest | Alternativas con stock | lee |
| GET | /inventory/export | Exporta el stock en CSV | lee |
| POST | /inventory/upload | Sube el stock desde un archivo | escribe |
| POST | /inventory/sync | Trae el stock de tu software contable | escribe |
| RESERVAS Y VENTAS | |||
| POST | /inventory/reservations | Reserva stock | escribe |
| GET | /inventory/reservations | Las reservas activas | lee |
| DEL | /inventory/reservations/{reserva} | Libera una reserva | escribe |
| POST | /inventory/sale | Confirma una venta | escribe |
| CONFIGURACIÓN | |||
| GET | /config | La configuración del módulo | lee |
| PATCH | /config | Cambia la configuración | escribe |