Saltar al contenido principal
Los Custom Events te permiten personalizar mensajes de Journey usando propiedades de eventos (nombres de productos, precios, URLs, arrays, etc.). Las propiedades de eventos están disponibles en las plantillas solo si el evento:
  • Activa la entrada al Journey, o
  • Coincide con una condición Wait Until dentro del Journey
Las propiedades de eventos almacenadas se pueden acceder usando sintaxis Liquid.

Cómo funciona la personalización con Custom Events

Agrega propiedades de eventos a tus mensajes de Journey siguiendo estos pasos:
1

Enviar un Custom Event con propiedades

Ejemplo de payload de Custom Events:
JSON
{
  "name": "purchase",
  "properties": {
    "item": "Blue Sweater",
    "price": "29.99",
    "order status": "pending",
    "details": [
      {
        "manufacturer": "Company A",
        "model": "1234567890"
      },
      {
        "manufacturer": "Company B",
        "model": "9876543210"
      }
    ]
  },
  "external_id": "user_12345",
  "timestamp": "2025-10-21T19:09:32.263Z",
}
2

Referencia las propiedades del evento en las plantillas de mensajes de tu Journey

Usa sintaxis Liquid para acceder a las propiedades del evento.

Patrones comunes de acceso con Liquid

Qué necesitasLiquidResultado
Nombre del evento{{ journey.first_event.name }}purchase
Propiedad{{ journey.first_event.properties.item }}Blue Sweater
Propiedades anidadas{{ journey.first_event.properties.details.first.manufacturer }}Company A
Propiedad con caracteres especiales{{ journey.last_event.properties["order status"] }}pending
Marca de tiempo{{ journey.last_event.timestamp | date: "%B %d, %Y at %I:%M %p" }}October 21, 2025 at 07:09 PM

Patrones de acceso Liquid anidados

También puedes acceder a propiedades anidadas usando notación de punto y corchetes:
Liquid
{{ journey.first_event.properties.details.first.manufacturer }} = Company A
{{ journey.first_event.properties.details.last.manufacturer }} = Company B
{{ journey.first_event.properties.details[0].manufacturer }} = Company A
{{ journey.first_event.properties.details[1].manufacturer }} = Company B
El Liquid inválido o las propiedades faltantes se renderizan como cadenas vacías. Los mensajes se envían de todas formas. Usa filtros default para establecer un valor de respaldo.
3

Crear un Journey

Configura el Journey para usar el Custom Event como regla de entrada y/o condición Wait Until.Agrega nodos de mensaje con las plantillas.

Reglas de almacenamiento de propiedades de eventos

  • Puedes usar múltiples eventos en tu Journey combinando reglas de entrada y pasos Wait Until.
  • Máximo: 100 propiedades de eventos almacenadas por usuario por instancia de Journey (las más antiguas se eliminan).
  • Las propiedades de eventos se almacenan por usuario, por instancia de Journey.
  • Los eventos enviados antes de la entrada no son accesibles.
  • Las propiedades de eventos se borran cuando el usuario sale del Journey.
Los eventos almacenados en un Journey no pueden ser accedidos desde otro Journey.

Referencia Liquid de Custom Events

Usa estos objetos para acceder a los eventos almacenados dentro del Journey.
journey.first_event
El primer evento almacenado para esta instancia de Journey.
  • Si usas una regla de entrada de Custom Event, este es el evento que causó la entrada al Journey.
  • Si no usas una regla de entrada de Custom Event, este es el primer evento almacenado al coincidir con una condición Wait Until.
Liquid
Thanks for purchasing {{ journey.first_event.properties.item | default: "your item" }}!
journey.last_event
El evento almacenado más reciente para esta instancia de Journey.
  • Si solo hay un evento almacenado, first_event y last_event devuelven lo mismo.
Liquid
Your most recent purchase was {{ journey.last_event.properties.item | default: "made" }}!
journey.event.EVENT_NAME
El evento almacenado más reciente con un nombre específico.
  • Reemplaza EVENT_NAME con el nombre de tu evento (por ejemplo, purchase).
  • Si el mismo nombre de evento se usa varias veces, esto devuelve la instancia más reciente.
