Iteración sobre datos contextuales personalization-contexts
Aprenda a utilizar la sintaxis de la iteración Handlebars para mostrar listas dinámicas de datos de varias fuentes en los mensajes, incluidos eventos, respuestas de acciones personalizadas y otros datos contextuales.
Información general overview
Journey Optimizer proporciona acceso a datos contextuales de varios orígenes durante la personalización de mensajes. Puede iterar matrices de estos orígenes utilizando la sintaxis Handlebars en canales nativos (email, push, SMS) para mostrar contenido dinámico como listas de productos, recomendaciones u otros elementos repetitivos.
Orígenes de contexto disponibles:
- Eventos: datos de eventos de recorrido (eventos empresariales, eventos unitarios)
- Respuestas de acción personalizada: datos devueltos por llamadas de API externas a través de acciones personalizadas
- Búsqueda de conjuntos de datos: Datos enriquecidos recuperados de conjuntos de datos de Adobe Experience Platform
- Propiedades técnicas: metadatos de Recorrido, como identificador de recorrido e identificadores suplementarios
- Contexto de Recorrido: se puede obtener acceso a otros datos relacionados con el recorrido durante la ejecución
Esta guía muestra cómo repetir matrices de cada una de estas fuentes en los mensajes, y cómo trabajar con matrices al configurar actividades de recorrido. Comience con Sintaxis de iteraciones de Handlebars para comprender los conceptos básicos de personalización de mensajes o salte a Trabaje con matrices en expresiones de Recorrido para aprender a pasar datos de matrices a acciones personalizadas y búsquedas de conjuntos de datos.
Sintaxis de iteración Handlebars syntax
Handlebars proporciona {{#each}} helper para iterar en matrices. La sintaxis básica es:
Puntos clave:
- Reemplazar
arrayPathpor la ruta a los datos de la matriz - Reemplazar
itempor cualquier nombre de variable que prefiera (por ejemplo,product,response,element) - Obtener acceso a las propiedades de cada elemento mediante
{{item.propertyName}} - Puede anidar varios bloques de
{{#each}}para matrices de varios niveles
Iterar sobre datos de evento event-data
Los datos de evento están disponibles cuando el recorrido se activa mediante un evento. Esto resulta útil para mostrar los datos capturados en el momento en que comenzó el recorrido, como el contenido del carro de compras, los elementos de pedidos o los envíos de formularios.
Ruta de contexto para eventos
<event_ID>: el identificador único del evento, tal como se configuró en el recorrido<fieldPath>: la ruta de acceso al campo o matriz dentro del esquema de evento
Ejemplo: Elementos de carro de compras de un evento
Si el esquema de evento incluye una matriz productListItems (formato XDM estándar 4}), puede mostrar el contenido del carro de compras como se detalla en el ejemplo siguiente.
| code language-handlebars |
|---|
|
Ejemplo: matrices anidadas en eventos
Para las estructuras anidadas, utilice bloques anidados {{#each}}.
| code language-handlebars |
|---|
|
Más información sobre cómo anidar en Prácticas recomendadas.
Iterar en respuestas de acciones personalizadas custom-action-responses
Las respuestas de acción personalizada contienen datos devueltos por llamadas a API externas. Esto resulta útil para mostrar información en tiempo real de sus sistemas, como puntos de lealtad, recomendaciones de productos, estados de inventario u ofertas personalizadas.
Ruta de contexto para acciones personalizadas
<actionName>: el nombre de su acción personalizada según la configuración del recorrido<fieldPath>: la ruta de acceso al campo o matriz dentro de la carga útil de respuesta
Ejemplo: Recomendaciones de producto desde una API
Para iterar una matriz de recomendaciones de productos devueltas por una acción personalizada y mostrarlas como tarjetas individuales en el mensaje, consulte el ejemplo siguiente.
Respuesta de API:
| code language-json |
|---|
|
Personalización de mensaje:
| code language-handlebars |
|---|
|
Ejemplo: matrices anidadas de acciones personalizadas
Para iterar una respuesta de acción personalizada que contenga matrices anidadas (una matriz de objetos, donde cada objeto contiene otra matriz), vea el ejemplo siguiente. Esto demuestra el uso de bucles {{#each}} anidados para acceder a varios niveles de datos.
Respuesta de API:
| code language-json |
|---|
|
Personalización de mensaje:
| code language-handlebars |
|---|
|
Para ver patrones de anidación más complejos, consulte Prácticas recomendadas.
Ejemplo: Beneficios del nivel de fidelización
Para mostrar los beneficios dinámicos en función del estado de fidelidad, consulte el siguiente ejemplo.
Respuesta de API:
| code language-json |
|---|
|
Personalización de mensaje:
| code language-handlebars |
|---|
|
Iterar sobre resultados de búsqueda de conjuntos de datos dataset-lookup
La actividad de búsqueda de conjuntos de datos le permite recuperar datos de conjuntos de datos de Adobe Experience Platform durante el tiempo de ejecución del recorrido. Los datos enriquecidos se almacenan como una matriz y se pueden repetir en los mensajes.
Obtenga más información acerca de cómo configurar la actividad Búsqueda de conjuntos de datos en esta sección. La búsqueda de conjuntos de datos es particularmente eficaz cuando se combina con datos de evento. Vea Ejemplo: Datos de evento enriquecidos con la búsqueda de conjuntos de datos para obtener un caso de uso práctico.
Ruta de contexto para búsquedas de conjuntos de datos
<activityID>: ID único de su actividad de búsqueda de conjuntos de datosentities: matriz de datos enriquecidos recuperados del conjunto de datos
Ejemplo: Detalles de un producto de un conjunto de datos
Si utiliza una actividad de búsqueda de conjuntos de datos para recuperar información del producto basada en SKU, consulte el siguiente ejemplo.
Configuración de búsqueda de conjuntos de datos:
- Claves de búsqueda:
list(@event{purchase_event.products.sku}) - Campos que se van a devolver:
["SKU", "category", "price", "name"]
Personalización de mensaje:
| code language-handlebars |
|---|
|
Ejemplo: Iteración filtrada con datos del conjunto de datos
Para filtrar los resultados de búsqueda del conjunto de datos durante la iteración y mostrar solo los elementos que coinciden con criterios específicos (por ejemplo, productos de una categoría en particular), utilice instrucciones {{#if}} condicionales dentro del bucle {{#each}}. Consulte el ejemplo siguiente.
| code language-handlebars |
|---|
|
Obtenga más información acerca del filtrado condicional en Prácticas recomendadas.
Ejemplo: Calcular totales de búsqueda de conjuntos de datos
Para calcular y mostrar los totales mientras se iteran los resultados de búsqueda del conjunto de datos, vea el ejemplo siguiente.
| code language-handlebars |
|---|
|
Usar propiedades técnicas del recorrido technical-properties
Las propiedades técnicas de recorrido proporcionan acceso a los metadatos sobre la ejecución de la recorrido, como el ID de recorrido y los identificadores suplementarios. Pueden resultar útiles cuando se combinan con patrones de iteración, especialmente para filtrar matrices basadas en instancias de recorrido específicas.
Propiedades técnicas disponibles
Ejemplo: Filtrado de elementos de matriz mediante un identificador suplementario
Cuando se utilizan identificadores suplementarios en recorridos activados por eventos con matrices, se puede filtrar para mostrar solo el elemento relevante para la instancia de recorrido actual. Obtenga más información acerca de los identificadores suplementarios en esta guía.
Escenario: se activa un recorrido con varias reservas, pero desea mostrar información solo para la reserva específica (identificada por el ID suplementario) que activó esta instancia de recorrido.
| code language-handlebars |
|---|
|
Ejemplo: Incluir ID de recorrido para el seguimiento
Para incluir el ID de recorrido en el mensaje con fines de seguimiento, consulte el ejemplo siguiente.
| code language-handlebars |
|---|
|
Combinación de varias fuentes de contexto combine-sources
Puede combinar datos de diferentes fuentes en el mismo mensaje para crear experiencias personalizadas y enriquecidas. En esta sección se muestran ejemplos prácticos de cómo usar varias fuentes de contexto juntas.
Orígenes de contexto que se pueden combinar:
Ejemplo: Artículos del carro de compras con inventario en tiempo real
Para combinar datos de evento (contenido del carro de compras) con datos de acción personalizados (estado de inventario), vea el siguiente ejemplo.
| code language-handlebars |
|---|
|
Ejemplo: datos de evento enriquecidos con la búsqueda de conjuntos de datos
Para combinar SKU de evento con información detallada del producto a partir de una búsqueda de conjunto de datos, vea el ejemplo a continuación.
| code language-handlebars |
|---|
|
Ejemplo: combinación de varias fuentes con propiedades técnicas
Para combinar varias fuentes de contexto (datos de perfil, datos de evento, acciones personalizadas y propiedades técnicas) en un solo mensaje, vea el siguiente ejemplo.
| code language-handlebars |
|---|
|
Otros tipos de contexto other-contexts
Aunque esta guía se centra en la iteración en matrices, otros tipos de contexto están disponibles para la personalización que generalmente no requieren iteración. Se accede a ellas directamente en lugar de hacerlo en bucle:
- Atributos de perfil (
profile.*): campos de perfil individuales de Adobe Experience Platform - Audiencias (
inAudience()): Comprobaciones de pertenencia a audiencias - Decisiones de oferta: ofertas de administración de decisiones
- Atributos de destino (solo campañas orquestadas): atributos calculados en el lienzo de la campaña
- Token (
context.token): tokens de sesión o autenticación
Para obtener sintaxis de personalización completa y ejemplos con estas fuentes, consulte:
Trabajo con matrices en expresiones de Recorrido arrays-in-journeys
Mientras que las secciones anteriores se centran en repetir matrices en la personalización de mensajes mediante Handlebars, también puede trabajar con matrices al configurar actividades de recorrido. En esta sección se explica cómo utilizar datos de matriz de eventos en expresiones de Recorrido, especialmente al pasar datos a acciones personalizadas o al utilizar matrices con búsquedas de conjuntos de datos.
first, all y serializeList. En el contenido del mensaje, se utiliza la sintaxis Handlebars con bucles {{#each}}.Pasar valores de matriz a parámetros de acción personalizados arrays-to-custom-actions
Al configurar acciones personalizadas, a menudo necesita extraer valores de matrices de eventos y pasarlos como parámetros. Esta sección trata sobre patrones comunes.
Obtenga más información sobre cómo pasar colecciones en Pasar colecciones a parámetros de acción personalizados.
Extraer un solo valor de una matriz
Caso de uso: obtenga un campo específico de una matriz de eventos para pasarlo como parámetro de consulta en una solicitud GET.
Ejemplo de escenario: Extraiga el primer SKU con un precio mayor que 0 de una lista de productos.
Ejemplo de esquema de evento:
| code language-json |
|---|
|
Configuración de acción personalizada:
- En la acción personalizada, configure un parámetro de consulta (por ejemplo,
sku) con el tipostring - Márquelo como
Variablepara permitir valores dinámicos
Expresión de Recorrido en el parámetro de acción:
| code language-javascript |
|---|
|
Explicación:
@event{YourEventName}: hace referencia al evento de recorrido.first(currentEventField.condition): devuelve el primer elemento de matriz que coincide con la condicióncurrentEventField: representa cada elemento de la matriz de eventos a medida que se recorre en bucle.SKU: extrae el campo SKU del elemento coincidente- Resultado:
"SKU-1"(una cadena adecuada para el parámetro de acción)
Obtenga más información acerca de la función first en Funciones de administración de colecciones.
Creación de una lista de valores a partir de una matriz
Caso de uso: cree una lista de identificadores separados por comas para pasarlos como parámetro de consulta (por ejemplo, /products?ids=sku1,sku2,sku3).
Configuración de acción personalizada:
- Configure un parámetro de consulta (por ejemplo,
ids) con el tipostring - Marcar como
Variable
expresión de Recorrido:
| code language-javascript |
|---|
|
Explicación:
-
.all(currentEventField.condition): devuelve todos los elementos de matriz que coinciden con la condición (devuelve una lista) -
currentEventField: representa cada elemento de la matriz de eventos a medida que se recorre en bucle -
.SKU: proyecta la lista para incluir solamente valores de SKU -
serializeList(list, delimiter, addQuotes): une la lista en una cadena",": usar una coma como delimitadortrue: agregar comillas alrededor de cada elemento de cadena
-
Resultado:
"SKU-1,SKU-3"(adecuado para un parámetro de consulta)
Más información sobre:
La administración de colecciones para acciones personalizadas se explica en Pasar colecciones a parámetros de acción personalizados.
Pasar una matriz de objetos a una acción personalizada
Caso de uso: Envíe una matriz completa de objetos en un cuerpo de solicitud (para POST o GET con cuerpo).
Ejemplo de cuerpo de solicitud:
| code language-json |
|---|
|
Configuración de acción personalizada:
- En el cuerpo de la solicitud, defina
productscomo tipolistObject - Marcar como
Variable - Defina los campos de objeto:
id,name,price,color(cada uno se vuelve asignable)
configuración de lienzo de Recorrido:
-
En el modo Avanzado, defina la expresión de colección:
code language-javascript @event{YourEventName.commerce.productListItems.all(currentEventField.priceTotal > 0)} -
En la interfaz de usuario de asignación de colecciones:
- Asignar
id→productListItems.SKU - Asignar
name→productListItems.name - Asignar
price→productListItems.priceTotal - Asignar
color→productListItems.color
- Asignar
Journey Optimizer construye la matriz de objetos que coinciden con la estructura de carga útil de la acción.
| note note |
|---|
| NOTE |
Cuando trabaje con matrices de eventos, utilice currentEventField para hacer referencia a cada elemento. Para las colecciones de orígenes de datos (Adobe Experience Platform), use currentDataPackField. Para las colecciones de respuestas a acciones personalizadas, use currentActionField. |
Obtenga más información en Pasar colecciones a parámetros de acción personalizados.
Usar matrices con búsquedas de conjuntos de datos arrays-with-dataset-lookup
Al usar la actividad de búsqueda de conjuntos de datos, puede pasar una matriz de valores como claves de búsqueda para recuperar datos enriquecidos.
Ejemplo: Busca detalles del producto para todos los SKU de una matriz de eventos.
Configuración de búsqueda de conjuntos de datos:
En el campo de claves de búsqueda, use list() para convertir una ruta de matriz en una lista:
| code language-javascript |
|---|
|
Esto crea una lista de todos los valores SKU que se buscarán en el conjunto de datos. Los resultados están disponibles como una matriz en context.journey.datasetLookup.<activityID>.entities en la que puede repetir en su mensaje (vea Iterar en los resultados de búsqueda del conjunto de datos).
Limitaciones y patrones array-limitations
Tenga en cuenta estas limitaciones al trabajar con matrices en recorridos:
Sin bucles dinámicos en matrices en el flujo de recorrido
Los recorridos no pueden crear bucles dinámicos en los que se ejecuta un nodo de acción varias veces para cada elemento de una matriz. Esto es intencional para evitar problemas de rendimiento fuera de control.
Lo que no puedes hacer:
- Ejecutar una acción personalizada una vez por elemento de matriz de forma dinámica
- Crear varias ramas de recorrido en función de la longitud de la matriz
Patrones recomendados:
-
Enviar todos los elementos a la vez: pase toda la matriz o una lista serializada a una única acción personalizada que procese todos los elementos. Ver Crear una lista de valores a partir de una matriz.
-
Usar agregación externa: Haga que la API externa acepte varios ID y devuelva resultados combinados en una sola llamada.
-
Cálculo previo en AEP: use atributos calculados para precalcular valores de matrices en el nivel de perfil.
-
Extracción de un solo valor: Si solo necesita un valor, extráigalo con
firstohead. Consulte Extraer un solo valor de una matriz.
Obtenga más información en Protecciones y limitaciones.
Consideraciones de tamaño de matriz
Las cabinas grandes pueden afectar al rendimiento del recorrido:
- Matrices de eventos: Mantenga las cargas de eventos por debajo de los 50 KB en total
- Respuestas de acción personalizada: las cargas de respuesta deben ser inferiores a 100 KB
- Resultados de búsqueda de conjuntos de datos: limitar el número de claves de búsqueda y entidades devueltas
Ejemplo completo: Matriz de eventos para la acción personalizada. complete-example
Este es un flujo de trabajo completo que muestra cómo utilizar una matriz de eventos con una acción personalizada.
Escenario: cuando un usuario abandona el carro, envía los datos del carro a una API de recomendaciones externa para obtener sugerencias personalizadas y luego mostrarlas en un correo electrónico.
Paso 1: Configurar la acción personalizada
Cree una acción personalizada "GetCartRecommendations":
- Método: POST
- URL:
https://api.example.com/recommendations - Cuerpo de solicitud:
| code language-json |
|---|
|
- Marcar
cartItemscomo tipolistObjectyVariable - Definir campos:
sku(cadena),price(número),quantity(entero)
Más información en Configurar una acción personalizada.
Paso 2: Configurar carga útil de respuesta
En la acción personalizada, configure la respuesta:
| code language-json |
|---|
|
Obtenga más información en Usar respuestas de llamadas API.
Paso 3: Conectar la acción en el recorrido
-
Después del evento de abandono del carro de compras, agregue la acción personalizada
-
En el modo Avanzado de la colección
cartItems:code language-javascript @event{cartAbandonment.commerce.productListItems.all(currentEventField.quantity > 0)} -
Asigne los campos de recopilación:
sku→productListItems.SKUprice→productListItems.priceTotalquantity→productListItems.quantity
Paso 4: usa la respuesta de tu correo electrónico
En el contenido del correo electrónico, recorra en iteración las recomendaciones:
| code language-handlebars |
|---|
|
Paso 5: Prueba tu configuración
Antes de ejecutar un recorrido en directo, pruebe la acción personalizada utilizando la función "Enviar solicitud de prueba" en la configuración de acción para comprobar la solicitud y los valores creados.
- Usar modo de prueba de recorrido
- Déclencheur con datos de evento de ejemplo que incluyen una matriz
productListItems - Compruebe que la acción personalizada recibe la estructura de matriz correcta
- Comprobar los registros de prueba de acción
- Previsualice el correo electrónico para confirmar que ambas matrices se muestran correctamente
Más información en Solucionar problemas de tus acciones personalizadas.
Prácticas recomendadas best-practices
Siga estas prácticas recomendadas al iterar sobre datos contextuales para crear una personalización mantenible y con rendimiento.
Uso de nombres de variables descriptivos
Elija nombres de variables que indiquen claramente sobre qué está iterando. Esto hace que su código sea más legible y fácil de mantener. Más información sobre sintaxis de personalización:
| code language-handlebars |
|---|
|
Fragmentos de expresión en bucles
Cuando use fragmentos de expresión en {{#each}} bucles, tenga en cuenta que no puede pasar variables con ámbito de bucle como parámetros de fragmento. Sin embargo, los fragmentos pueden acceder a las variables globales que se definen en el contenido del mensaje fuera del fragmento.
Patrón compatible - Usar variables globales:
| code language-handlebars |
|---|
|
El fragmento puede hacer referencia a globalDiscount porque está definido globalmente en el mensaje.
No se admite - Pasando variables de bucle:
| code language-handlebars |
|---|
|
Solución alternativa: incluya la lógica de personalización directamente en el bucle en lugar de usar un fragmento o llame al fragmento fuera del bucle.
Obtenga más información sobre el uso de fragmentos de expresión dentro de bucles, incluidos ejemplos detallados y soluciones alternativas.
Gestión de matrices vacías
Utilice la cláusula {{else}} para proporcionar contenido de reserva cuando una matriz esté vacía. Más información sobre funciones de ayuda:
| code language-handlebars |
|---|
|
Combinación con ayudantes condicionales
Use {{#if}} en bucles para contenido condicional. Obtenga más información acerca de reglas condicionales y vea ejemplos en las secciones Respuestas de acciones personalizadas y Búsqueda de conjuntos de datos.
| code language-handlebars |
|---|
|
Limitar iteración para rendimiento
Para matrices grandes, considere limitar el número de iteraciones:
| code language-handlebars |
|---|
|
Acceso a metadatos de matriz
Handlebars proporciona variables especiales dentro de bucles que ayudan con los patrones de iteración avanzados:
@index: índice de iteración actual (basado en 0)@first: True para la primera iteración@last: True para la última iteración
| code language-handlebars |
|---|
|
@index, @first, @last) solo están disponibles dentro de bucles {{#each}} en la personalización de mensajes. Para trabajar con matrices en expresiones de Recorrido (como obtener el primer elemento de una matriz antes de pasar a una acción personalizada), utilice funciones de matriz como head, first o all. Consulte Trabajo con matrices en expresiones de Recorrido para obtener más información.Resolución de problemas troubleshooting
¿Tiene problemas con la iteración? Esta sección cubre problemas y soluciones comunes.
La matriz no se muestra
Problema: La iteración de la matriz no muestra ningún contenido.
Posibles causas y soluciones:
-
Ruta incorrecta: compruebe la ruta exacta a la matriz en función del origen de contexto:
- Para eventos:
context.journey.events.<event_ID>.<fieldPath> - Para acciones personalizadas:
context.journey.actions.<actionName>.<fieldPath> - Para búsquedas de conjuntos de datos:
context.journey.datasetLookup.<activityID>.entities
- Para eventos:
-
La matriz está vacía: agregue una cláusula
{{else}}para comprobar si la matriz no tiene datos. Consulte Prácticas recomendadas para ver ejemplos. -
Los datos aún no están disponibles: Asegúrese de que la acción personalizada, el evento o la actividad de búsqueda del conjunto de datos se haya ejecutado antes de la actividad de mensaje en el flujo de recorrido.
Errores de sintaxis
Problema: Error en la validación de la expresión o no se representa el mensaje.
Errores comunes:
- Faltan etiquetas de cierre: Cada
{{#each}}debe tener un{{/each}}. Revise Sintaxis de iteración de Handlebars para obtener la estructura adecuada. - Nombre de variable incorrecto: Asegúrese de utilizar de forma coherente el nombre de la variable en todo el bloque. Consulte Prácticas recomendadas para conocer las convenciones de nomenclatura.
- Separadores de ruta incorrectos: utilice puntos (
.), no barras oblicuas ni otros caracteres
Los fragmentos de expresión no funcionan en bucles
Problema: un fragmento de expresión no muestra el contenido esperado cuando se usa dentro de un bucle {{#each}}, o muestra un resultado vacío o inesperado.
Posibles causas y soluciones:
-
Intentando pasar variables de bucle como parámetros: los fragmentos de expresión no pueden recibir variables de ámbito de bucle (como el elemento de iteración actual) como parámetros. Se trata de una limitación conocida.
Solución: use una de estas soluciones:
- Defina las variables globales en el mensaje a las que puede acceder el fragmento
- Incluya la lógica de personalización directamente en el bucle en lugar de utilizar un fragmento
- Llame al fragmento fuera del bucle si no necesita datos específicos del bucle
-
El fragmento espera un parámetro que no está disponible: Si el fragmento se diseñó para recibir parámetros de entrada específicos, no funcionará correctamente cuando esos parámetros no se puedan pasar desde un bucle.
Solución: Reestructure su enfoque para utilizar las variables globales a las que puede acceder el fragmento. Consulte Prácticas recomendadas: fragmentos de expresiones en bucles para ver ejemplos.
-
Ámbito de variable incorrecto: es posible que el fragmento esté intentando hacer referencia a una variable que solo existe dentro del ámbito de bucle.
Solución: defina cualquier variable que necesite el fragmento en el nivel de mensaje (fuera del bucle) para que sea accesible globalmente.
Obtenga más información sobre el uso de fragmentos de expresión dentro de bucles, incluidas explicaciones detalladas, ejemplos y patrones recomendados.
Prueba de las iteraciones
Use modo de prueba de recorrido para comprobar las iteraciones. Esto es especialmente importante cuando se usan acciones personalizadas o búsquedas de conjuntos de datos:
- Inicie su recorrido en modo de prueba
- Almacenar en déclencheur el evento o la acción personalizada con datos de ejemplo
- Compruebe message preview para verificar que la iteración se muestre correctamente
- Revise los registros del modo de prueba en busca de errores (consulte Registros del modo de prueba de acción personalizada)
Temas relacionados related-topics
Aspectos básicos de Personalization: Introducción a la personalización | Agregar personalización | Sintaxis de Personalization | Funciones de ayuda | Crear reglas condicionales
Configuración del Recorrido: Acerca de los eventos | Configurar acciones personalizadas | Pasar colecciones a parámetros de acción personalizados | Usar respuestas de llamadas API en acciones personalizadas | Solucionar problemas de tus acciones personalizadas | Usar datos de Adobe Experience Platform en recorrido | Usar identificadores suplementarios en los recorridos | Protecciones y limitaciones | Pruebe su recorrido
Funciones de expresión de Recorrido: Editor de expresiones avanzadas | Funciones de administración de colecciones (primero, todo, último) | Funciones de lista (serializeList, filter, sort) | Funciones de matriz (cabeza, cola)
Casos de uso de Personalization: Correo electrónico de abandono del carro de compras | Notificación de estado del pedido
Diseño de mensaje: Introducción al diseño de correo electrónico | Crear notificaciones push | Crear mensajes SMS | Previsualizar y probar tu contenido