Braze: atributo personalizado en Liquid, ${campo} o custom_attribute
Cómo escribir un atributo personalizado en Liquid de Braze: cuándo va ${campo} y cuándo custom_attribute.${campo}, con valor por defecto, condiciones y errores.
Respuesta rápida
En Braze, los atributos estándar van tal cual dentro de la etiqueta: {{${first_name}}}. Los atributos personalizados llevan delante custom_attribute.: {{custom_attribute.${plan}}}. Dentro de un {% if %}, el atributo personalizado conserva sus dobles llaves: {% if {{custom_attribute.${plan}}} == 'pro' %}. Añade | default: '...' a cualquier etiqueta que pueda salir vacía y previsualiza el mensaje con un usuario real antes de enviarlo.
Lo que vas a encontrar
- Cómo distinguir un atributo estándar de uno personalizado
- La sintaxis exacta de cada caso, con valor por defecto
- Cómo usar atributos personalizados dentro de un if
- Los errores que dejan la etiqueta en blanco
- Cómo comprobarlo antes de enviar
- Cómo se hace con Remite
¿Cómo sabes si un atributo es estándar o personalizado?
Braze tiene una lista fija de atributos estándar. Están en todos los espacios de trabajo. Nadie de tu equipo los ha creado. Todo lo que tus desarrolladores o tu equipo de datos mandan además de esa lista es un atributo personalizado.
Importa porque Braze escribe los dos tipos de forma distinta. Si usas la forma estándar con un atributo personalizado, la etiqueta no apunta a tus datos.
Los atributos estándar que más vas a usar en email:
| Atributo | Cómo se escribe | Qué guarda |
|---|---|---|
| Nombre | {{${first_name}}} |
El nombre del usuario |
| Apellido | {{${last_name}}} |
El apellido del usuario |
{{${email_address}}} |
La dirección de email del perfil | |
| Idioma | {{${language}}} |
El código de idioma, por ejemplo es |
| País | {{${country}}} |
El país del perfil |
| Ciudad | {{${city}}} |
La ciudad del perfil |
| Zona horaria | {{${time_zone}}} |
La zona horaria del usuario |
| ID de usuario | {{${user_id}}} |
Tu identificador externo del usuario |
Braze tiene alguno más, como ${date_of_birth}, ${gender}, ${phone_number} o ${braze_id}. La lista completa está en la página de etiquetas de personalización.
Si el campo no está en esa lista, trátalo como personalizado. Plan, nivel de fidelidad, tienda favorita, saldo de puntos, último producto visto: todos personalizados.
Para ver los atributos personalizados de tu espacio, entra en Data Settings > Custom Attributes. El nombre que ves ahí es el que escribes en la etiqueta. Braze avisa de que distingue mayúsculas y minúsculas: Plan y plan son dos atributos distintos. Lo explica en Manage custom data.
¿Cómo se escribe un atributo personalizado en Braze?
Una etiqueta de personalización de Braze tiene tres partes. Las dobles llaves de fuera imprimen un valor. El ${...} envuelve el nombre del atributo. Y en los personalizados, custom_attribute. va delante del ${...}.
Las dos formas, una al lado de la otra:
Hola, {{${first_name}}}:
Tu plan: {{custom_attribute.${plan}}}
Casi todas las etiquetas deberían llevar también un valor por defecto. El filtro default le dice a Braze qué imprimir cuando falta el atributo:
Hola, {{${first_name} | default: 'qué tal'}}:
Tu plan: {{custom_attribute.${plan} | default: 'Gratis'}}
Tienes {{custom_attribute.${reward_points} | default: 0}} puntos.
Un número puede llevar un número por defecto, sin comillas. Un texto va entre comillas.
| Qué quieres | Atributo estándar | Atributo personalizado |
|---|---|---|
| Imprimir el valor | {{${first_name}}} |
{{custom_attribute.${plan}}} |
| Imprimir con valor por defecto | {{${first_name} | default: 'qué tal'}} |
{{custom_attribute.${plan} | default: 'Gratis'}} |
| Comparar en un if | {% if ${language} == 'es' %} |
{% if {{custom_attribute.${plan}}} == 'pro' %} |
| Por defecto numérico | Casi nunca hace falta | {{custom_attribute.${reward_points} | default: 0}} |
Comprobado con la documentación de Braze en septiembre de 2026: etiquetas de personalización, lógica condicional y valores por defecto.
No hace falta que lo escribas todo a mano. Braze tiene la opción Add Personalization junto a sus campos de texto. Eliges el atributo, escribes el valor por defecto y Braze mete el Liquid donde está el cursor. Sirve para ver la forma correcta una vez y copiarla después.
¿Cómo se usa un atributo personalizado en un if?
Aquí se equivoca casi todo el mundo. Un atributo estándar entra en un {% if %} tal cual:
{% if ${language} == 'en' %}
Hello
{% elsif ${language} == 'fr' %}
Bonjour
{% else %}
Hola
{% endif %}
Un atributo personalizado conserva sus dobles llaves dentro del if. Así lo enseña la documentación de Braze:
{% if {{custom_attribute.${plan}}} == 'pro' %}
Gracias por estar en Pro.
{% else %}
Pásate a Pro y las devoluciones te salen gratis.
{% endif %}
Parece raro, porque en Liquid normal no se meten llaves dentro de una etiqueta. En Braze es la forma documentada para los atributos personalizados. Escríbelo así.
La comparación depende del tipo de dato del atributo. El patrón es el mismo en todos:
| Tipo de dato | Condición de ejemplo |
|---|---|
| Texto | {% if {{custom_attribute.${favorite_color}}} == 'blue' %} |
| Número | {% if {{custom_attribute.${shoe_size}}} == 10 %} |
| Booleano | {% if {{custom_attribute.${registration_complete}}} == true %} |
| Lista (array) | {% if {{custom_attribute.${last_viewed_shows}}} contains 'homeland' %} |
Dos avisos más de la documentación:
- Se escribe
elsif, noelif. Liquid lo escribeelsif. Quien viene de Klaviyo suele traer elelifde Django, y Braze no lo entiende. - Comprueba primero los vacíos. Para encontrar usuarios sin valor, Braze tiene
== null(sin definir) y== blank(sin definir, solo espacios o falso). La documentación pide comprobar los vacíos antes que otras variables para evitar un error de Liquid.
Si usas el mismo atributo personalizado varias veces, guárdalo una vez con assign y un valor por defecto. Después usas la variable:
{% assign es_premium = {{custom_attribute.${premium_user}}} | default: false %}
{% if es_premium %}
Hola, {{${first_name} | default: 'qué tal'}}. Gracias por ser premium.
{% else %}
Hola, {{${first_name} | default: 'qué tal'}}. Con premium el envío es gratis.
{% endif %}
Un aviso de Braze: dentro de un assign, lo que va entre comillas simples es texto literal. Si pones una etiqueta de personalización entre comillas, Braze no la rellena.
¿Por qué mi personalización de Braze no pinta nada?
Cuando una etiqueta sale vacía, suele ser uno de estos pocos errores. Repasa la tabla con tu etiqueta delante.
| Lo que escribiste | Qué falla | Lo que hay que escribir |
|---|---|---|
{{${plan}}} |
plan es personalizado, no estándar |
{{custom_attribute.${plan}}} |
{{custom_attribute.plan}} |
Falta el ${...} alrededor del nombre |
{{custom_attribute.${plan}}} |
{% if custom_attribute.${plan} == 'pro' %} |
Atributo personalizado sin llaves dentro del if | {% if {{custom_attribute.${plan}}} == 'pro' %} |
{{custom_attribute.${Plan}}} |
Mayúsculas distintas; el nombre las distingue | El nombre exacto de Data Settings |
{{${nombre}}} |
No es el nombre estándar | {{${first_name}}} |
{% elif ... %} |
Sintaxis de Django, no de Liquid | {% elsif ... %} |
{{${first_name}}} sin más |
Sin valor por defecto, un perfil vacío deja un hueco | {{${first_name} | default: 'qué tal'}} |
Hay un caso que el valor por defecto no cubre. La documentación de Braze dice que el default aparece con valores vacíos, pero no con valores en blanco. Un valor en blanco es uno que solo tiene espacios. Si un formulario guardó un espacio como nombre, default no salta. Para cogerlo, usa una condición con == blank y escribe tú la frase de respaldo:
{% if ${first_name} == blank %}
Hola:
{% else %}
Hola, {{${first_name}}}:
{% endif %}
En español esta opción suele ser mejor de todos modos. Muchos respaldos llevan género («Hola, amigo») o suenan a sistema («Hola, cliente»). Con la condición, quien no tiene nombre recibe una frase escrita para funcionar sin él.
Comprueba también que el atributo tenga datos. Un atributo puede existir en Data Settings y estar vacío para la mayoría de usuarios. Pasa cuando una integración dejó de mandarlo o cuando solo se rellena en algunos registros. La sintaxis puede estar perfecta y el email imprimir el valor por defecto a casi todo el mundo.
¿Cómo pruebas los atributos personalizados antes de enviar?
Tu propio perfil es una mala prueba. Seguramente tienes todos los atributos rellenos. Prueba con usuarios que no los tengan.
- Abre el mensaje y ve a la vista previa.
- Elige previsualizar como un usuario. Braze deja coger un usuario aleatorio, buscar uno existente por ID o email, o crear un usuario a medida.
- Coge un usuario existente que tenga el atributo personalizado. Comprueba que el valor sale.
- Coge uno que no lo tenga. Comprueba que el valor por defecto se lee bien en la frase.
- Pasa a un usuario a medida y escribe casos límite: un valor en mayúsculas, un valor con solo un espacio, cada opción que compara tu if.
- Mándate una prueba a tu bandeja. Para pruebas con personalización, Braze pide elegir un usuario existente o uno a medida, así la prueba lleva valores reales.
Si usas abort_message() en el mismo mensaje, recuerda que cancela el envío a quien cumple la condición. Una prueba que no llega puede ser una prueba cancelada. Braze lo explica en su página de mensajes abortados.
Una comprobación rápida antes de lanzar: lee en voz alta cada frase con personalización dos veces. Una con un valor real. Otra con el valor por defecto. Si la segunda suena rara, cambia el valor por defecto o escribe dos versiones con un if.
Cómo se hace con Remite
Remite escribe el Liquid de Braze al exportar. Distingue los atributos estándar de los personalizados, así que no tienes que acordarte de qué forma va en cada sitio. Este es el flujo real.
- Marca. Al configurar tu marca, eliges Braze como plataforma. Remite usa
first_nameylanguagecomo campos de nombre e idioma. - Personalizar con. En el brief, elige Nombre si el email debe usarlo. Para un atributo personalizado, escríbelo en Otro campo (por ejemplo
plan) y pulsa Añadir. También puedes pulsar Cargar cabecera CSV para añadir los campos de tu tabla de audiencia. Remite solo lee los nombres de las columnas. Las filas no salen de tu ordenador. - Antes de generar. Remite revisa el brief y puede hacerte una o dos preguntas antes de escribir el email.
- Edita por chat o con Comentar. El editor enseña el email con datos de ejemplo. Si una frase necesita otro respaldo, pídelo en el chat o selecciona el texto y deja un comentario.
- Exportar. La sección Campos de tus contactos lista cada campo que usa el email y el nombre que tendrá en Braze. Corrige el que no coincida con tu espacio y confirma con Sí, coinciden. Si un nombre parece la etiqueta de un CSV, con espacios, Remite te avisa.
- El resultado. Los campos estándar salen como
{{${first_name} | default: 'qué tal'}}. El resto sale como{{custom_attribute.${plan} | default: 'Gratis'}}. Si exportas todos los idiomas en un archivo, la condición de idioma usa{% if ${language} == 'en' %}con el campo estándar, o{% if {{custom_attribute.${idioma}}} == 'en' %}si tu idioma vive en un atributo personalizado. Para los idiomas de más usaelsif. - Prueba y envío. Enviarme una prueba te manda el email con datos de ejemplo. Enviar a Braze (beta) crea la plantilla de email en tu cuenta, o la actualiza si ya hay una con ese nombre. Necesitas una clave de la API REST con los permisos
templates.email.create,templates.email.updateytemplates.email.list, y tu instancia, comoiad-01ofra-01. La plantilla aparece en Templates > Email Templates.
Algunos límites, para que sepas qué esperar. Remite escribe los valores, sus respaldos y las condiciones de idioma. No escribe otros if por ti, como un mensaje que cambia según el plan: para eso usa los ejemplos de arriba. Tampoco añade comprobaciones con == blank. Y escribe el enlace de baja como {{${unsubscribe_url}}}. Braze recomienda ahora {{${set_user_to_unsubscribed_url}}} y dice que la etiqueta antigua sigue funcionando en los emails ya creados. Si tu equipo usa la nueva, cámbiala en Braze después de importar.
Para las mismas etiquetas en otras plataformas, mira la chuleta de variables de nombre y baja en 21 plataformas. La guía del email multiidioma profundiza en las condiciones de idioma. Si también envías desde Klaviyo, la guía del nombre por defecto en Klaviyo explica su versión del respaldo. Para decidir qué emails montar, lee las palancas de lifecycle para tiendas online o la página de lifecycle. El diagnóstico automático de lifecycle llega próximamente.
Preguntas frecuentes
¿Qué diferencia hay entre ${first_name} y custom_attribute en Braze?
${first_name} es un atributo estándar, y Braze escribe los estándar sin prefijo. Lo que ha creado tu equipo es personalizado y lleva custom_attribute. delante, como en {{custom_attribute.${plan}}}.
¿Por qué los atributos personalizados llevan dobles llaves dentro del if?
Es la forma que documenta Braze para los atributos personalizados en condiciones: {% if {{custom_attribute.${plan}}} == 'pro' %}. Los estándar no la necesitan: {% if ${language} == 'es' %} funciona tal cual.
¿Cómo pongo un valor por defecto a un atributo personalizado?
Añade el filtro dentro de la etiqueta: {{custom_attribute.${plan} | default: 'Gratis'}}. Con números, escribe el número sin comillas, como en | default: 0.
¿Braze distingue mayúsculas en los nombres de atributos personalizados?
Sí. Para Braze, Plan y plan son dos atributos distintos. Copia el nombre tal como aparece en Data Settings > Custom Attributes.
¿Por qué no sale el valor por defecto a algunos usuarios?
El valor por defecto aparece cuando el campo está vacío o no existe, pero no cuando está en blanco, es decir, con solo espacios. Cubre ese caso con {% if ${first_name} == blank %} y escribe tú la frase de respaldo.
¿En Braze se escribe elif o elsif?
Se escribe elsif. Braze usa Liquid, y Liquid lo escribe así. elif viene de Django, que es lo que usa Klaviyo.
¿Puedo usar un atributo personalizado en el asunto?
Sí. Las mismas etiquetas funcionan en el asunto y en el preheader. Pon siempre valor por defecto ahí, porque un hueco en el asunto se ve antes de abrir el email.
¿Remite sabe qué atributos de Braze son personalizados?
Sí. Escribe los campos de la lista estándar de Braze con ${...} y el resto con custom_attribute.${...}. Revisas y corriges los nombres en la ventana de exportar antes de descargar o enviar la plantilla.
Si prefieres no llevar esta sintaxis en la cabeza para cada plataforma, puedes apuntarte a la lista de espera de Remite.