Liquid
{% assign event = journey.event.purchase %}
Si el nombre de tu evento incluye espacios o caracteres especiales, usa notación de corchetes.Ejemplo de evento: "name": "order status"
Liquid
{% assign event = journey.event["order status"] %}
journey.all_events
array
Todos los eventos almacenados para esta instancia de Journey, en el orden en que fueron almacenados.
Liquid
{% for event in journey.all_events %}
{{ event.properties.item | default: "Item" }} — ${{ event.properties.price | default: "0.00" }}
{% endfor %}
  • journey.first_event es una abreviación de journey.all_events[0].
  • journey.last_event es una abreviación del evento más reciente en el array.

Ejemplo: Plantillas de carrito abandonado usando Custom Events

Este ejemplo muestra cómo personalizar mensajes de carrito abandonado usando Custom Events. Se basa en el tutorial de Carrito abandonado. Conjunto de Custom Events de ejemplo:
JSON
{
  "events": [
    {
      "name": "cart_abandoned",
      "properties": {
        "cart_url": "https://yourdomain.com/username/cart",
        "cart": [
          {
            "product_name": "24 Pack of Acorns",
            "product_image": "https://i.imgur.com/ssPCfbC.png",
            "product_price": "$12.99",
            "product_quantity": "1"
          },
          {
            "product_name": "Fancy Sweater",
            "product_image": "https://i.imgur.com/8QWTfV4.png",
            "product_price": "$9.99",
            "product_quantity": "1"
          }
        ]
      },
      "external_id": "ID_OF_THE_USER"
    }
  ]
}

Plantilla de correo electrónico

Este ejemplo muestra cómo crear una plantilla de correo electrónico que muestra:
  • La cantidad de artículos en el carrito
  • Cada producto con imagen, nombre, cantidad y precio usando un bucle for
  • Un botón que enlaza a la URL única del carrito del cliente
1

Crear la plantilla de correo electrónico

Navega a Messages > Templates > New Email Template y abre el editor de arrastrar y soltar.
2

Agregar la estructura del diseño

Crea cinco filas:
  • Filas 1, 2 y 4: una columna con un bloque Paragraph
  • Fila 3: cuatro columnas con HTML | Paragraph | Paragraph | Paragraph
  • Fila 5: una columna con un bloque Button
3

Mostrar la cantidad de artículos

En la fila 1, agrega:
Liquid
We're holding onto {{journey.first_event.properties.cart.size}} items in your cart, but don't wait too long!
Para una mejor gramática, podrías usar un condicional para decir “1 item” vs “2 items”, pero para correos de carrito abandonado, el plural generalmente es aceptable.
Liquid
{% assign cart = message.custom_data.cart %}
{% assign item_count = cart.size | plus: 0 %}
{% if item_count == 1 %}
We're holding onto {{item_count}} item in your cart, but don't wait too long, other squirrels are getting ahead!
{% endif %}
{% if item_count > 1 %}
We're holding onto {{item_count}} items in your cart, but don't wait too long, other squirrels are getting ahead!
{% endif %}
4

Iniciar el bucle for

Usa un bucle for para repetir la fila de visualización del producto para cada artículo del carrito.En la fila 2 (inicio del bucle), agrega:
Liquid
{% for product in journey.first_event.properties.cart %}
Qué hace esto:
  • Inicia un bucle que itera sobre cada objeto en el array cart
  • Crea una variable temporal product que representa el artículo actual
  • Todo lo que está entre {% for %} y {% endfor %} se repite una vez por cada artículo del carrito
  • Puedes nombrar product como quieras (por ejemplo, item, cartItem), solo mantén la consistencia
Ubicación del bucle for: Asegúrate de que la sintaxis {% for %} esté en su propia fila de bloque de texto. No la coloques dentro de una fila de múltiples columnas con otro contenido, ya que esto puede romper el renderizado del correo electrónico en algunos clientes.
5

Mostrar los detalles del producto

