Iterable Handlebars: valor por defecto para campos vacíos en emails
Cómo poner un valor por defecto en Iterable con defaultIfEmpty o con #if y else, qué valores cuentan como vacíos y cómo probar usuarios sin el campo.
Respuesta rápida
En Iterable el valor por defecto se pone con el helper defaultIfEmpty: {{defaultIfEmpty firstName "de nuevo"}}. Si firstName es nulo, no existe o es una cadena vacía, el email enseña «de nuevo» en lugar de dejar el hueco. Cuando una palabra no arregla la frase, usa {{#if firstName}}...{{else}}...{{/if}} y escribe dos versiones. Después abre Preview with data en la plantilla, carga un usuario sin ese campo y mira el resultado antes de enviar.
Lo que vas a encontrar
- Cómo se pone un valor por defecto con Handlebars en Iterable
- Qué valores trata Iterable como vacíos
- Cuándo es mejor #if y else que defaultIfEmpty
- Campos del evento, campos del perfil y nombres con espacios
- Valores por defecto en el asunto, el preheader y el editor visual
- Cómo probarlo antes de enviar
- Cómo se hace con Remite
¿Cómo se pone un valor por defecto en Iterable?
Las plantillas de Iterable usan Handlebars. Un campo va entre dobles llaves, como {{firstName}}. Al enviar, Iterable lo cambia por el valor del perfil del usuario o del evento que dispara la campaña.
Si el valor no está, Iterable no escribe nada. «Hola {{firstName}},» se queda en «Hola ,». Ese es el hueco que quieres evitar.
El arreglo más corto es el helper defaultIfEmpty. Le pasas el campo y el texto que debe salir cuando está vacío:
Hola {{defaultIfEmpty firstName "de nuevo"}},
Una usuaria llamada Ana ve «Hola Ana,». Alguien sin nombre ve «Hola de nuevo,».
La segunda opción es un bloque con #if y else. Hace lo mismo y te deja controlar la frase entera:
{{#if firstName}}Hola, {{firstName}}:{{else}}Hola:{{/if}}
Las dos valen. Cuál eliges depende de la frase, como verás en las secciones siguientes.
| Lo que escribes | Qué hace | Para qué sirve |
|---|---|---|
{{firstName}} |
Escribe el valor o nada | Campos que siempre están rellenos |
{{defaultIfEmpty firstName "de nuevo"}} |
Escribe el valor o el texto por defecto | Una palabra que encaja en la frase |
{{defaultIfEmpty apodo firstName}} |
Escribe apodo o, si está vacío, firstName |
Pasar de un campo a otro |
{{#if firstName}}...{{else}}...{{/if}} |
Enseña un bloque u otro | Dos versiones distintas de una frase |
{{capitalize firstName}} |
Pone en mayúscula la primera letra de cada palabra | Nombres escritos en minúsculas |
Comprobado con la documentación de Iterable en octubre de 2026: Personalizing Templates with Handlebars.
¿Qué valores cuentan como vacíos?
De aquí salen casi todas las dudas de «¿por qué sigue saliendo en blanco?». Las dos opciones tratan los valores casi igual, con un detalle que conviene saber.
defaultIfEmpty enseña el texto por defecto cuando el campo es nulo, no está definido o es una cadena vacía. En #if, el Handlebars de Iterable trata como falsos estos valores: nulo, cadena vacía, lista vacía, el booleano false y cualquier número igual a cero. Todo lo demás es verdadero.
Así que, para un campo de texto como el nombre, las dos se comportan igual: el texto por defecto sale cuando el campo falta o está vacío.
La trampa es un campo que solo tiene un espacio. Un espacio es un valor. Ni defaultIfEmpty ni #if lo tratan como vacío, así que el usuario ve «Hola ,» con doble espacio. Pasa lo mismo con un nombre guardado como «-» o «.» desde un formulario descuidado. La plantilla no arregla eso. Hay que arreglar los datos.
| Lo que tiene el perfil | {{firstName}} |
defaultIfEmpty o #if |
Qué hacer |
|---|---|---|---|
"Ana" |
Hola Ana, | Hola Ana, | Nada |
"" (cadena vacía) |
Hola , | Hola de nuevo, | Poner valor por defecto |
Sin campo firstName |
Hola , | Hola de nuevo, | Poner valor por defecto |
" " (un espacio) |
Hola , | Hola , | Limpiar los datos en origen |
"ANA" |
Hola ANA, | Hola ANA, | Arreglar los datos o aceptarlo |
0 en un campo numérico |
0 | Por defecto con #if, valor con defaultIfEmpty |
Usa #if solo si el cero debe ocultar el bloque |
La última fila importa con los números. Con #if, un campo igual a cero cuenta como falso. Si escribes {{#if puntos}}Tienes {{puntos}} puntos{{/if}}, quien tenga 0 puntos no ve nada. A veces es justo lo que quieres. A veces no.
Sobre las mayúsculas: capitalize convierte «ana maría» en «Ana María». Iterable lo describe como poner en mayúscula la primera letra de cada palabra. No dice que pase el resto a minúsculas, así que prueba un nombre guardado como «ANA» antes de fiarte. Si tu lista tiene muchos nombres en mayúsculas, vale la pena probar lower antes de capitalize, y limpiar los datos es lo más seguro.
¿Cuándo conviene #if y else?
defaultIfEmpty funciona cuando una palabra o una expresión corta encaja en la frase. «Hola de nuevo,» se lee bien. «Ana, tu pedido está listo» con un valor por defecto se queda en «de nuevo, tu pedido está listo», que no tiene sentido.
Cuando la frase necesita otra forma sin el nombre, escribe las dos versiones:
{{#if firstName}}
{{firstName}}, tu pedido está listo.
{{else}}
Tu pedido está listo.
{{/if}}
Otros casos donde #if es mejor herramienta:
- Bloques enteros. Si un usuario no tiene nivel de fidelidad, oculta esa sección en lugar de escribir «Tu nivel: ninguno».
- La puntuación. La coma detrás del nombre sobra cuando el nombre no está.
- El género. En español muchos valores por defecto tienen género. «Hola, amiga» o «Hola, cliente» no encajan con todo el mundo. Una frase neutra sin el nombre suele ser más segura que una palabra de respaldo.
- Varios campos. Iterable tiene también
#and,#oryelse ifpara mirar más de una condición.
Y cuando el email no tiene sentido sin el campo, no lo mandes. Un email con cupón pero sin el código es peor que ningún email. Iterable tiene el helper sendSkip, que cancela el envío a ese usuario y deja registrado el motivo:
{{#if couponCode}}
Tu código: {{couponCode}}
{{else}}
{{sendSkip cause="falta el código del cupón"}}
{{/if}}
| Situación | Mejor opción | Ejemplo |
|---|---|---|
| Saludo con el nombre | defaultIfEmpty |
Hola {{defaultIfEmpty firstName "de nuevo"}}, |
| Nombre al principio de la frase | #if / else |
Dos versiones de la frase |
| Una sección que solo aplica a algunos usuarios | #if sin else |
Ocultar el bloque de fidelidad |
| Un campo u otro | defaultIfEmpty con dos campos |
{{defaultIfEmpty apodo firstName}} |
| Un código de cupón o un precio | sendSkip |
No enviar a quien no tenga código |
| Un campo que siempre está relleno | Variable sin más | {{email}} |
¿Qué campo lee Iterable?
Un valor por defecto solo ayuda si Iterable mira el campo correcto. Hay tres detalles que confunden.
El campo del evento gana al del perfil. Si el evento que dispara la campaña trae un campo con el mismo nombre que uno del perfil, Iterable usa el del evento. Si el evento manda firstName vacío y el perfil sí tiene nombre, el usuario puede recibir el texto por defecto cuando esperabas su nombre. Usa {{profile.firstName}} para forzar el valor del perfil.
Los nombres de campo distinguen mayúsculas. firstName, FirstName y first_name son tres campos distintos. Si la plantilla dice firstName y tus perfiles guardan first_name, todos reciben el texto por defecto. Mira el nombre exacto en tu proyecto antes de culpar a los datos.
Espacios, puntos y números al principio van entre corchetes. Un campo llamado First Name se escribe {{[First Name]}}. Lo mismo con el valor por defecto: {{defaultIfEmpty [First Name] "de nuevo"}}. Iterable desaconseja los puntos en los nombres de campo, porque chocan con los objetos anidados.
Si trabajas con más de una plataforma, la chuleta de variables de nombre y baja en 21 plataformas tiene el mismo saludo en cada sintaxis. La lógica es la misma en el nombre por defecto de Klaviyo y en los atributos personalizados de Braze con Liquid, con otras palabras.
¿Funciona en el asunto y el preheader?
Sí. Iterable deja usar Handlebars en el asunto y en el preheader, además de en el cuerpo. Los valores por defecto funcionan igual:
{{#if firstName}}{{firstName}}, tu{{else}}Tu{{/if}} carrito te espera
Dos cosas a tener en cuenta. El asunto y el preheader no muestran HTML, así que deja ahí solo texto y variables. Y un valor por defecto que queda bien en el cuerpo puede quedar raro en un asunto. «De nuevo, tu carrito te espera» no funciona. Escribe el respaldo pensando en la frase donde va. En el ejemplo de arriba, la frase cambia de forma sin el nombre.
El editor visual (WYSIWYG) tiene su propia manía. Los helpers de bloque como #if metidos entre etiquetas HTML pueden dar errores al pasar al editor visual. Iterable recomienda envolver cada helper de bloque en un comentario HTML:
<!--{{#if firstName}}-->
<p>Hola, {{firstName}}:</p>
<!--{{else}}-->
<p>Hola:</p>
<!--{{/if}}-->
Comenta solo los helpers de bloque. No comentes {{firstName}}, porque entonces el valor no sale.
Iterable además conserva los espacios y saltos de línea alrededor de las variables. Si un valor por defecto va dentro de un enlace o de un fragmento de código, añade una virgulilla para quitar el espacio: {{~defaultIfEmpty firstName "de nuevo"~}}.
¿Cómo lo pruebo antes de enviar?
Previsualiza con perfiles reales, también con los malos. La vista previa de Iterable lo permite sin tocar los datos de nadie.
- Guarda la plantilla. Los cambios sin guardar no salen en la vista previa.
- Ve a Content > Templates, abre el menú de los tres puntos y elige Preview with data. O abre la plantilla y pulsa Preview.
- Escribe el email de un usuario y pulsa Load user data.
- Edita los datos cargados para probar un caso: borra
firstName, déjalo como cadena vacía, ponle un espacio. Esto no cambia el perfil real. - Revisa el asunto, el preheader y el cuerpo.
- Envía una prueba desde la vista previa. Usa los datos cargados.
Comprobado con la documentación de Iterable en octubre de 2026: Previewing Templates.
| Lo que falla | Causa probable | Cómo se arregla |
|---|---|---|
| Sigue saliendo «Hola ,» con valor por defecto | El nombre del campo cambia en mayúsculas | Copia el nombre exacto del perfil |
| Sale el texto por defecto a quien sí tiene nombre | El evento manda el campo vacío | Usa profile.firstName |
| «Hola ,» con doble espacio | El campo tiene un espacio | Limpia los datos en origen |
| Error al abrir el editor visual | Helpers de bloque entre etiquetas HTML | Envuélvelos en comentarios HTML |
| No sale nada donde iba el nombre | Se comentó la variable | Comenta solo los helpers de bloque |
| Bloque oculto a quien tiene 0 puntos | #if trata el cero como falso |
Compara el valor con #ifGt o #ifEq |
Para saber cuántos usuarios están afectados, crea un segmento en Iterable con los usuarios cuyo campo de nombre no existe o está vacío. Si son muchos, el valor por defecto es un parche. Pedir el nombre al registrarse es el arreglo de verdad.
Cómo se hace con Remite
Remite escribe las variables y sus respaldos en el Handlebars de Iterable al exportar, así que no las tecleas a mano. Este es el flujo real.
- Marca. Configuras tu marca una vez y eliges Iterable como plataforma. Remite usa
firstNamepara el nombre ylocalepara el idioma, salvo que le digas otros. Con Conectar CRM y una clave de servidor, Remite lee los campos reales de tus usuarios y enlaza cada variable con el suyo. Las claves se quedan en tu navegador. - Personalizar con. En el brief eliges si el email usa el nombre u otros campos de tu CRM.
- Antes de generar. Remite revisa el brief y, si falta algo importante, te hace una o dos preguntas rápidas.
- El respaldo va en el texto. Cuando una frase se rompe sin el nombre, Remite le pone un respaldo a esa variable. Si la frase se lee bien vacía, la deja sin respaldo. Puedes cambiarlo por chat, o seleccionar el texto y usar Comentar.
- Exportar. El apartado Campos de tus contactos enseña qué campo de Iterable usa cada variable. Si en tu proyecto se llama de otra forma, lo cambias ahí y confirmas con Sí, coinciden. El nombre sale como
{{#if firstName}}{{firstName}}{{else}}de nuevo{{/if}}, la baja como{{unsubscribeUrl}}y, si eliges Uno con todos los idiomas, cada idioma va en un bloque#eqsobre tu campo de idioma. - Revisión antes de subir. Remite revisa el HTML final: el peso y el recorte de Gmail, la baja en la sintaxis de Iterable, los campos contra tu CRM conectado, que las imágenes sean públicas y los enlaces.
- Enviar a Iterable (beta). Remite crea la plantilla en tu cuenta con el asunto y el preheader, o la actualiza si ya existe. La encuentras en Iterable → Content → Templates. Antes, Enviarme una prueba te manda el email con datos de ejemplo.
Dos límites, para que sepas qué esperar. Remite escribe la versión con #if, no defaultIfEmpty: con campos vacíos el resultado es el mismo, y puedes cambiarlo en Iterable si prefieres la forma corta. Y no añade sendSkip. Si un email no debe salir nunca sin un campo, añade ese bloque en Iterable con el ejemplo de arriba.
Si envías en varios idiomas, la guía de plantillas en varios idiomas compara una plantilla con todos frente a una por idioma. Y si estás decidiendo qué emails de lifecycle montar primero, la página de lifecycle tiene el resumen. El diagnóstico automático de lifecycle llegará próximamente.
Preguntas frecuentes
¿Cuál es la sintaxis del valor por defecto en Iterable?
Usa {{defaultIfEmpty campo "texto por defecto"}}. Por ejemplo, {{defaultIfEmpty firstName "de nuevo"}} escribe el nombre o, si está vacío o no existe, «de nuevo».
¿Funciona defaultIfEmpty si el campo no existe?
Sí. Iterable enseña el texto por defecto cuando el valor es nulo, no está definido o es una cadena vacía. Un campo que no existe en el perfil cuenta como no definido.
¿Por qué sigue saliendo «Hola ,» con el valor por defecto?
Casi siempre el nombre del campo no coincide. En Handlebars los nombres de campo distinguen mayúsculas, así que firstName y first_name son distintos. También puede ser un campo del evento que llega vacío: prueba con profile.firstName.
¿Uso defaultIfEmpty o #if?
Usa defaultIfEmpty cuando una palabra encaja en la frase. Usa #if y else cuando la frase necesita otra forma sin el dato, o cuando quieres ocultar un bloque entero.
¿Puedo poner un valor por defecto en el asunto?
Sí. En Iterable, Handlebars funciona en el asunto y el preheader. Escribe un respaldo que se lea bien en un asunto, porque esos campos no muestran HTML.
¿Cómo paso de un campo a otro si el primero está vacío?
Pasa a defaultIfEmpty un campo en lugar de un texto: {{defaultIfEmpty apodo firstName}}. Escribe el apodo o, si está vacío, el nombre.
¿Cómo evito el envío si falta un campo?
Usa sendSkip dentro de un bloque #if. Iterable cancela el envío a ese usuario y registra el motivo que le indiques.
¿Remite pone el respaldo para Iterable?
Sí, cuando una frase se rompería sin el dato. Lo exporta como {{#if firstName}}{{firstName}}{{else}}...{{/if}} con el texto que ves en el editor.
Si prefieres no escribir estas etiquetas a mano en cada plataforma, puedes apuntarte a la lista de espera de Remite.