Guía de Handlebars
Las plantillas de Frontmail usan la sintaxis de Handlebars en el cuerpo HTML, la versión de texto, el asunto y los campos de destinatario. Frontmail ejecuta Handlebars en un entorno aislado y restringido: solo existen los helpers que aparecen en esta página, los partials no están disponibles y todos los valores se escapan.
Variables
Sección titulada «Variables»<p>Hola, {{name}}:</p><p>Tu reserva para el {{booking.date}} está confirmada.</p> {{!-- objeto anidado --}}<p>{{default company "(sin empresa)"}}</p> {{!-- valor alternativo --}}Un valor que falta se renderiza como una cadena vacía. Usa {{!-- … --}} para comentarios que
nunca llegan al correo.
Condiciones
Sección titulada «Condiciones»{{#if newsletter}} <p>¡Gracias por suscribirte!</p>{{else}} <p>Puedes suscribirte cuando quieras.</p>{{/if}}
{{#unless paid}}<p>El pago está pendiente.</p>{{/unless}}
{{#if (eq topic "support")}}<p>Nuestro equipo de soporte te responderá en un día.</p>{{/if}}{{#if (and vip (gt total 1000))}}<p>🎁 Envío gratis</p>{{/if}}{{#if (or (eq country "ES") (eq country "MX"))}}<p>Envío gratis</p>{{/if}}{{#if}} trata como falso false, 0, "", null, los valores que faltan y las listas vacías.
Usa un parámetro list con itemFields:
<table> {{#each items}} <tr> <td>{{@index}}</td> <td>{{title}}</td> <td>{{qty}} × {{formatMoney price ../currency}}</td> </tr> {{else}} <tr><td colspan="3">No hay artículos.</td></tr> {{/each}}</table>Dentro de {{#each}}, this es el elemento actual; están disponibles @index (empieza en 0),
@first y @last, y ../ accede al ámbito superior. {{#with customer}}…{{/with}} cambia de
ámbito y {{lookup map key}} lee una clave dinámica.
Helpers
Sección titulada «Helpers»| Helper | Ejemplo | Resultado |
|---|---|---|
formatDate value [style] [timeZone=…] [locale=…] |
{{formatDate arrival "long"}} |
October 1, 2026 / 1 de octubre de 2026 |
formatNumber value [decimals=n] |
{{formatNumber 1234.5 decimals=2}} |
1,234.50 / 1234,50 |
formatMoney amount currency [minor=true] |
{{formatMoney 49 "EUR"}} · {{formatMoney 4900 "EUR" minor=true}} |
€49.00 / 49,00 € |
uppercase value |
{{uppercase code}} |
ABC123 |
lowercase value |
{{lowercase email}} |
lucia@example.es |
default value fallback… |
{{default nickname name "amigo"}} |
el primer valor no vacío |
eq a b · ne a b |
{{#if (eq status "paid")}} |
igualdad flexible (1 es igual a "1") |
gt a b · lt a b |
{{#if (gt qty 10)}} |
comparación numérica |
and a b … · or a b … · not a |
{{#if (and a (not b))}} |
booleanos (los valores vacíos son falsos) |
json value |
{{json items}} |
texto JSON (escapado); útil para depurar |
nl2br value |
{{nl2br message}} |
texto escapado con los saltos de línea convertidos en <br> |
Estilos de formatDate: date, datetime, time, short, long, full, iso. El idioma del
resultado sigue el idioma en que se envía el correo – el idioma predeterminado de la plantilla o la
traducción elegida –; puedes cambiarlo en cada llamada con locale="es".
Las horas usan la zona horaria de la organización, salvo que pases timeZone="Europe/Madrid".
Llamar a cualquier otro helper es un error de compilación, que aparece en las comprobaciones de la plantilla.
Variables del sistema
Sección titulada «Variables del sistema»| Variable | Valor |
|---|---|
{{frontmail.message_id}} |
El ID del mensaje, p. ej. msg_01J9Z3K7Q2; útil como número de referencia. |
{{frontmail.sent_at}} |
Marca de tiempo ISO del renderizado, p. ej. 2026-09-24T10:11:05.000Z. Combínala con formatDate. |
{{frontmail.origin}} |
El Origin de la solicitud del navegador (p. ej. https://example.com); vacío en los envíos desde el servidor. |
frontmail está reservado: no puedes definir un parámetro con ese nombre.
Escapado y el tipo html
Sección titulada «Escapado y el tipo html»Frontmail escapa como HTML todo lo que se muestra, incluidas las formas {{{triple}}} y
{{& ampersand}}. Un visitante que escriba <a href="…">clic</a> en tu formulario verá exactamente
ese texto en el correo, no un enlace.
Cuando de verdad necesitas marcado procedente de los parámetros (por ejemplo, texto enriquecido de tu
propio CMS), declara el parámetro con el tipo html. Su valor se sanea con una lista de
elementos permitidos:
- etiquetas:
a,b,strong,i,em,u,s,p,br,div,span,h1–h6,ul,ol,li,blockquote,pre,code,hr,img,tabley sus partes,small,sub,sup,center,font; - enlaces:
http,https,mailto,tel; imágenes:http,https,cid; - estilos en línea: colores, grosor/estilo/tamaño de fuente, interlineado, alineación/decoración del texto, margin, padding, width, height, max-width;
- todo lo demás (scripts, iframes, formularios, manejadores de eventos, URL
javascript:) se elimina.
Muéstralo con un simple {{body_html}}: el valor saneado se imprime como marcado.
Versión de texto
Sección titulada «Versión de texto»La versión de texto generada automáticamente se obtiene del HTML renderizado (los enlaces pasan a ser
texto (url) y las tablas, líneas). Si editas la versión de texto a mano, se renderiza con las
mismas reglas de Handlebars, pero sin escapado HTML.