Combora — Manual de usuario
Guía completa de la app de packs y descuentos para Shopify: los 8 tipos de oferta, cada opción de configuración, lo que ve tu cliente en la tienda, y un anexo técnico para desarrolladores. Todas las capturas provienen de una tienda real durante la elaboración de este manual (agosto 2026).
1Qué es Combora
Combora crea packs (bundles) y ofertas automáticas en tu tienda Shopify: agrupa productos, aplica el descuento correcto en el carrito y el checkout, y muestra la oferta en tu tema con bloques listos para usar. Tú configuras la oferta en el admin; Combora se encarga de que el precio cobrado sea siempre exacto — el descuento lo calcula una Shopify Function en el propio checkout, no un script en el navegador.
Hay 8 tipos de pack. Esta tabla te ayuda a elegir:
| Tipo | Qué hace | Cuándo usarlo |
|---|---|---|
| Pack fijo | Un conjunto cerrado de productos con precio de pack o descuento. Crea un producto comprable de 1 clic en tu catálogo. | Kits y sets curados: "el dúo", "el kit de iniciación". |
| Combina y ahorra (mix & match) | El cliente elige N artículos de un grupo y recibe un descuento. | "Elige 3 camisetas y ahorra 20%". |
| Descuento por volumen | Niveles: cuanto más compra, más ahorra (2+ → 10%, 4+ → 20%…). | Subir unidades por pedido de un mismo producto o grupo. |
| Compra X, llévate Y (BOGO) | Al comprar X unidades, las siguientes Y salen con recompensa (gratis, % o precio fijo). | "Compra 2 y llévate 1 gratis". |
| Regalo por compra (GWP) | Añade un regalo gratis automáticamente cuando el carrito cumple una condición. | "Regalo sorpresa en pedidos de $50+". |
| Arma tu caja (build-a-box) | El cliente llena una caja de tamaño fijo; se cobra con descuento o a precio de caja. | Cajas de 4, 6, 12… snacks, velas, cervezas. |
| Complementos (FBT) | "Comprados juntos habitualmente": un producto principal sugiere añadidos con descuento. | Cross-sell en la ficha de producto. |
| Combo | Apila dos o más de las ofertas anteriores en un solo pack; dentro del combo sí se suman. | Campañas: "volumen + regalo a partir de $1,000". |
Si dudas entre tipos, la propia app trae una guía: en Crear pack, el enlace "¿No sabes cuál elegir?" abre un asistente, y cada tipo tiene un panel "Ver cómo funciona" con ejemplos.
2Primeros pasos
2.1 Qué crea la app al instalarse
Al instalar Combora no cambia nada visible en tu tienda. La app prepara en segundo plano las
estructuras de datos donde publicará tus packs (metaobjetos y metafields con el prefijo
combora — el detalle técnico está en el anexo para desarrolladores)
y un único descuento automático llamado "Combora" en Descuentos, que es el que aplica todos los
precios. No lo borres ni lo edites a mano: la app lo mantiene sola.
2.2 Activar el motor de regalos (app embed)
Si vas a usar Regalo por compra (o combos con regalo), activa el app embed Combora Gift: Tienda online → Personalizar → Configuración del tema → App embeds → Combora Gift. Es el componente que añade y retira el regalo del carrito automáticamente. Sin él, el descuento del regalo seguiría siendo correcto, pero el producto-regalo no se añadiría solo.
2.3 Añadir los bloques al tema
Cada tipo de pack se muestra en la tienda con un bloque de tema. Se añaden una sola vez en Tienda online → Personalizar, en la plantilla correspondiente:
| Bloque | Tipos que muestra | Dónde añadirlo |
|---|---|---|
| Combora bundle | Pack fijo y Combo ("Available bundles") | Plantilla de producto |
| Combora mix & match | Combina y ahorra · Arma tu caja | Plantilla de producto |
| Combora volume table | Volumen · Compra X llévate Y | Plantilla de producto |
| Combora complements | Complementos | Plantilla de producto (y carrito) |
| Combora gift offer | Regalo por compra (la oferta) | Plantilla de producto |
| Combora gift progress | Barra de progreso del regalo | Plantilla del carrito |
| Combora Gift (app embed) | El motor que añade/quita el regalo | App embeds (toda la tienda) |
No hace falta memorizarlo: el editor de cada pack incluye una tarjeta "Dónde aparece" que nombra el bloque correcto y un enlace "Ver en tu tema publicado" que abre el editor de temas con ese bloque ya preparado para insertarse en la plantilla adecuada.
3Tour de la app
La app vive en Apps → Combora y tiene seis pestañas:
Packs
La lista de todos tus packs: búsqueda por nombre, filtro por estado (Publicado / Borrador), acciones por fila (duplicar, publicar/pasar a borrador, eliminar) y selección múltiple con acciones masivas. Desde aquí se crea todo con Crear pack.
Analítica
Métricas de rendimiento de tus packs sobre pedidos reales: ingresos atribuidos, % de pedidos con pack, ahorro entregado, valor medio de pedido y un gráfico temporal. Detalle en la sección 16.
Planes
Tu plan actual y las opciones de upgrade. El plan Gratis permite 3 packs publicados simultáneamente; los planes de pago no tienen límite (sección 17).
Ayuda
Preguntas frecuentes y explicaciones de conceptos (arbitraje entre packs, regalos, bloques).
Diagnóstico (pestaña dentro de Ayuda)
El panel de salud y soporte vive como pestaña dentro de Ayuda (selector "Guías | Diagnóstico" arriba): chequeos en vivo de toda la instalación, el registro de eventos y el informe de soporte que copias cuando algo va mal (sección 18).
Chat de soporte (burbuja flotante)
En la esquina inferior derecha de todas las pantallas hay una burbuja de chat 💬 para hablar directamente con soporte: conversaciones por tema, historial, y aviso de si soporte está disponible o ausente. Solo se comparte lo que escribes — nunca datos de tus clientes.
Ajustes
Idioma de la app (7 idiomas), sincronización manual de descuentos y el acceso para desarrolladores.
4Anatomía del editor
Todos los tipos comparten el mismo editor; cambia solo la sección de productos y precio. Al crear un pack nuevo se ve así:
4.1 Datos básicos
- Nombre del pack
- Interno. Solo tú lo ves; sirve para encontrarlo en tu lista.
- Título en la tienda
- Lo que ve el cliente como nombre de la oferta en el carrito y el checkout. Es traducible. También es el texto de la línea de descuento (recortado a 100 caracteres).
- Texto de la etiqueta
- Una insignia corta opcional ("Mejor valor") que tu tema puede mostrar como destacado.
4.2 Programación
Fechas de inicio y fin opcionales. Vacías = la oferta se activa al publicar y no caduca. Un pack publicado fuera de su ventana deja de aplicar el descuento automáticamente y vuelve a aplicarlo al entrar en ventana, sin tocar nada.
4.3 Productos
Según el tipo, eliges productos concretos, variantes, una colección o toda la tienda. El selector de Shopify es el estándar:
4.4 Precio
Cada tipo tiene su propia sección (porcentaje, importe, precio fijo, niveles, recompensa…). Se documenta en el capítulo de cada tipo. En todos los casos el precio que se cobra lo calcula Shopify en el checkout con la configuración publicada: lo que muestran los bloques es informativo.
4.5 Suscripciones
Por defecto un cliente no puede comprar un artículo del pack como suscripción (protege el checkout de precios de suscripción mezclados con descuentos de pack). En los tipos donde tiene sentido (mix & match, arma tu caja y regalo por compra) hay un opt-in avanzado "Permitir suscripciones en este pack".
4.6 El rail derecho
- Estado + acción
- Publicar (o Actualizar pack si ya está publicado) y Pasar a borrador. Publicar pone la oferta en vivo; pasar a borrador la retira conservando toda la configuración.
- Modo prueba
- Marca "Publicar en modo prueba" para probar el pack sin riesgo: los bloques solo se muestran en el editor de temas y en las vistas previas (nunca en tu tema publicado), y el descuento solo se aplica a clientes con la etiqueta
combora-test. Para recorrer el checkout completo, añade esa etiqueta a tu propio cliente de pruebas (Admin → Clientes) e inicia sesión con él en la tienda. Cuando todo se vea bien, desmarca la casilla y pulsa Actualizar pack — pasa a en vivo. En la lista, un pack en prueba lleva la insignia Modo prueba. - Antes de publicar
- La checklist que bloquea la publicación hasta completar lo imprescindible (título, productos, precio…).
- Lo que ve tu cliente
- Vista previa del contenido de la oferta y el ahorro. El aspecto final depende de tu tema.
- Estilo de la vista previa
- Acento y radio de esquina — son los mismos ajustes que luego configuras en el bloque del tema.
- Dónde aparece
- El bloque de tema que muestra este tipo y el enlace directo al editor de temas.
4.7 Avisos que puede mostrar el editor
- Solapamiento: si los productos del pack ya están en otros packs publicados, un banner avisa: "En el checkout solo se aplica la mejor oferta por línea: los packs no se acumulan". No es un error — es información (ver sección 13).
- Sin ahorro / precio 0: si la configuración no produce ningún descuento (o produce un precio 0), el editor lo señala antes de publicar.
- Pool vacío: una colección sin productos elegibles también se avisa.
4.8 Editar un pack publicado
Al editar un pack publicado, los cambios no salen a la tienda hasta que pulses "Actualizar pack". Así puedes preparar cambios con calma. "Pasar a borrador" retira la oferta de la tienda al momento; volver a publicar la restaura tal cual.
5Pack fijo
Un conjunto cerrado de productos que se vende como una unidad. Es el único tipo que además crea un producto comprable de 1 clic en tu catálogo: un producto "padre" (bundle nativo de Shopify) cuyos componentes se expanden automáticamente en el checkout.
5.1 Configuración
- Productos: añade los componentes (variantes concretas) y la cantidad de cada uno. Máximo 30 componentes por pack.
- Precio — dos modos excluyentes:
- Precio fijo del pack: escribes el precio total (p. ej. $1,349.95). El ahorro se calcula contra la suma de los componentes.
- Aplicar un descuento: porcentaje o importe sobre la suma de los componentes.
- Publica. Al publicar, Combora crea (o actualiza) el producto padre en tu catálogo.
5.2 Qué ve tu cliente
5.3 Detalles y limitaciones del tipo
- Los componentes deben ser variantes con stock; el producto padre hereda la disponibilidad.
- El producto padre se gestiona solo: al pasar a borrador o eliminar el pack, se retira de la tienda (verificado durante este manual). No lo borres a mano.
- Máximo 30 componentes. El precio fijo se reparte entre componentes con redondeo exacto (la suma de las partes siempre iguala el total).
- El pack fijo también aplica si el cliente añade los componentes por separado en las cantidades exactas — el checkout agrupa y descuenta igual.
6Combina y ahorra (mix & match)
El cliente elige al menos N artículos de un grupo y todo el grupo sale con descuento.
6.1 Configuración
- Productos: el grupo elegible puede ser variantes específicas, productos, una colección (se actualiza sola) o toda la tienda.
- Cantidad: el mínimo de artículos para calificar, y opcionalmente un máximo (por encima del máximo, los artículos extra se pagan a precio normal).
- Descuento: porcentaje o importe, aplicado a todos los artículos elegibles del carrito cuando se alcanza el mínimo.
6.2 Qué ve tu cliente
6.3 Detalles del tipo
- Un carrito por debajo del mínimo no se bloquea: el cliente paga precio completo hasta calificar.
- Con máximo definido, el selector bloquea marcar más casillas al llegar al tope, y en el carrito solo las primeras unidades hasta el máximo reciben descuento.
- Las cantidades cuentan por unidades: 3 unidades de un mismo producto elegible también califican un mínimo de 3.
7Descuento por volumen
Niveles de precio por cantidad: "compra al menos 2 → 10%, al menos 4 → 20%". La cantidad total de artículos elegibles en el carrito decide el nivel, y el descuento del nivel alcanzado se aplica a todos ellos.
7.1 Configuración
- Productos: variantes, productos, colección o toda la tienda (igual que mix).
- Niveles: cada nivel es "Compra al menos N" + descuento (porcentaje o importe). Añade tantos como quieras con "Agregar nivel".
7.2 Qué ve tu cliente
7.3 Detalles del tipo
- Solo aplica el nivel más alto alcanzado (no se suman niveles).
- Los niveles pueden mezclar tipos de valor (unos %, otros importe).
- El importe fijo de descuento se reparte entre las líneas de forma proporcional y exacta.
8Compra X, llévate Y (BOGO)
Al comprar X unidades, las siguientes Y unidades salen con recompensa. La recompensa puede ser gratis (100%), un porcentaje, un importe de descuento o un precio fijo por unidad.
8.1 Configuración
8.2 Qué ve tu cliente
8.3 Detalles del tipo
- La oferta se repite por bloques completos: con "2+1", 6 unidades = 2 gratis; 5 unidades = 1 gratis.
- El bloque de tema que la muestra es Combora volume table (presenta el "compra X, llévate Y" como una tabla de ahorro).
- La recompensa "precio fijo" cobra ese precio exacto por cada unidad recompensada.
9Regalo por compra (GWP)
Añade un producto de regalo (a $0.00) automáticamente cuando el carrito cumple la condición, y lo retira si deja de cumplirla. Es el tipo con más automatismo: el app embed Combora Gift gestiona el regalo sin que el cliente haga nada.
9.1 Configuración
- El regalo: una variante concreta que se agrega cuando el cliente califica.
- Condición para desbloquear — cuatro opciones:
- Por gasto mínimo: el carrito alcanza un importe (p. ej. $50).
- Por cantidad de productos: alcanza N unidades.
- Gasto y cantidad (ambas): se exigen las dos.
- Por llevar una combinación de productos: una lista concreta (de 2 a 5 artículos con sus cantidades) que debe estar completa en el carrito.
- Qué cuenta para la condición: cualquier producto de la tienda, productos específicos o colecciones.
9.2 Qué ve tu cliente
9.3 Detalles y protecciones del tipo
- El propio regalo no cuenta para el gasto que califica.
- Si el cliente elimina el regalo a mano, la app lo respeta y no lo vuelve a añadir en esa sesión.
- Si el regalo se queda sin stock, la oferta simplemente no lo añade (no bloquea la compra).
- Protección anticobro: una validación en el checkout impide pagar un regalo que figura como regalo pero llegó con precio — el comprador nunca paga por error un artículo marcado de regalo. La validación actúa solo en el checkout, nunca mientras se navega.
- Cuando "qué cuenta" son colecciones, la barra de progreso del carrito no puede predecir la pertenencia desde el navegador y no se muestra para esa oferta; el regalo y el precio siguen siendo correctos (los decide el servidor).
10Arma tu caja (build-a-box)
El cliente llena una caja de tamaño fijo (p. ej. 3 artículos) con lo que elija de un grupo. Cada caja completa se cobra con descuento o a un precio de caja cerrado.
10.1 Configuración
10.2 Qué ve tu cliente
Usa el mismo bloque Combora mix & match y el mismo selector con contador que la sección 6: "selecciona 3", contador de progreso, CTA con cantidad. La diferencia es la matemática: aquí las cajas se cobran por caja completa — con caja de 3, seis artículos son dos cajas; siete artículos son dos cajas y un artículo a precio normal.
10.3 Detalles del tipo
- Grupo elegible: variantes, productos, colección o toda la tienda (el selector visual solo con variantes específicas, como en mix).
- El precio de caja se reparte entre los artículos de forma exacta; con monedas sin decimales (JPY) o con tres decimales (BHD) el reparto respeta la moneda.
- Admite el opt-in de suscripciones (apartado 4.5).
11Complementos (comprados juntos habitualmente)
Un producto principal sugiere productos complementarios; si el cliente se lleva el conjunto, recibe un descuento. Es el clásico "frequently bought together" de la ficha de producto.
11.1 Configuración
11.2 Qué ve tu cliente
11.3 Detalles del tipo
- El descuento se aplica cuando el principal y al menos un complemento están en el carrito; cubre las líneas del conjunto.
- El bloque también puede añadirse a la plantilla del carrito como último empujón de cross-sell.
- Los complementos agotados aparecen deshabilitados con su aviso, nunca se pre-marcan.
12Combo
El tipo avanzado: apila dos o más subofertas (de cualquiera de los otros tipos) en un solo pack. La diferencia clave con publicar packs separados: dentro de un combo las subofertas se suman — el cliente puede recibir el descuento por volumen y el regalo a la vez.
12.1 Configuración
12.2 Qué ve tu cliente
En el carrito, cada parte del combo actúa con su propia etiqueta: el descuento de volumen en sus líneas y el regalo auto-añadido a $0.00 (visible en la captura de la sección 13).
12.3 Detalles del tipo
- Las subofertas se suman dentro del combo, pero el combo compite como un todo contra los demás packs por la regla de la mejor oferta por línea.
- El regalo de una suboferta GWP usa el mismo motor auto-add que el tipo regalo.
- Límite de tamaño: el conjunto aplanado de productos del combo no puede superar 50 entradas (el editor lo muestra: "Usa X de 50").
13Combinar packs entre sí
Puedes publicar tantos packs como tu plan permita, incluso sobre los mismos productos. Las reglas de convivencia son fijas y predecibles:
- La mejor oferta por línea. Para cada artículo del carrito, Shopify aplica la oferta que más le descuenta a ese artículo. Nunca se suman dos packs sobre la misma línea.
- Packs distintos pueden convivir en el mismo carrito — cada uno sobre sus líneas. Un descuento mix en las tablas y un regalo por gasto pueden aplicarse a la vez porque actúan sobre líneas distintas.
- En empate, gana el pack más antiguo (el primero que creaste).
- La excepción es el combo: sus subofertas sí se suman entre ellas (sección 12).
Ejemplo numérico real (verificado en la tienda)
| Carrito | Ofertas candidatas | Resultado |
|---|---|---|
| 3 × Multi-managed ($629.95) | BOGO 2+1 gratis | $1,889.85 → $1,259.90 (una unidad gratis) |
| 4 × Oxygen ($1,025.00) | Volumen 4+ → 20% | $4,100.00 → $3,280.00 |
| 3 tablas elegibles + regalos | Mix 20% + combo (regalo) + GWP (regalo) | Las tres conviven: cada una en sus líneas |
14Creación masiva
Desde la galería de Crear pack hay dos flujos para crear muchos packs de golpe. Ambos crean borradores: nada sale a la tienda hasta que revisas y publicas.
14.1 Generar desde una colección
- Elige la colección.
- Elige la plantilla: "Un multipack por cada producto" (un pack fijo de N unidades por cada producto) o "Un solo pack para toda la colección".
- Configura unidades y descuento, y pulsa Crear borradores.
14.2 Importar desde un CSV
Para catálogos grandes o para migrar de otra app. La página incluye la referencia completa del formato, una plantilla descargable con un ejemplo por tipo y un botón de exportación (baja todos tus packs en el mismo formato, listo para reimportar en otra tienda).
type, title, discount_kind, discount_value, components, collection, min_qty, min_items, slots, buy_qty, get_qty.
Se puede subir un archivo o pegar el CSV directamente.- Tipos importables:
fixed,volume,mix_and_match,build_a_box,bogo(los tipos con regalo/ancla/subofertas se crean en el editor). - Referencias por handle de producto/colección o por GID de Shopify.
- En
components(solo fixed):handle:cantidadseparados por|. - Hasta 200 filas por importación; un archivo mayor se recorta y lo avisa.
15Gestión diaria
15.1 La lista
Búsqueda por nombre, filtro por estado y, en cada fila: Duplicar (crea una copia en borrador), Publicar / Pasar a borrador y Eliminar. La fecha de cada fila es la última actualización (tooltip al pasar el cursor).
15.2 Acciones masivas
15.3 Ciclo de vida de un pack
- Borrador
- Invisible para la tienda. Se puede editar sin límite.
- Publicado
- Oferta activa (dentro de su ventana de programación). Editar no cambia nada en vivo hasta pulsar Actualizar pack.
- Pasar a borrador
- Retira la oferta al momento; la configuración se conserva íntegra para republicar.
- Eliminar
- Borra el pack y retira su descuento (y el producto padre, si era un pack fijo). No se puede deshacer. La analítica de pedidos pasados se conserva.
16Analítica
| Métrica | Qué mide exactamente |
|---|---|
| Ingresos atribuidos | Los ingresos de las líneas de pedido que llevaron descuento de Combora (no el total del pedido). |
| % de pedidos con pack | Porcentaje de los pedidos del rango que incluyeron al menos un pack. |
| Pedidos con pack | La fracción literal: pedidos con pack / pedidos totales. |
| Ahorro entregado | El descuento total que tus packs dieron a los clientes. |
| Valor medio del pedido | Sobre todos los pedidos del rango. |
| Valor del pedido con pack | El promedio solo de los pedidos que llevaron pack — compáralo con el anterior para ver el efecto de tus ofertas. |
| Pedidos con regalo | Pedidos que incluyeron un regalo gratis (GWP o combo). |
El gráfico "Pedidos con pack en el tiempo" muestra una barra por día del rango, con el valor impreso sobre las barras con datos y tooltip por barra.
17Ajustes y planes
17.1 Ajustes
- Idioma de la app: 7 idiomas (inglés, español, francés, alemán, italiano, portugués, neerlandés). Afecta al admin; lo que ve tu cliente sigue el idioma de tu tema/mercado.
- Sincronizar descuentos: re-publica el estado de todos los packs hacia Shopify y limpia descuentos antiguos. Úsalo si sospechas que algo quedó desalineado (p. ej. tras restaurar un tema). Si no había nada que arreglar, lo dice: "Todo estaba ya al día."
- Acceso para desarrolladores: los datos públicos que tu tema puede leer (anexo 20). La documentación in-app del contrato es parte del plan Plus.
17.2 Planes
Precios planos: nunca cobramos un porcentaje de tus ventas, y el precio no depende de tu plan de Shopify — una tienda Basic y una Plus pagan lo mismo.
- Gratis ($0/mes): hasta 3 packs publicados a la vez (los borradores no cuentan) con los 8 tipos incluidos. Al intentar publicar el 4º, la app lo bloquea con el aviso correspondiente: pasa otro a borrador o mejora el plan. En el plan gratis, los bloques muestran una insignia discreta "Powered by Combora".
- Pro ($14.99/mes): packs publicados ilimitados y sin insignia.
- Plus ($39.99/mes): todo lo de Pro, más soporte prioritario, importación/exportación CSV masiva (hasta 200 packs por archivo) y el acceso para desarrolladores (documentación del contrato para storefronts headless y a medida).
La facturación va por Shopify (Managed Pricing) — se gestiona y cancela desde la propia página de Planes. Las tiendas fundadoras (las primeras 100 instalaciones) conservan el producto completo gratis para siempre.
18Diagnóstico y soporte
Diagnóstico (la segunda pestaña de Ayuda) es tu primera parada cuando algo no cuadra — y lo que soporte te pedirá si abres un ticket. Combora registra automáticamente, por tienda, todo lo que falla por debajo (en el servidor y en tu tienda online) aunque el cliente nunca lo vea, y este panel lo pone a tu alcance. No guarda ningún dato de tus clientes.
18.1 Chequeos de salud
El estado en vivo de lo que soporte pregunta primero, verificado contra Shopify en cada carga:
| Chequeo | Qué verifica |
|---|---|
| Packs | Errores de sincronización y packs publicados con cambios sin publicar (editaste y no pulsaste "Actualizar pack"). |
| Descuento automático en Shopify | Que el descuento "Combora" existe y está ACTIVO — es el que cobra los precios en el checkout. |
| Índice publicado de la tienda | Que los datos públicos que leen los bloques del tema están al día (packs en vivo vs. esperados). |
| App embed Combora Gift | Que el motor del regalo está activado en tu tema. |
| Descuento aplicado en pedidos recientes | Pedidos de los últimos 7 días con pack: si TODOS llegaran sin descuento, algo falla en el checkout. |
| Canal de errores de la tienda | Que los bloques de tu tienda pueden reportar fallos aquí (fecha del último evento recibido). |
| Tareas en segundo plano | Trabajos nocturnos fallidos. |
18.2 Registro de eventos
Cada entrada es algo que pasó y quedó guardado: un fallo al publicar, un regalo que Shopify rechazó añadir (con el motivo exacto), un descuento que colisionó con otro, un webhook que falló… Filtra por nivel (Info = esperado pero relevante, como el límite del plan; Aviso; Error) y por área (publicación, descuentos, plan y facturación, tienda, sincronización…). Un registro vacío es buena señal: solo se llena cuando algo va mal. Los eventos se conservan 30 días.
18.3 El informe de soporte
Un único documento con todo lo que hace falta para diagnosticar tu tienda de una pasada: los chequeos de salud, tu plan y configuración (sin datos sensibles), el estado de publicación de cada pack y los últimos eventos. Cuando contactes con soporte, pulsa Copiar informe (o Descargar como archivo) y adjúntalo al ticket — con eso, quien te atiende ve exactamente lo que pasó sin pedirte capturas ni accesos.
- El informe no incluye datos de clientes ni claves: solo salud, configuración de packs y eventos técnicos.
- Si el botón de copiar no funciona en tu navegador, el texto queda seleccionado — pulsa Ctrl+C (Cmd+C en Mac) — o usa la descarga.
/apps/combora/log (App Proxy firmado por Shopify). Es un canal interno de soporte con
catálogo cerrado de códigos y límite diario — no es parte del contrato público del
anexo 21.19Limitaciones y reglas importantes
La referencia única de límites, verificados contra el código de la app:
| Límite / regla | Valor | Qué pasa al tocarlo |
|---|---|---|
| Packs publicados (plan Gratis) | 3 | La publicación del 4º se bloquea con aviso. Los borradores no cuentan. |
| Componentes de un pack fijo | 30 | El editor no deja añadir más. |
| Productos de un combo (aplanados) | 50 entradas | El editor muestra el consumo ("Usa X de 50") y bloquea el exceso. |
| Colecciones por selector | 100 | Validación al guardar. |
| Combinación del regalo (GWP) | 2–5 artículos | Validación al guardar. |
| Título como mensaje de descuento | 100 caracteres | Se recorta el texto mostrado en el checkout (el título completo se conserva). |
| Generar desde colección | 100 borradores | Se recorta y lo avisa. |
| Importación CSV | 200 filas | Se recorta y lo avisa para dividir el archivo. |
| Ofertas visibles por bloque | 1–8 (por defecto 3) | Ajustable en cada bloque del tema; prioriza las ofertas que declaran precio/ahorro. |
| Configuración total publicada | ≈9,9 KB | Con muchísimos packs enormes a la vez, los más nuevos quedarían publicados sin precio activo hasta liberar espacio (caso extremo; la app prioriza los packs más antiguos). |
Reglas de dinero (siempre exactas)
- Los porcentajes truncan hacia abajo el descuento (nunca se redondea a favor de cobrar de más).
- Los importes y precios fijos se reparten entre líneas con resto exacto: la suma de las partes siempre iguala el total.
- Los decimales dependen de la moneda de la tienda (JPY sin decimales, BHD con tres…) — nunca se asume "2 decimales".
- El precio cobrado lo calcula Shopify en el checkout con la configuración publicada. Lo que muestran los bloques del tema es informativo.
Otras reglas
- Las suscripciones están bloqueadas en líneas de pack salvo opt-in explícito (apartado 4.5).
- El regalo de un GWP no se anuncia en la ficha del propio producto-regalo (un premio no es un gancho).
- Los packs publicados fuera de su ventana de programación no aplican descuento (se reactivan solos).
20Solución de problemas
- No veo la oferta en la tienda
- ① ¿El pack está Publicado (no borrador) y dentro de su ventana de fechas? ② ¿Añadiste el bloque correcto a la plantilla (tarjeta "Dónde aparece" del editor)? ③ Si editaste un pack publicado, ¿pulsaste Actualizar pack?
- El regalo no se añade solo
- ① ¿Está activado el app embed Combora Gift? ② ¿El carrito cumple la condición contando solo lo que califica (el regalo no cuenta)? ③ ¿El cliente lo quitó a mano en esta sesión? ④ ¿El regalo tiene stock?
- El descuento del carrito no coincide con lo que esperaba
- Recuerda la regla: solo la mejor oferta por línea. Si dos packs compiten por el mismo artículo, gana el que más descuenta (y en empate, el más antiguo). Las sumas solo ocurren dentro de un combo.
- Publiqué y dice "límite del plan"
- El plan Gratis permite 3 packs publicados a la vez. Pasa otro a borrador o mejora el plan.
- La barra de progreso del regalo no aparece
- Se muestra en la plantilla del carrito (bloque Combora gift progress) y solo para ofertas cuyo criterio puede evaluarse en el navegador; con "qué cuenta = colecciones" no se muestra, aunque el regalo funciona igual.
- El selector de casillas no aparece en mix / caja
- Solo se pinta cuando el grupo elegible son variantes específicas. Con colección o toda la tienda, el cliente añade productos con normalidad y el descuento entra al calificar.
- Errores al importar CSV
- Cada fila fallida se lista con su motivo. Corrige esas filas y vuelve a ejecutar solo con ellas — las filas buenas ya se crearon.
- Sospecho que un descuento quedó "huérfano"
- Ajustes → Sincronizar descuentos repara el estado. Nunca edites a mano el descuento "Combora" en la sección Descuentos de Shopify.
21Anexo para desarrolladores: el contrato público
Combora publica los datos de tus packs en tu tienda como metaobjetos y metafields con el
namespace combora, con lectura pública desde el storefront. Cualquier desarrollador
puede construir una UI 100% propia leyendo estos datos desde Liquid o la Storefront API — sin llamar a
ninguna API de la app. Este contrato es versionado y solo-aditivo (versión actual:
public.v1): los campos existentes nunca se renombran ni se retipan.
20.1 Qué se crea al instalar
La instalación aprovisiona las definiciones (los "esquemas") — visibles en Configuración → Metafields y metaobjetos y en Contenido → Metaobjetos:
- Metaobjetos:
combora_bundle(el pack),combora_component(cada línea de componente) ycombora_tier(cada nivel de volumen/umbral). Los tres con acceso storefrontPUBLIC_READ, publicables y traducibles. - Metafields de tienda:
combora.indexycombora.manifest(JSON, lectura pública). - Metafield de producto:
combora.bundles(list.metaobject_reference→combora_bundle) — el índice inverso producto → sus packs.
20.2 Qué pasa al publicar / actualizar / retirar
| Evento | Efecto en el contrato |
|---|---|
| Publicar un pack | Se crean/actualizan sus metaobjetos (hijos primero, padre después, con handles deterministas), se escribe el metafield combora.bundles de cada producto participante, se siembran las traducciones de los campos traducibles en los 7 idiomas, y al final se regeneran combora.index y combora.manifest. El índice nunca anuncia un pack cuya escritura falló. |
| Actualizar pack | Re-sincronización idempotente controlada por revisión: solo escribe lo que cambió. Un componente eliminado se desengancha del padre antes de borrarse (el storefront nunca ve una referencia colgante). |
| Pasar a borrador | El metaobjeto pasa a estado draft (deja de resolverse en storefront), el pack sale del índice y su precio se apaga. La configuración se conserva. |
| Eliminar | Se borran sus metaobjetos, se limpia combora.bundles en sus productos y, si era un pack fijo, se retira el producto padre. |
| Desinstalar la app | Los metaobjetos y metafields combora son propiedad de la tienda y permanecen (tu tema no se rompe; los datos quedan congelados en su último estado). Los metafields privados $app:* los elimina Shopify automáticamente y el descuento "Combora" queda inerte. Al reinstalar, la app reutiliza y reconcilia todo — no se duplica nada. |
20.3 combora_bundle campo a campo
| Campo | Tipo | Traducible | Contenido |
|---|---|---|---|
title | texto | sí | Título en tienda (requerido). |
description | rich text | sí | Descripción con formato (opcional). |
badge_label | texto | sí | La etiqueta ("Mejor valor"). |
cta_label | texto | sí | Texto del botón (opcional). |
disclaimer | rich text | sí | Condiciones (opcional). |
bundle_type | texto (choices) | no | Uno de: fixed · mix_and_match · volume · bogo · gwp · build_a_box · fbt · combo. |
min_items / max_items | entero | no | Mix (mín/máx) y arma-tu-caja (tamaño en min_items). |
threshold | entero | no | Umbral del GWP en unidades menores (centavos). |
discount_value | json | no | {"kind":"percentage","bps":1500} (basis points: 1500 = 15%) o {"kind":"fixed_amount","amount":500} (unidades menores). |
config | json | no | Escalares por tipo: price (fixed en modo precio), buy_qty/get_qty (bogo), gift_variant/combination/qualify (gwp), slots/box_price (caja), anchor_variant (fbt), eligible (descriptor del pool), of (combo). |
components | lista de referencias | — | → combora_component (variant, quantity, role: component/option/anchor/gift/suggestion, position, label…). |
tiers | lista de referencias | — | → combora_tier (min_qty, discount_value, position, tier_label…). |
product | referencia a producto | no | Producto ancla (el padre del fixed, el principal del FBT). |
revision / contract_version | entero / texto | no | Revisión publicada y versión del contrato (public.v1). |
combora_bundle en Contenido → Metaobjetos: título,
estado Active, handle determinista combora-bundle-{id}.
discount_value como JSON en basis points, las referencias a
componentes, el producto ancla y contract_version = public.v1.20.4 El descriptor eligible
Cuando el pool de un pack no enumera variantes (colección o toda la tienda), config
lleva un descriptor con la misma forma en todos los tipos:
{ "mode": "all" | "products" | "collections" | "variants",
"variants": ["gid://shopify/ProductVariant/…"],
"products": ["gid://shopify/Product/…"],
"collections":["gid://shopify/Collection/…"] }
Ojo: los hijos role:"option" de un pool por colección son una foto tomada al
publicar; la pertenencia viva (y el precio) la resuelve siempre la Function en el checkout.
20.5 combora.index y combora.manifest
shop.metafields.combora.index — la tabla de ruteo de packs publicados (existe para que
nunca tengas que iterar metaobjects.combora_bundle.values, que Liquid recorta a 50
en silencio):
{ "schema": 1, "revision_highwater": 128, "generated_at": "…",
"bundles": [
{ "id": 8123, "handle": "combora-bundle-8123", "type": "fixed",
"gid": "gid://shopify/Metaobject/…", "status": "active", "revision": 42 }
] }
shop.metafields.combora.manifest — el descriptor del contrato que una herramienta lee
una vez: contract_version, contadores y los GIDs de las tres definiciones.
20.6 Leerlo desde Liquid
{%- comment -%} En una ficha de producto: los packs de ESTE producto {%- endcomment -%}
{%- for bundle in product.metafields.combora.bundles.value -%}
<h3>{{ bundle.title.value | escape }}</h3>
{%- if bundle.badge_label.value != blank -%}
<span class="badge">{{ bundle.badge_label.value | escape }}</span>
{%- endif -%}
<ul>
{%- for component in bundle.components.value -%}
<li>{{ component.quantity.value }}× {{ component.label.value | escape }}</li>
{%- endfor -%}
</ul>
{%- endfor -%}
{%- comment -%} O por handle directo, en cualquier plantilla {%- endcomment -%}
{%- assign bundle = metaobjects.combora_bundle['combora-bundle-8123'] -%}
Ambas rutas son lecturas acotadas (lista propia del producto o handle directo) — jamás el
.values global.
20.7 Leerlo desde la Storefront API (localizado)
query BundleByHandle @inContext(language: FR) {
metaobject(handle: { type: "combora_bundle", handle: "combora-bundle-8123" }) {
title: field(key: "title") { value }
badge_label: field(key: "badge_label") { value }
components: field(key: "components") {
references(first: 25) {
nodes { ... on Metaobject {
label: field(key: "label") { value }
quantity: field(key: "quantity") { value }
} }
}
}
}
}
@inContext devuelve las traducciones sembradas por la app; lo no traducido cae al
idioma base automáticamente.
20.8 Usos posibles
- UI de bundle 100% a medida en el tema, sin los bloques de Combora, leyendo título, badge, componentes y ahorro del metaobjeto.
- Landing de campañas: una página que lista los packs activos desde
combora.indexy pinta cada uno por handle. - Headless / Hydrogen: misma lectura vía Storefront API con localización por mercado.
- Integraciones (feeds, apps de recomendación): el
manifestdeclara la versión del contrato y dónde está todo.
20.9 Reglas para el desarrollador
- El precio es de la Function. Los campos del metaobjeto son display: no sumes
discount_valuede un combo ni recalcules precios en el tema — el checkout manda. - Solo-aditivo: pueden aparecer campos nuevos; los existentes no cambian. Programa lecturas tolerantes a campos desconocidos.
- Combos: agrupa los hijos por
positiondividido entre 1000 (cada suboferta ocupa un tramo de 1000) o porconfig.of[].index— nunca porrole, que puede repetirse. - Privado ≠ contrato: los metafields
$app:runtime,$app:fnvarsy$app:validationdel descuento son internos de las Functions, sin acceso storefront, y su forma puede cambiar sin aviso. No construyas sobre ellos. - El detalle exhaustivo (definiciones JSON, semántica del sync, decisiones congeladas) está en
docs/CONTRATO-PUBLICO.mddel repositorio.
22Registro de incidencias de esta edición
Durante la elaboración del manual se probó cada flujo en una tienda real. Todo lo documentado arriba refleja el comportamiento verificado. Se detectaron dos desviaciones, anotadas aquí y pendientes de corrección (el manual describe el comportamiento correcto previsto):
| # | Hallazgo | Impacto | Estado |
|---|---|---|---|
| I-01 | La barra de progreso del regalo (y el auto-add) excluyen del gasto que califica las líneas pagadas de un producto que casualmente es la variante-regalo de otra oferta. El cálculo de precios del checkout solo excluye el regalo de la propia oferta, así que en ese caso el progreso mostrado puede quedarse corto respecto al descuento real. | Caso borde: solo si un cliente compra (pagando) un producto que es regalo de otra oferta activa. El precio cobrado siempre es correcto; lo afectado es la predicción visual/auto-add. | Corregida: el pool calificante ahora excluye solo las líneas auto-regalo y la variante-regalo
de la propia oferta (paridad con el cálculo del checkout). Activa en la tienda tras el siguiente
shopify app deploy. |
| I-02 | En la importación CSV con el admin en español, el detalle de algunos errores por fila llega en inglés ("percentage \"250\" exceeds 100") dentro de la frase localizada. | Cosmético. | Corregida: los motivos del descuento inválido son ahora códigos traducidos en los 7 idiomas (y "archivo vacío" / "cabecera incompleta" también). |
Manual elaborado y verificado el 15 de agosto de 2026 sobre la
tienda de desarrollo app-bundle-6pofnlbj, con compras de prueba reales (pasarela Bogus).
Las capturas están en docs/manual/img/.