> ## 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.

# Personalizar con propiedades

> Personaliza los mensajes de OneSignal usando propiedades predefinidas y Tags de datos personalizados. Accede a datos a nivel de usuario, suscripción, Journey, mensaje, plantilla y aplicación con sintaxis Liquid en correo electrónico, push, SMS y webhooks.

Usa propiedades (como Tags de usuario e identificadores como External ID) para personalizar mensajes y cargas de entrega con [sintaxis Liquid](./using-liquid-syntax).

OneSignal renderiza los marcadores Liquid **en el momento del envío**, usando datos ya almacenados en el usuario, suscripción, Journey, mensaje, plantilla, aplicación u organización. Puedes usar estos datos para personalizar mensajes, [webhooks de Journey](./journeys-webhook) y [Event Streams](./event-streams).

***

## Cuándo usar la personalización con propiedades

Usa la personalización con propiedades para renderizar contenido en el momento del envío utilizando datos que ya existen en OneSignal, más comúnmente Tags de usuario, External ID y campos de suscripción como correo electrónico o número de teléfono.

Este es el enfoque correcto cuando:

* Los datos ya están almacenados en OneSignal
* Quieres que los marcadores Liquid se reemplacen automáticamente cuando se envía el mensaje
* No necesitas obtener o calcular datos nuevos en el momento de la entrega

<Note>
  Si el valor debe obtenerse o calcularse en el momento del envío (por ejemplo, precios en tiempo real o inventario), usa [Data Feeds](./data-feeds) o nuestra [API con `custom_data`](./personalization-api-custom-data).

  Si el valor proviene del evento que causó que un usuario ingresara o avanzara en un Journey, usa la [personalización con Custom Events](./personalization-custom-event).
</Note>

### Compatibilidad de canales

Cada canal admite tipos de propiedades y campos específicos.

