Códigos de cupón
Un programa de cupones es una receta que configuras una vez - por ejemplo "Bienvenida 10%: 10% de descuento, gasto mínimo 50, válido 14 días desde el envío, un uso". Cada vez que una campaña o un recorrido necesita un código para una persona, Joryio emite uno del programa: crea un código único de un solo uso en tu tienda WooCommerce, Shopify, Magento o PrestaShop conectada y lo pone en el mensaje. Cuando la persona compra con él, la sincronización de pedidos reconoce el código, lo marca como canjeado y atribuye los ingresos al mensaje que lo emitió.
Los códigos son gratuitos - emitirlos no se factura.
Crear un programa
Abre E-Commerce → Coupons y selecciona New program. Selecciona la fila de un programa para abrir su informe.
| Campo | Para qué sirve |
|---|---|
| Nombre | Una etiqueta para tu equipo, por ejemplo "Bienvenida 10%". |
| Slug | El identificador que usas en los mensajes: {{ coupons.<slug>.code }}. Minúsculas, dígitos y guiones bajos; se rellena a partir del nombre. |
| Tienda | La tienda WooCommerce, Shopify, Magento o PrestaShop conectada donde se crean los códigos. O Sin tienda - Joryio genera y sigue los códigos, y tú los aplicas en tu propio checkout, TPV o app. Los canjes se reconocen entonces a partir de los pedidos enviados por la API de pedidos. |
Un programa nuevo empieza como borrador. Actívalo con Activar en la página del programa (o en el menú de la fila en la lista); Pausar lo detiene de nuevo. Solo un programa activo emite códigos; los programas en pausa y archivados no emiten nada, y el mensaje sigue la alternativa del programa.
Ajustes del descuento
| Ajuste | Opciones |
|---|---|
| Tipo de descuento | Porcentaje, importe fijo sobre el carrito, importe fijo sobre cada producto (no en PrestaShop), o envío gratis. |
| Importe | El porcentaje o el importe en la moneda de la tienda (no se usa con envío gratis). |
| Gasto mínimo | Subtotal opcional que el pedido debe alcanzar. |
| Cantidad mínima | Opcional, solo Shopify. |
| Se aplica a | Todo el carrito, o productos elegidos (WooCommerce, Shopify, PrestaShop), categorías (WooCommerce, Magento, PrestaShop) o colecciones (Shopify). Elegir productos no está disponible en Magento en esta versión. |
| Excluir artículos en oferta | Solo WooCommerce. |
| Usos por código | Por defecto 1 (un solo uso). |
| Una vez por cliente | Activado por defecto: un cliente no puede usar códigos de este programa dos veces. |
| Caducidad | Ninguna, una fecha fija, o N horas / días después de emitir el código - con opción de redondear al final de ese día en la zona horaria del espacio de trabajo. |
| Combinable | Desactivado por defecto: el código no se puede usar junto con otros descuentos. |
| Formato del código | Longitud 6-20, juego de caracteres (letras y dígitos sin caracteres parecidos como 0, O, 1, I y L - el predeterminado; solo letras; solo dígitos), prefijo (WELCOME-), sufijo y un separador cada N caracteres. |
| Reutilizar el código abierto de la persona | Activado por defecto: quien todavía tiene un código abierto (sin canjear ni caducar) de este programa recibe ese mismo código en lugar de uno nuevo. |
| Bloquear a la persona | WooCommerce, Magento y PrestaShop - consulta Bloquear a la persona. |
No se ofrece un tope de porcentaje ("15%, como máximo 50"): ninguna de las tiendas lo admite de forma nativa.
Bloquear a la persona
Por defecto cada código es único y de un solo uso, así que un código reenviado cuesta como mucho un descuento. En WooCommerce, Magento y PrestaShop también puedes bloquear cada código a la persona a la que se envió: la tienda lo rechaza para cualquier otra persona.
- WooCommerce usa la restricción de email del propio cupón.
- Magento necesita la extensión Joryio Connect 1.2.0 o posterior, que comprueba el código contra la persona en el checkout. Una tienda Magento sin ella recibe códigos de un solo uso sin bloquear, y una caducidad por código (N horas / días después de emitirlo) se aplica con Joryio borrando el código en la hora siguiente a su caducidad - igual que en Shopify.
- PrestaShop (módulo de Joryio 1.1.0 o posterior) bloquea el código a la cuenta de cliente de la persona en la tienda (el cliente de la regla de carrito): tiene que iniciar sesión para usarlo. Una persona sin cuenta registrada en la tienda, o con dos cuentas con el mismo email, no recibe código - la emisión falla y se aplica la alternativa del programa.
- Shopify: el interruptor no se muestra. Shopify decide quién puede usar un descuento para todo el descuento, no por código, así que cada código de Shopify es único, de un solo uso y con un uso por cliente.
Un código personal para un invitado
Un invitado que abre el enlace para aplicar de un código bloqueado lo recibe así:
- WooCommerce (plugin de Joryio 1.6.29 o posterior): el código espera en la sesión del comprador y se aplica en cuanto se conoce su email y es aquel al que se envió - al momento para un cliente con sesión iniciada, y para un invitado cuando escribe su email en el checkout (checkout de bloques y clásico), como muy tarde al realizar el pedido. Hasta entonces el carrito y el checkout dicen "Your code ... is personal: it will be applied at checkout when you enter the email address it was sent to." Otro email recibe "The code ... belongs to another customer, so it was not applied" - nunca dice de quién - y ningún descuento; corregir el email lo aplica. WooCommerce comprueba el email por sí mismo al aplicar el código y en el pedido, así que un email equivocado nunca obtiene el descuento. Plugins anteriores: WooCommerce rechazaba el código mientras no conocía el email ("Please enter a valid email at checkout to use coupon code ...") y no lo volvía a intentar.
- Magento (extensión 1.2.0 o posterior): el código se aplica al carrito del invitado y muestra su descuento; la extensión lo comprueba contra el email al realizar el pedido y rechaza otro email ("This coupon code was sent to another customer").
- PrestaShop: el código pertenece a una cuenta de cliente, así que se pide al invitado que inicie sesión primero y vuelve al carrito con el código.
- Shopify: los códigos no se bloquean, así que un invitado usa el código como cualquier otra persona.
Cuando no se puede emitir un código
Si la tienda no puede crear un código (no responde, falta un permiso, el programa está en pausa), la alternativa del programa decide qué hace el mensaje:
| Alternativa | Qué ocurre |
|---|---|
| Omitir el mensaje para esta persona (predeterminada) | El mensaje no se envía a esa persona y se registra como omitido con el motivo coupon_unavailable. |
| Enviar un código alternativo compartido | El mensaje sale con el código compartido que indiques (por ejemplo SORRY10). |
| Enviar sin el cupón | El mensaje sale y {{ coupons.<slug>.code }} está vacío - envuelve la parte del cupón en {% if coupons.<slug>.code != '' %} para ocultarla. |
Un mensaje enviado por la API transaccional se rechaza en su lugar: con Omitir, la llamada responde 422 con code: coupon_unavailable y el motivo, y no se envía nada. Los mensajes in-app y los mensajes de campañas de WhatsApp aún no se pueden retener, así que en ellos Omitir funciona como Enviar sin el cupón: el mensaje sale con el código vacío. Envuelve ahí la parte del cupón en {% if coupons.<slug>.code != '' %}.
Orígenes de los códigos
Cada programa tiene un origen de códigos - de dónde salen sus códigos. Lo eliges al crear el programa y no puede cambiar una vez que el programa tiene códigos.
| Origen | Qué ocurre | Ideal para |
|---|---|---|
| Personal (predeterminado) | Joryio crea un código único por persona en tu tienda en el momento en que el mensaje lo necesita (o lo genera por su cuenta cuando el programa no tiene tienda). | Recorridos, campañas activadas y campañas pequeñas - bienvenida, cumpleaños, recuperación. |
| Banco de códigos | Joryio crea muchos códigos en tu tienda por adelantado y los reparte, uno por persona. | Campañas grandes (decenas de miles de personas), donde crear códigos uno a uno al enviar sería demasiado lento. |
| Lista subida | Subes códigos creados en otro lugar - tu TPV, un socio, una tienda o app propia, otra herramienta - y Joryio los reparte, uno por persona. Joryio nunca los crea en una tienda. | Códigos que Joryio no puede crear y tiendas a las que Joryio no se conecta. |
| Código compartido | Un código para todos (SUMMER10), creado en tu tienda o solo registrado. Cada envío se sigue registrando por persona. | Promociones para todo el público. |
Sea cual sea el origen, el mensaje usa la misma variable {{ coupons.<slug>.code }}, una persona nunca recibe dos veces el mismo código de un banco o una lista, y el mismo envío siempre muestra el mismo código.
Subir códigos para una tienda o app propia
Un programa de Lista subida funciona sin ninguna tienda conectada - por ejemplo códigos que acepta tu caja o tu propia app - y también con una tienda conectada cuando los códigos ya existen en ella (Joryio no los vuelve a crear).
- Crea un programa con el origen Lista subida. La tienda es opcional; los ajustes del descuento solo describen el valor que muestra el mensaje (
{{ coupons.<slug>.value }}). - En el programa, selecciona Subir códigos y elige un archivo CSV o pega los códigos.
- Revisa la vista previa - Joryio valida primero el archivo y muestra cuántos códigos se añadirán y cada fila rechazada con el motivo. No se guarda nada hasta que confirmas.
- Confirma. Puedes subir más códigos al mismo programa en cualquier momento; los anteriores se quedan.
El archivo:
| Columna | Obligatoria | Formato |
|---|---|---|
code | Sí | 3-64 caracteres: letras, dígitos y - _ . # / + |
expires_at | No | YYYY-MM-DD (el final de ese día, UTC) o una fecha y hora ISO. Después de ella el código no se reparte. |
value | No | Lo que {{ coupons.<slug>.value }} muestra para este código, por ejemplo 10% o Café gratis - hasta 100 caracteres. |
La fila de encabezado es opcional (sin ella las columnas se leen en este orden), y sirven comas, puntos y coma y tabulaciones. Un archivo admite hasta 100.000 filas y 10 MB; divide las listas más grandes en varias subidas. Una fila se rechaza cuando falta el código o no es válido, la fecha no es una fecha o ya pasó, el valor es demasiado largo, el código aparece antes en el archivo, o el código ya está en este u otro programa del espacio de trabajo (los códigos se asocian a los pedidos por el propio código, así que cada código pertenece a un solo programa). Los códigos se comparan sin distinguir mayúsculas y minúsculas.
Cada persona recibe un código sin usar, y un código nunca se da a dos personas - aunque salgan muchos mensajes en el mismo momento. Cuando llega a Joryio un pedido con un código subido - mediante la sincronización de una tienda o la Orders API con el código en los cupones del pedido - el código se marca como canjeado y los ingresos se atribuyen al mensaje, igual que con los códigos que crea Joryio.
Bancos de códigos
Un programa de Banco de códigos necesita una tienda conectada. Joryio crea los códigos en la tienda antes de que nadie los reciba:
| Tienda | Cómo se crean los códigos |
|---|---|
| Shopify | Se añaden al único descuento del programa, 250 por llamada. |
| WooCommerce | Un cupón por código, 100 por llamada. |
| Magento | Se generan bajo la regla de precio de carrito del programa. Magento elige las cadenas de los códigos según el formato de código del programa (longitud, juego de caracteres, prefijo, sufijo, separador). |
| PrestaShop | Una regla de carrito por código, una llamada cada una. |
- Generar códigos en el programa crea códigos ahora; se ejecuta en segundo plano y la página del programa muestra el progreso y el último resultado.
- Códigos que mantener listos mantiene el banco en ese tamaño: cada 15 minutos Joryio lo rellena cuando baja de esa cifra.
- Antes de que se envíe una campaña, Joryio rellena cada banco que usa el contenido hasta cubrir la audiencia, para que el envío nunca espere a la tienda. Lo que aún falte cuando empieza el envío sigue la alternativa del programa.
- Bloquear a la persona (WooCommerce, Magento y PrestaShop) vincula un código del banco a la persona en el momento de repartirlo.
- Cambiar el descuento de un banco que tiene códigos retira sus códigos sin usar (se borran de la tienda) y los nuevos se crean con las nuevas reglas.
Códigos compartidos
Un programa de Código compartido da a todos el mismo código. Introduce el código y elige si Joryio lo crea en tu tienda o solo registra un código que ya existe allí (o en tu TPV). Un código compartido no se puede bloquear a la persona, y un código creado en la tienda debería permitir más de un uso.
Cada envío se sigue registrando por persona, así que el informe muestra quién recibió el código y con qué mensaje. Un pedido con un código compartido se atribuye a un mensaje solo cuando el pedido puede asociarse al contacto que lo recibió - cuenta su envío más reciente del código. Los pedidos de invitados que Joryio no puede asociar a un contacto no se atribuyen, porque el código por sí solo no dice de qué mensaje vienen.
Alertas de pocas existencias
Los bancos de códigos y las listas subidas muestran los códigos restantes en la lista de programas y en la página del programa. Configura la alerta en el programa:
- Quedan menos de N códigos (500 por defecto), y / o
- Queda menos del N% de todos los códigos cargados.
Cuando un programa activo baja de cualquiera de los dos, la alerta aparece en la campana de notificaciones y en la página del programa; se resuelve sola cuando añades códigos. Un programa vacío genera una alerta crítica.
Launch Review también revisa las existencias:
- Una campaña cuya audiencia es mayor que los códigos que quedan en una lista o un banco queda bloqueada - sube o genera más códigos primero.
- Un recorrido solo se bloquea cuando la lista o el banco está vacío (un recorrido no tiene una audiencia fija).
- Un envío que dejaría las existencias por debajo de la alerta recibe una advertencia.
Cuando los códigos se agotan durante un envío, cada persona restante recibe la alternativa del programa: el mensaje se omite, se envía con el código alternativo compartido o se envía sin el cupón.
Usar un código en un mensaje
Escribe la variable del programa en cualquier mensaje - email, SMS, push, web push, in-app, WhatsApp o Viber:
| Variable | Valor |
|---|---|
{{ coupons.welcome10.code }} | El código de la persona, por ejemplo WELCOME-7KQ4M2XH9P. |
{{ coupons.welcome10.expires_at }} | Cuándo caduca, como fecha y hora legibles: en el idioma del contacto (su atributo locale, si no language, si no el del espacio de trabajo, si no inglés) y en la zona horaria del espacio de trabajo. Por ejemplo 3 de noviembre de 2026, 18:30 para un contacto en español, o November 3, 2026 at 6:30 PM en inglés. Vacío si el código no caduca. |
{{ coupons.welcome10.expires_at_iso }} | El mismo momento como marca de tiempo ISO (2026-11-03T16:30:55.147Z), vacío si el código no caduca. Úsalo para elegir tu propio formato con un filtro de fecha, que también formatea en la zona horaria del espacio de trabajo: {{ coupons.welcome10.expires_at_iso | date: "%d/%m/%Y" }}. Un filtro de fecha ya escrito sobre expires_at sigue funcionando. |
{{ coupons.welcome10.value }} | El descuento en palabras: 10%, 5 EUR, Free shipping. |
{{ coupons.welcome10.apply_url }} | Un enlace que abre la tienda con el código ya aplicado (vacío si la tienda no tiene). |
{{ coupons.welcome10.name }} | El nombre del programa. |
En el editor de email, arrastra el bloque Coupon al email y elige el programa: muestra el código, la fecha de caducidad y un botón al enlace de aplicación, y se oculta cuando no se emitió ningún código.
Solo se emiten los códigos que la persona realmente ve. Un código dentro de una rama {% if %} que la persona no recibe nunca se crea. El mismo envío siempre muestra el mismo código: un reintento, un reenvío, un cambio entre variantes A/B y una alternativa por SMS llevan un único código.
Vistas previas y envíos de prueba
La vista previa siempre muestra un código de ejemplo como WELCOME-PREVIEW - con el enlace de aplicación de la tienda para él en apply_url - y nunca crea uno. Un envío de prueba también muestra el ejemplo, salvo que marques Issue a real coupon code (single use, expires in 24 hours) - la casilla solo aparece cuando el contenido usa cupones: Joryio crea entonces un código real - de un solo uso, válido 24 horas, marcado como prueba - para que lo pruebes en el checkout. Esto funciona también con un programa en borrador. Si no se puede crear el código - la tienda lo rechaza, el programa está archivado o sin códigos, o el programa bloquea los códigos a la persona y el destinatario no tiene dirección de email - la prueba no se envía y el diálogo muestra el motivo. Los códigos de prueba no se cuentan en el informe del programa ni en la pestaña Cupones del contacto.
En un recorrido
Añade un paso Issue coupon (en el grupo de datos de la paleta) y elige el programa. Emite el código una vez y lo guarda con la persona: cada mensaje posterior del recorrido que use {{ coupons.<slug>.code }} muestra el mismo código - incluidos el email y el recordatorio por SMS tres días después. El paso tiene dos salidas:
- Issued - la persona tiene un código.
- Could not issue - la tienda no pudo crear uno; dirige a estas personas a un mensaje sin cupón o termina el recorrido.
Un mensaje que usa la variable sin un paso Issue coupon antes emite el código él mismo, y los mensajes posteriores del mismo recorrido muestran ese código. Consulta Nodos del canvas.
Canjes e ingresos
Cuando llega un pedido de WooCommerce, Shopify, Magento o PrestaShop (o por la API de pedidos) con un código emitido por un programa, Joryio marca el código como canjeado, registra el pedido y sus ingresos y emite el evento Coupon Redeemed. Cuenta el primer pedido con el código. Si lo usa alguien distinto de la persona a la que se emitió, el informe lo muestra como "canjeado por otra persona".
Atribución por cupón. Un pedido que usó un código emitido por un mensaje se atribuye a ese mensaje - por delante de clics y aperturas. Está activo en todos los espacios de trabajo. Como el código es la prueba más fuerte que existe, los ingresos pueden moverse entre campañas en informes existentes cuando se empiezan a usar códigos.
Caducidad. Cuando un código caduca, Joryio lo marca como caducado, emite Coupon Expired y borra el código de la tienda automáticamente, para que la lista de descuentos de tu tienda no se llene de códigos muertos. El historial se conserva en Joryio.
Informe del programa
Cada programa muestra los códigos emitidos, canjeados, la tasa de canje, los ingresos de pedidos que usaron un código, el descuento concedido, los códigos caducados y fallidos, los canjeados por otra persona y un desglose por campaña y recorrido. Los códigos de prueba no cuentan.
El perfil de un contacto lista sus códigos en la pestaña Coupons (necesita Users (read)): programa, código, estado (abierto, canjeado, caducado), el mensaje que lo emitió y las fechas.
Eventos
| Evento | Cuándo | Propiedades |
|---|---|---|
Coupon Issued | Se emitió un código a la persona. | program, program_id, campaign_id, canvas_id, node_id, source, expires_at |
Coupon Redeemed | Un pedido usó el código. | program, program_id, campaign_id, canvas_id, order_id, revenue, redeemed_by_someone_else |
Coupon Expired | El código caducó sin usarse. | program, program_id, campaign_id, canvas_id, expires_at |
El código en sí nunca va en un evento: un código vale dinero para quien lo tenga.
Configuración de la tienda
| Tienda | Qué hacer una vez |
|---|---|
| Shopify | Abre Integrations → Shopify y selecciona Approve new permissions. Los cupones necesitan el permiso de descuentos de Shopify (write_discounts); las tiendas conectadas antes de que existiera lo aprueban una vez. |
| WooCommerce | Nada para emitir códigos - la conexión del plugin ya lo permite. El enlace de aplicación (apply_url) necesita el plugin de Joryio 1.4.0 o posterior. |
| Magento | Actualiza la extensión Joryio Connect a la 1.2.0 o posterior. La actualización concede a la integración el permiso de reglas de precio del carrito (Magento_SalesRule::quote) que necesita la creación de códigos, y añade el bloqueo a la persona. |
| PrestaShop | Instala o actualiza el módulo de Joryio a la 1.1.0 o posterior. La actualización permite que la clave de Webservice del módulo gestione reglas de carrito (y nada más), aplica una elección de productos o categorías y añade el enlace de aplicación. Consulta Programas de cupones en PrestaShop. |
En Shopify cada código cuesta una llamada a la tienda, y un plan estándar de Shopify permite unas 10 por segundo, así que una campaña a una audiencia muy grande puede tardar en preparar sus códigos. Para una campaña grande, usa un banco de códigos: sus códigos se crean en la tienda antes del envío.
En el admin de Shopify, todos los códigos de un programa están bajo un descuento titulado Joryio - <nombre del programa> (<slug> v<n>). Cambiar las reglas de un programa activo con códigos crea un descuento nuevo (la siguiente versión) para los códigos nuevos; los ya emitidos siguen en el anterior. Shopify guarda una fecha de caducidad por descuento, así que una caducidad por código (N horas / días después de emitirlo) se aplica con Joryio borrando el código en la hora siguiente a su caducidad.
Permisos y privacidad
- Campaigns (write) crea programas. Cambiar un programa activo con códigos - uno que ya emitió códigos - necesita Settings (write); los códigos ya emitidos conservan las reglas con las que se crearon.
- Ver los códigos de un contacto necesita Users (read).
- Los espacios de demostración (sandbox) nunca crean cupones reales en una tienda real.
- Borrar a una persona (RGPD) elimina sus códigos en Joryio y quita de la tienda sus códigos abiertos.