> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Personalización

> Elige el método de personalización adecuado en OneSignal. Compara Properties, Custom Events, API custom_data, Data Feeds y cargas de CSV para enviar mensajes dinámicos usando sintaxis Liquid.

<Frame>
  <iframe width="560" height="315" src="https://www.youtube.com/embed/71gtwxKWlN8?si=mlgmP6eE3652r_cX" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

La personalización te permite enviar mensajes que incluyen datos dinámicos, como el nombre de un usuario, artículos del carrito, saldo de cuenta, detalles de reserva o una contraseña de un solo uso.

Esta guía te ayuda a elegir el método de personalización adecuado según:

* Dónde residen tus datos
* Si deben persistir
* Cómo se activa el mensaje

***

## Cómo funciona la personalización

La personalización en OneSignal tiene dos partes:

1. **Sintaxis Liquid** -- define cómo se renderizan los valores en tu mensaje
2. **Una fuente de datos** -- determina de dónde proviene el valor

En el momento del envío, OneSignal resuelve tus variables Liquid usando la fuente de datos seleccionada.

<Info>
  Liquid controla el formato y la lógica (variables, bucles, condicionales). La fuente de datos determina qué valores están disponibles.
</Info>

**Ejemplo:**

```liquid Liquid theme={null}
Hi {{ user.tags.first_name }},

Your verification code is {{ message.custom_data.otp }}.
```

* `user.tags.first_name` es una propiedad almacenada
* `message.custom_data.otp` se pasa a través del campo `custom_data` de la API

***

## Campos soportados por tipo de mensaje