<Tabs>
  <Tab title="Correo electrónico">
    Admite [Propiedades de usuario y suscripción](#user-&-subscription-properties) en:

    * Asunto, Responder a y Pre-encabezado
    * Cuerpo del mensaje
    * Atributos HTML (por ejemplo: `<img src="{{ image_url }}" />`)
    * Acciones de botón (URLs, mailto, etc.)
  </Tab>

  <Tab title="Push">
    Admite [Propiedades de usuario y suscripción](#user-&-subscription-properties) en:

    * Título (`headings`), Subtítulo, Cuerpo (`contents`)
    * URL de imagen
    * URL de lanzamiento: `https://example.com/{{last_category_viewed}}`

    <Warning>
      El campo `data` (datos adicionales) no admite sintaxis Liquid.
    </Warning>
  </Tab>

  <Tab title="SMS">
    Admite [Propiedades de usuario y suscripción](#user-&-subscription-properties) en:

    * Cuerpo del mensaje (`contents`)
  </Tab>

  <Tab title="Mensajes in-app">
    Solo admiten sustitución de Tags. Las propiedades, Custom Events y otras fuentes de datos no están disponibles en este momento.

    * Los Tags deben estar configurados antes de que el usuario inicie una nueva sesión de la aplicación.
    * La sustitución de Tags puede no aparecer al usar flujos de envío de prueba.

    **Editor de bloques:** Bloques de Texto, Botón e Imagen
    **Editor HTML:** Elementos de texto y atributos (`src`, `href`, `action`, `data`)
  </Tab>

  <Tab title="Live Activities">
    Admite [Propiedades de usuario y suscripción](#user-&-subscription-properties) en:

    * `event_updates`
    * `contents`
    * `headings`
  </Tab>
</Tabs>

***

## Cómo funciona la personalización con propiedades

OneSignal reemplaza los marcadores Liquid con los valores de propiedad correspondientes para el usuario y la suscripción que recibe el mensaje.

```liquid Liquid theme={null}
Hi {{ first_name | default: "friend" }}!
Congrats on reaching level {{ level | default: "1" }}!
```

Si un usuario tiene los tags `first_name: Jon` y `level: 5`, verá:

```liquid Text theme={null}
Hi Jon!
Congrats on reaching level 5!
```

## Si un usuario no tiene tags configurados, verá los valores predeterminados en su lugar.

## Referencia de objetos Liquid de propiedades

Usa esta sección para consultar los nombres exactos de objetos y campos disponibles en Liquid.

### Propiedades de usuario y suscripción

Usa `user` para datos a nivel de usuario. Usa `subscription` cuando necesites valores específicos del canal como dirección de correo electrónico o número de teléfono.

<ParamField body="user.tags">
  Los [Tags](./add-user-data-tags) del usuario. Puedes hacer referencia a los tags de varias maneras:

  * Usa la `key` directamente o coloca la clave después de `tags`
  * Tags de ejemplo configurados: `first_name: Jon, level: 5`

  ```liquid Liquid theme={null}
  Your first name is {{ first_name }}.
  Your first name is {{ user.tags.first_name }}.
  Your level is {{ level }}.
  Your level is {{ user.tags.level }}.
  ```

  * Itera sobre los tags con sintaxis de bucle for. Este ejemplo muestra pares clave:valor separados por comas.

  ```liquid Liquid theme={null}
  {% for tag in user.tags %}
  {{ tag[0] }}: {{ tag[1] }}
  {% unless forloop.last %},
  {% endunless %}{% endfor %}
  ```
</ParamField>

<ParamField body="user.external_id">
  El [External ID](./users#external-id) del usuario.

  ```liquid Liquid theme={null}
  Your user ID is {{ user.external_id }}.
  Your user ID is {{ subscription.external_id }}.
  ```
</ParamField>

<ParamField body="user.onesignal_id">
  El [OneSignal ID](./users) del usuario.

  ```liquid Liquid theme={null}
  Your OneSignal user ID is {{ user.onesignal_id }}.
  ```
</ParamField>

<ParamField body="subscription.email">
  La dirección de correo electrónico de la suscripción de correo electrónico que recibe el mensaje.

  ```liquid Liquid theme={null}
  Thanks for subscribing with email {{ subscription.email }}.
  ```
</ParamField>

<ParamField body="subscription.phone_number">
  El número de teléfono de la suscripción SMS que recibe el mensaje.

  ```liquid Liquid theme={null}
  Thanks for subscribing with phone number {{ subscription.phone_number }}.
  ```
</ParamField>

<ParamField body="user.language">
  El código de idioma del usuario.

  ```liquid Liquid theme={null}
  Preferred language: {{ user.language }}
  Preferred language: {{ subscription.language }}
  ```
</ParamField>

<ParamField body="user.subscriptions">
  Las [Subscriptions](./subscriptions) del usuario.

  * Itera sobre las suscripciones con sintaxis de bucle for.
  * Este ejemplo muestra el token y el ID de cada suscripción separados por comas.

  ```json JSON theme={null}
  {
    "subscriptions": "{% for subscription in user.subscriptions %}{% if subscription.subscription_token %}{{ subscription.subscription_token }}: {{ subscription.id }}{% unless forloop.last %}, {% endunless %}{% endif %}{% endfor %}"
  }
  ```
</ParamField>

<ParamField body="subscription.unsubscribe_token">
  El token utilizado con la [API para cancelar suscripción de correo electrónico con token](/reference/unsubscribe-with-token).

  ```liquid theme={null}
  Unsubscribe: https://your-domain.com/unsubscribe?token={{ subscription.unsubscribe_token }}
  ```
</ParamField>

### Propiedades de Journey

El objeto `journey` te permite hacer referencia al nombre del Journey o acceder a la [personalización con Custom Events](./personalization-custom-event) para el Journey.

<ParamField body="journey.name">
  El nombre del Journey.

  ```json JSON theme={null}
  {
    "journey_name": "{{ journey.name }}"
  }
  ```
</ParamField>

### Propiedades de mensaje

El objeto `message` proporciona acceso al ID del mensaje, nombre e ID de plantilla que pueden ser útiles para [Event Streams](./event-streams), junto con acceso a [custom\_data](./personalization-api-custom-data) para personalizar mensajes enviados desde tu backend.

<ParamField body="message.id">
  El ID del mensaje establecido por OneSignal.

  ```json theme={null}
  {
    "message_id": "{{ message.id }}"
  }
  ```
</ParamField>

<ParamField body="message.name">
  El nombre del mensaje establecido por ti, el remitente.

  ```json theme={null}
  {
    "message_name": "{{ message.name }}"
  }
  ```
</ParamField>

<ParamField body="message.template_id">
  El ID de la plantilla establecido por OneSignal.

  ```json theme={null}
  {
    "template_id": "{{ message.template_id }}"
  }
  ```
</ParamField>

### Propiedades de plantilla

El objeto `template` proporciona acceso al ID y nombre de la [plantilla](./templates) utilizada para enviar el mensaje. Esto puede ser útil para [Event Streams](./event-streams).

<ParamField body="template.id">
  El ID de la plantilla establecido por OneSignal.

  ```json theme={null}
  {
    "template_id": "{{ template.id }}"
  }
  ```
</ParamField>

<ParamField body="template.name">
  El nombre de la plantilla establecido por ti, el remitente.

  ```json theme={null}
  {
    "template_name": "{{ template.name }}"
  }
  ```
</ParamField>

***

### Propiedades de aplicación y organización

Los objetos `app` y `org` proporcionan detalles sobre la [aplicación y organización](./apps-organizations) que envió el mensaje. Esto puede ser útil para [Event Streams](./event-streams).

<ParamField body="app.id">
  El ID de la aplicación establecido por OneSignal.

  ```json theme={null}
  {
    "app_id": "{{ app.id }}"
  }
  ```
</ParamField>

<ParamField body="app.name">
  El nombre de la aplicación establecido por ti, el propietario de la aplicación.

  ```json theme={null}
  {
    "app_name": "{{ app.name }}"
  }
  ```
</ParamField>

<ParamField body="org.id">
  El ID de la organización establecido por OneSignal.

  ```json theme={null}
  {
    "org_id": "{{ org.id }}"
  }
  ```
</ParamField>

<ParamField body="org.name">
  El nombre de la organización establecido por ti, el propietario de la organización.

  ```json theme={null}
  {
    "org_name": "{{ org.name }}"
  }
  ```
</ParamField>

***

## Ejemplo: Carrito abandonado con Tags

Este ejemplo muestra cómo personalizar mensajes de carrito abandonado usando Tags de usuario. Se basa en el [tutorial de carrito abandonado](./abandoned-cart).

**Tags de ejemplo configurados:**

```json JSON theme={null}
{
  "cart_updated": "unix_timestamp_seconds",
  "product_image": "https://i.imgur.com/ssPCfbC.png",
  "product_name": "24 Pack of Acorns",
  "product_quantity": "1",
  "product_price": "$12.99",
  "cart_items_count": "4",
  "cart_url": "https://yourdomain.com/cart"
}
```

### Plantilla de correo electrónico

<Steps>
  <Step title="Crear una nueva plantilla de correo electrónico">
    Navega a **Mensajes > Templates > Nueva plantilla de correo electrónico** y abre el editor de arrastrar y soltar.
  </Step>

  <Step title="Agregar la estructura de diseño">
    Crea cinco filas:

    * Filas 1, 2 y 4: una columna con un bloque de **Párrafo**
    * Fila 3: cuatro columnas con **HTML | Párrafo | Párrafo | Párrafo**
    * Fila 5: una columna con un bloque de **Botón**

    <Frame caption="Plantilla de correo electrónico inicial para carrito abandonado">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/starter-template-abandoned-cart.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=551e9ec4618f64fdc0b6ab610a537c48" width="2968" height="2124" data-path="images/email/starter-template-abandoned-cart.png" />
    </Frame>
  </Step>

  <Step title="Agregar liquid a los bloques de párrafo">
    En la fila 1, agrega:

    ```liquid Liquid theme={null}
    We're holding onto {{cart_items_count}} items in your cart, but don't wait too long, other squirrels are getting ahead!
    ```

    En la fila 2, agrega una descripción de lo que el usuario está viendo:

    ```liquid Text theme={null}
    Currently in your cart:
    ```

    En la fila 4, agrega otra llamada a la acción:

    ```liquid Text theme={null}
    Checkout now while supplies last!
    ```
  </Step>

  <Step title="Mostrar el artículo más reciente">
    En la fila 3, configura las cuatro columnas:

    **Columna 1 (bloque HTML):**

    ```html HTML theme={null}
    <img src="{{product_image}}" alt="Image" style="max-width:100%;" />
    ```

    **Columnas 2-4 (bloques de texto):**

    * Columna 2: `{{product_name}}`
    * Columna 3: `{{product_quantity}}`
    * Columna 4: `{{product_price}}`
  </Step>

  <Step title="Agregar la URL del carrito al botón">
    En el bloque de **Botón** de la fila 5, establece la URL de acción a:

    ```liquid theme={null}
    {{cart_url}}
    ```

    <Frame caption="Plantilla base de correo electrónico terminada para carrito abandonado sin estilos">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/finished-template-abandoned-cart-tags.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=a46cb86b4725c27c360b9f7cd96ab305" width="2968" height="2124" data-path="images/email/finished-template-abandoned-cart-tags.png" />
    </Frame>
  </Step>

  <Step title="Probar y previsualizar la plantilla">
    Envía un correo electrónico de prueba a ti mismo usando el botón **Probar y previsualizar**.

    * Asegúrate de que los tags estén configurados en tu suscripción de correo electrónico.

    <Frame caption="Previsualizar correo electrónico con Tags">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/test-email-with-tags.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=307a846a3fec6676658ac4c653590110" width="2968" height="2124" data-path="images/email/test-email-with-tags.png" />
    </Frame>
  </Step>

  <Step title="Aplicar estilos a la plantilla">
    <Check>Ahora puedes aplicar tus propios estilos a la plantilla. Consulta [Diseñar correos electrónicos con arrastrar y soltar](./design-emails-with-drag-and-drop).</Check>
  </Step>
</Steps>

### Plantilla 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](./using-liquid-syntax#if-elsif-else).

```liquid Liquid theme={null}
{% assign item_count = cart_items_count | plus: 0 %}
{% if item_count == 1 %}
You left {{product_name}} in your cart.
{% endif %}
{% if item_count == 2 %}
You left {{product_name}} and {{item_count | minus: 1}} more item in your cart.
{% endif %}
{% if item_count > 2 %}
You left {{product_name}} and {{item_count | minus: 1}} more items in your cart.
{% endif %}
```

**Campo de imagen:**

```liquid Liquid theme={null}
{{product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
```

**Campo de URL de lanzamiento:**

```liquid theme={null}
{{cart_url | default: "https://yourdomain.com/cart"}}
```

<Frame caption="Previsualizar la personalización de la plantilla push con Probar y previsualizar">
  <img src="https://mintcdn.com/onesignal/Up-pAJT_jbhthm6E/images/push/preview-push-template-personalization-with-test-preview.png?fit=max&auto=format&n=Up-pAJT_jbhthm6E&q=85&s=97db90a05acdf4ed30f54a76b1d63b98" width="2880" height="2036" data-path="images/push/preview-push-template-personalization-with-test-preview.png" />
</Frame>

<Check>Ahora puedes crear más plantillas y usarlas en el [Journey de carrito abandonado](./abandoned-cart).</Check>

***

## Ejemplo: Personalizar un mensaje in-app con Tags

Este ejemplo muestra un mensaje in-app de recompensa personalizado con Tags. El mensaje in-app sustituye los valores de Tag en varios tipos de bloques.

En el mensaje configurado:

* **Bloque de texto** — muestra el nivel completado y la recompensa para ese nivel
* **Bloque de imagen** — muestra la imagen para esa recompensa, con una imagen predeterminada como respaldo
* **Texto del botón 2** — muestra el valor de la recompensa, con un valor predeterminado de `100`
* **Imagen de fondo** — establecida desde un valor de Tag

<Frame caption="Editor de mensajes in-app con sustitución de Tags configurada en bloques de texto, imagen y botón">
  <img src="https://mintcdn.com/onesignal/56ctKxZSV4m5VEkn/images/docs/b697ab5-config1.png?fit=max&auto=format&n=56ctKxZSV4m5VEkn&q=85&s=c40e541c296b138a7f04ac561b3b0c64" alt="" width="872" height="968" data-path="images/docs/b697ab5-config1.png" />
</Frame>

El mensaje se renderiza al inicio de la sesión usando los valores de Tag actuales del usuario:

<Frame caption="Mensaje in-app mostrado al usuario con valores sustituidos desde Tags">
  <img src="https://mintcdn.com/onesignal/tc0EvmtSSX56SX0c/images/docs/973f097-JustTheIAMTagSub.png?fit=max&auto=format&n=tc0EvmtSSX56SX0c&q=85&s=0626ef7b31dfbfece633e74b072fbff5" style={{ width:"100%" }} width="338" height="607" data-path="images/docs/973f097-JustTheIAMTagSub.png" />
</Frame>

<Note>
  Consulta la pestaña **Mensajes in-app** en [Compatibilidad de canales](#compatibilidad-de-canales) más arriba para conocer los bloques, atributos y reglas de temporización compatibles. Dos recordatorios que vale la pena reforzar:

  * **Las Tags deben configurarse antes de que el usuario inicie una nueva sesión de la app.** Las Tags actualizadas a mitad de sesión no se renderizan en los mensajes in-app mostrados en esa sesión.
  * **La sustitución de Tags no se renderiza en los envíos de prueba "Send Test Message".** Activa el mensaje desde una sesión real para verificar la sustitución.
  * [La sustitución de propiedades](./using-liquid-syntax#property-include) no es compatible con los mensajes in-app.
</Note>

***

## Páginas relacionadas

<Columns cols={2}>
  <Card title="Personalización de mensajes" href="./message-personalization" icon="sparkles">
    Resumen de todas las opciones de personalización en OneSignal, incluyendo cuándo usar Custom Events frente a otros métodos.
  </Card>

  <Card title="Tags" href="./add-user-data-tags" icon="tag">
    Aprende cómo configurar Tags en usuarios a través de SDK, API o importación CSV.
  </Card>

  <Card title="Uso de sintaxis Liquid" href="./using-liquid-syntax" icon="droplet">
    Referencia completa de Liquid con filtros, condicionales, bucles y manipulación de cadenas.
  </Card>

  <Card title="Templates" href="./templates" icon="file">
    Crea y gestiona plantillas de mensajes reutilizables para usar en Journeys.
  </Card>

  <Card title="Tutorial de carrito abandonado" href="./abandoned-cart" icon="cart-shopping">
    Construye un Journey de carrito abandonado usando Tags y propiedades.
  </Card>
</Columns>

<Info>
  ¿Necesita ayuda?

  Chatee con nuestro equipo de Soporte o envíe un correo electrónico a `support@onesignal.com`

  Por 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](/docs/es/capturing-a-debug-log) relevante

  ¡Estamos felices de ayudar!
</Info>

***