Esta fila de 4 columnas muestra imagen, nombre, cantidad y precio. Como está dentro del bucle, se repite para cada artículo del carrito.En la fila 3 (detalles del producto), configura:Columna 1 - Bloque HTML (imagen del producto):
<img src="{{product.product_image}}" alt="Product image" style="max-width:100%;" />
Columnas 2–4 - Bloques de texto (nombre del producto, cantidad, precio):
  • Columna 2: {{product.product_name}}
  • Columna 3: {{product.product_quantity}}
  • Columna 4: {{product.product_price}}
Cómo funciona el bucle:
  • En la primera iteración, product = primer objeto en el array del carrito
  • {{product.product_image}} obtiene la imagen del primer artículo
  • En la segunda iteración, product = segundo objeto
  • La fila se repite automáticamente para todos los artículos del carrito
Coincidencia de nombres de campo: Las claves como product_image deben coincidir exactamente con el payload de tu evento (distingue mayúsculas y minúsculas). Las diferencias se renderizan como cadenas vacías.
6

Cerrar el bucle for

Cierra el bucle para marcar dónde termina la repetición.En la fila 4 (fin del bucle), agrega:
Liquid
{% endfor %}
Cada {% for %} debe tener un {% endfor %} correspondiente. Si falta, el renderizado del correo electrónico se romperá.
7

Agregar el botón con la URL del carrito

En el bloque Button de la fila 5, establece la URL de acción en:
Liquid
{{journey.first_event.properties.cart_url}}
8

Probar la plantilla

  • Agrega la plantilla a un Journey en blanco y establece la regla de entrada a un Custom Event.
  • Habilita el Journey e ingrésate a ti mismo a través de la API de Custom Events.
  • Verifica que los datos se muestren correctamente.
Ahora puedes aplicar tu propio estilo a la plantilla. Consulta Diseñar correos electrónicos con arrastrar y soltar.

Plantilla de push

Las notificaciones push tienen espacio limitado, así que muestra un artículo y menciona la cantidad total. Campo de mensaje: Muestra el artículo y la cantidad con gramática correcta usando declaraciones condicionales.
Liquid
{% assign cart = journey.first_event.properties.cart %}
{% assign item_count = cart.size | plus: 0 %}
{% if item_count == 1 %}
You left {{cart.first.product_name}} in your cart.
{% endif %}
{% if item_count == 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more item in your cart.
{% endif %}
{% if item_count > 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more items in your cart.
{% endif %}
Campo de imagen:
Liquid
{{journey.first_event.properties.cart.first.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
Campo de URL de lanzamiento:
Liquid
{{journey.first_event.properties.cart_url | default: "https://yourdomain.com/cart"}}
Envíate una notificación push de prueba agregándola al Journey de prueba e ingresándote a través de otra llamada a la API de Custom Events. Deberías ver una notificación similar a esta:
Ahora puedes crear más plantillas y usarlas en el Journey de carrito abandonado.

Solución de problemas y mejores prácticas

Errores comunes:
ErrorPor qué fallaSintaxis correcta
{{ journey.first_event.item }}Falta .properties{{ journey.first_event.properties.item }}
{{ journey.event.purchase.item }}Falta .properties{{ journey.event.purchase.properties.item }}
{{ journey.first_event.properties.Item }}Mayúsculas incorrectas (debe ser item){{ journey.first_event.properties.item }}
{{ event.properties.item }}Falta el prefijo journey.{{ journey.first_event.properties.item }}
Mejores prácticas:
  • Siempre prueba las plantillas antes de ponerlas en producción
  • Usa filtros default para propiedades opcionales
  • Valida que el esquema del evento coincida con las expectativas de la plantilla

Páginas relacionadas

¿Necesita ayuda?Chatee con nuestro equipo de Soporte o envíe un correo electrónico a support@onesignal.comPor favor incluya:
  • Detalles del problema que está experimentando y pasos para reproducir si están disponibles
  • Su ID de aplicación de OneSignal
  • El ID externo o ID de suscripción si corresponde
  • La URL del mensaje que probó en el panel de OneSignal si corresponde
  • Cualquier registro o mensaje de error relevante
¡Estamos felices de ayudar!