<Tabs>
  <Tab title="Email">
    * Asunto, Responder a y Pre-encabezado
    * Cuerpo del mensaje
    * Sustitución de imagen en bloques HTML. Ejemplo: `<img src="{{image_url}}"/>`
    * Acciones de bloque de botón como URLs, Mail to y otros campos.
  </Tab>

  <Tab title="Push">
    * Título (`headings`), Subtítulo, Cuerpo (`contents`)
    * URL de imagen
    * URL de lanzamiento. Ejemplo: `https://example.com/{{last_category_viewed}}`
    * `data` adicional no soporta sintaxis Liquid.
  </Tab>

  <Tab title="SMS">
    * Cuerpo del mensaje (`contents`)
  </Tab>

  <Tab title="In-App Messages">
    <Warning>
      Solo se soporta la sustitución de Tag en este momento.

      El tag debe establecerse antes de que el usuario abra la aplicación para iniciar una nueva sesión. Los tags disponibles están en el [método `getTags`](./mobile-sdk-reference#gettags).
    </Warning>

    **Editor de bloques:**

    * La sustitución de tag funciona en Bloques de Texto, Botón e Imagen.

    **Editor HTML:**

    * La sustitución de tag funciona en:
      * Etiquetas de encabezado `<h*>` y `<p>`. Ejemplo: `<h2>Hello {{first_name}}!</h2>`
      * Atributos de elemento: `["src", "href", "action", "data"]`. Ejemplo: `<img src="{{image_url}}"/>`

    <Note>
      Ver [APIs JavaScript de mensajes in-app](./in-app-message-api) para más detalles y ejemplos.
    </Note>
  </Tab>

  <Tab title="Live Activities">
    * Dentro de las propiedades `event_updates`, `contents` y `headings`.
  </Tab>
</Tabs>

***

## Fuentes de datos

OneSignal admite cinco fuentes de datos para personalización. Usa la tabla a continuación para identificar qué fuente se adapta a tu caso de uso y luego lee la sección detallada para obtener orientación sobre la implementación.

| Fuente de datos                                 | Qué es                                                                  | Cuándo usar                                                                      | Persistida | Disponible en Journeys |
| ----------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ---------- | ---------------------- |
| [**Properties**](#properties)                   | Tags, External ID, datos de subscription, campos de app                 | Valores reutilizables almacenados en OneSignal (nombre, plan, preferencias)      | Sí         | Sí                     |
| [**Custom Events**](#custom-events)             | Propiedades de eventos capturadas en la entrada al Journey o Wait Until | Personalización conductual dentro de Journeys                                    | Por evento | Solo Journey           |
| [**API `custom_data`**](#api-custom_data)       | Pares clave-valor pasados en la API Create Message                      | Valores de un solo uso o sensibles (OTP, enlaces seguros, artículos del carrito) | No         | No                     |
| [**Data Feeds**](#data-feeds)                   | Llamada a API en tiempo real realizada al momento del envío             | Valores que cambian frecuentemente (precios, inventario, saldo de cuenta)        | No         | Sí                     |
| [**Dynamic Content CSV**](#dynamic-content-csv) | CSV cargado en el panel de control                                      | Campañas masivas con contenido por destinatario                                  | Por envío  | No                     |

<Warning>
  **Errores comunes a evitar**

  * Usar Properties (Tags) para valores de un solo uso como OTPs o códigos de verificación — usa `custom_data` en su lugar
  * Esperar que `custom_data` esté disponible en Journeys o mensajes futuros — solo existe para la solicitud API actual
  * Asumir que las propiedades de Custom Events están disponibles fuera de la entrada al Journey activada por el evento o un paso Wait Until
  * Usar Data Feeds para datos estáticos que rara vez cambian — usa Properties en su lugar
</Warning>

### Properties

Las Properties incluyen Tags de usuario, External ID, datos de subscription y campos a nivel de app.

Son:

* Persistentes
* Reutilizables
* Disponibles en mensajes, plantillas, [Journey webhooks](./journeys-webhook) y [Event Streams](./event-streams).

**Usa Properties cuando:**

* El valor existe en OneSignal
* El valor es persistente
* Lo reutilizas en distintas campañas

<Card title="Personalizar con Properties" icon="tag" href="./personalization-properties-and-tags">
  Aprende a referenciar datos de propiedades persistentes almacenados.
</Card>

***

### Custom Events

Los [Custom Events](./custom-events) pueden personalizar mensajes dentro de [Journeys](./journeys-overview) usando propiedades de eventos.

Cuando un evento **inicia un Journey** o **coincide con una condición Wait Until**, OneSignal almacena ese evento para que sus propiedades puedan ser referenciadas en las plantillas de mensajes usando Liquid.

**Cuándo usar Custom Events:**

* Mensajes activados por eventos con Journeys
* El mensaje debe reflejar datos específicos del evento

<Warning> Solo los eventos que activan la entrada al Journey o un paso Wait Until se almacenan para personalización. Los eventos enviados fuera de esos momentos no están disponibles para los mensajes del Journey. </Warning>

<Card title="Personalización con Custom Events" icon="bolt" href="./personalization-custom-event">
  Guía completa para usar propiedades de eventos en Journeys.
</Card>

***

### API `custom_data`

El campo `custom_data` en la [API de Create Message](/reference/create-message) te permite enviar valores específicos por mensaje desde tu backend.

Estos datos:

* Existen solo para la solicitud actual
* No se almacenan en OneSignal
* No están disponibles en Journeys

**Usa `custom_data` cuando:**

* Envías valores de un solo uso o sensibles (OTP, enlaces seguros)
* Pasas arrays (artículos del carrito, líneas de pedido, puntuaciones de tabla de clasificación)
* Envías mensajes transaccionales o activados por API

<Card title="Personalizar con API custom_data" icon="code" href="./personalization-api-custom-data">
  Aprende a pasar datos de personalización transitorios.
</Card>

***

### Data Feeds

Los [Data Feeds](./data-feeds) llaman a tu API en el momento del envío e inyectan la respuesta en tu mensaje.

**Cuándo usar Data Feeds:**

* Necesitas el valor más reciente en el momento de la entrega
* Los datos residen en tu backend
* El valor puede cambiar entre envíos

<Card title="Data Feeds" icon="cloud-arrow-up" href="./data-feeds">
  Obtén datos en tiempo real del backend en los mensajes en el momento del envío.
</Card>

***

### Dynamic Content CSV

Carga un archivo CSV en el panel de control de OneSignal y referencia sus valores usando Liquid.

**Usa CSV cuando:**

* Personalizas diferentes secciones de una campaña masiva para cada destinatario
* Las traducciones o datos personalizados para cada destinatario son exportables a un archivo CSV
* No quieres usar la API

<Card title="Dynamic Content CSV" icon="file-csv" href="./dynamic-content">
  Personaliza campañas del panel de control usando cargas de CSV.
</Card>

***

## Guías detalladas

Usa las guías a continuación para obtener detalles de implementación paso a paso y ejemplos avanzados.

<Columns cols={2}>
  <Card title="Uso de la sintaxis Liquid" icon="droplet" href="./using-liquid-syntax">
    Aprende a insertar datos dinámicos en los mensajes usando Liquid. Cubre variables, condicionales, bucles, filtros, formato y patrones comunes de personalización.
  </Card>

  <Card title="Data Feeds" icon="cloud-arrow-up" href="./data-feeds">
    Obtén datos en tiempo real de tus propias APIs en el momento del envío. Usa Data Feeds cuando el contenido del mensaje dependa de valores en vivo del backend como saldos, disponibilidad o precios.
  </Card>

  <Card title="Personalización con Custom Events" icon="bolt" href="./personalization-custom-event">
    Personaliza mensajes de Journey usando propiedades de eventos capturadas cuando los usuarios entran o avanzan a través de un Journey. Ideal para flujos de trabajo basados en comportamiento y eventos.
  </Card>

  <Card title="Properties y Tags" icon="tag" href="./personalization-properties-and-tags">
    Usa propiedades almacenadas de usuario, subscription, mensaje y app para personalizar contenido en mensajes, plantillas, Journey webhooks y Event Streams.
  </Card>

  <Card title="API custom_data" icon="code" href="./personalization-api-custom-data">
    Pasa datos por mensaje y transitorios desde tu backend usando la API de Create Message. Ideal para OTPs, carritos, arrays y personalización transaccional masiva.
  </Card>

  <Card title="Dynamic Content CSV" icon="file-csv" href="./dynamic-content">
    Carga archivos CSV en el panel de control para personalizar campañas a escala. Cada fila se asigna a un destinatario y puede referenciarse usando Liquid.
  </Card>
</Columns>

### Tutoriales

Estas guías muestran cómo implementar la personalización en la práctica.

<Columns cols={2}>
  <Card title="Verificación, Magic Link y OTP" icon="key" href="./example-verification-magic-link-otp">
    Envía mensajes de verificación seguros usando contraseñas de un solo uso, magic links o URLs personalizadas con personalización basada en API.
  </Card>

  <Card title="Journey de carrito abandonado" icon="cart-shopping" href="./abandoned-cart">
    Crea un Journey automatizado que detecta actividad del carrito, espera inactividad, envía un recordatorio personalizado y retira al usuario inmediatamente después de la compra.
  </Card>

  <Card title="Confirmaciones de reserva" icon="calendar" href="./booking-confirmations">
    Envía mensajes de confirmación y recuperación de reservas usando Custom Events, Journeys y Data Feeds basados en el estado de la reserva en tiempo real.
  </Card>

  <Card title="Mensajes transaccionales" icon="receipt" href="./transactional-messages">
    Aprende a enviar recibos, alertas, confirmaciones y otros mensajes transaccionales a través de canales usando APIs y automatización.
  </Card>

  <Card title="Ejemplos de personalización in-app" icon="mobile" href="./personalization-properties-and-tags">
    Consulta ejemplos prácticos del uso de tags y propiedades para personalizar mensajes in-app para diferentes usuarios y segmentos.
  </Card>
</Columns>
