Templates y Variables
Handlebars, variables y helpers para personalizar emails.
ReallyQuickEmails utiliza un motor de templates basado en Handlebars con extensiones propias. Puedes crear correos dinamicos con variables, condicionales, loops y helpers de formateo que se resuelven al momento del envio.
Conceptos basicos
Variables
Usa {{nombreVariable}} o {nombreVariable} para insertar valores dinamicos en tu template. Ambas sintaxis son equivalentes.
En el template:
<h1>Hola, {{nombre}}!</h1>
<p>Tu cuenta en {empresa} ha sido creada exitosamente.</p>En el request body (API publica v1):
{
"template_id": "550e8400-e29b-41d4-a716-446655440000",
"variables": {
"nombre": "Carlos",
"empresa": "TechStore"
}
}Resultado renderizado:
<h1>Hola, Carlos!</h1>
<p>Tu cuenta en TechStore ha sido creada exitosamente.</p>Nota: Tambien puedes usar la sintaxis
{variable || "valor por defecto"}para proporcionar un fallback cuando la variable no existe.
Condicionales
Usa {{#if variable}}...{{/if}} para mostrar contenido solo cuando una variable existe y es truthy. Combina con {{else}} para manejar el caso contrario.
En el template:
{{#if premium}}
<p>Gracias por ser miembro Premium. Tienes envio gratuito en todos tus pedidos.</p>
{{else}}
<p>Actualiza a Premium para obtener envio gratuito.</p>
{{/if}}En el request body:
{
"data": {
"premium": true
}
}Nota: Handlebars evalua como falsy los valores
false,undefined,null,"",0y arrays vacios[].
Loops
Usa {{#each arreglo}}...{{/each}} para iterar sobre una lista de elementos. Dentro del loop, {{this}} referencia al elemento actual y puedes acceder a sus propiedades directamente.
En el template:
<table>
<tr>
<th>Producto</th>
<th>Cantidad</th>
<th>Precio</th>
</tr>
{{#each productos}}
<tr>
<td>{{this.nombre}}</td>
<td>{{this.cantidad}}</td>
<td>{{formatCurrency this.precio}}</td>
</tr>
{{/each}}
</table>En el request body:
{
"data": {
"productos": [
{ "nombre": "Camiseta Azul", "cantidad": 2, "precio": 15990 },
{ "nombre": "Pantalon Negro", "cantidad": 1, "precio": 29990 },
{ "nombre": "Zapatillas Blancas", "cantidad": 1, "precio": 45990 }
]
}
}Variables especiales dentro de loops:
| Variable | Descripcion |
|---|---|
{{this}} | El elemento actual de la iteracion |
{{@index}} | Indice del elemento (comienza en 0) |
{{@first}} | true si es el primer elemento |
{{@last}} | true si es el ultimo elemento |
{{@key}} | La clave actual (cuando se itera un objeto) |
Helpers integrados
ReallyQuickEmails incluye helpers de Handlebars adicionales para formateo comun en correos transaccionales.
formatCurrency
Formatea un numero como moneda usando el formato en-US. Por defecto usa USD como moneda. Acepta un segundo parametro opcional para especificar la moneda.
<p>Total: {{formatCurrency total}}</p>Con "total": 61970 produce: $61,970.00
Para usar otra moneda:
<p>Total: {{formatCurrency total "CLP"}}</p>multiply
Multiplica dos valores numericos. El resultado se redondea a 2 decimales.
<p>Subtotal: {{formatCurrency (multiply cantidad precio)}}</p>formatDate
Formatea una fecha ISO 8601 a un formato legible en espanol. Acepta un segundo parametro opcional para el formato.
Formato por defecto (short):
<p>Fecha: {{formatDate fechaEntrega}}</p>Con "fechaEntrega": "2025-03-15T00:00:00Z" produce: 15/3/2025
Formato largo (long):
<p>Fecha: {{formatDate fechaEntrega "long"}}</p>Con "fechaEntrega": "2025-03-15T00:00:00Z" produce: viernes, 15 de marzo de 2025
default
Proporciona un valor por defecto cuando la variable es undefined o null.
<p>Hola, {{default nombre "Cliente"}}!</p>Si nombre no esta definido en data, se renderiza como Hola, Cliente!.
json
Serializa un objeto a formato JSON con indentacion. Util para depuracion o para incluir datos estructurados en el correo.
<pre>{{json datos}}</pre>Con "datos": {"clave": "valor"} produce:
{
"clave": "valor"
}Identificar un template
Puedes referenciar un template de dos formas en la API publica (/v1/send-template-email):
| Campo | Tipo | Descripcion |
|---|---|---|
template_id | string (UUID) | UUID unico del template |
template_internal_id | number | ID interno auto-incrementado (por proyecto) |
{
"template_id": "550e8400-e29b-41d4-a716-446655440000",
"recipient_email": "usuario@ejemplo.com",
"sender_email": "tienda@tudominio.com",
"variables": {
"nombre": "Ana",
"numeroPedido": "5021"
}
}- Si el template no existe en el proyecto, la API retorna un error
404. - El template debe pertenecer al mismo proyecto asociado a la Secret Key utilizada.
El objeto variables
El objeto variables es un JSON plano (o anidado) donde cada clave corresponde a una variable del template.
Ejemplo completo
Request:
curl -X POST https://api.reallyquickemails.com/v1/send-template-email \
-H "Authorization: Bearer sk_proj_tu_secret_key" \
-H "Content-Type: application/json" \
-d '{
"template_id": "550e8400-e29b-41d4-a716-446655440000",
"recipient_email": "juan.perez@ejemplo.com",
"sender_email": "pedidos@mitienda.com",
"variables": {
"nombre": "Juan",
"numeroPedido": "3847",
"fechaCompra": "2026-02-20T14:30:00Z",
"premium": true,
"direccion": {
"calle": "Av. Providencia 1234",
"ciudad": "Santiago",
"region": "Metropolitana"
},
"productos": [
{ "nombre": "Audifonos Bluetooth", "cantidad": 1, "precio": 34990 },
{ "nombre": "Cable USB-C", "cantidad": 3, "precio": 5990 }
],
"subtotal": 52960,
"descuento": 5000,
"total": 47960
}
}'Template Handlebars correspondiente:
<h1>Gracias por tu compra, {{nombre}}!</h1>
<p>Pedido #{{numeroPedido}} - {{formatDate fechaCompra}}</p>
{{#if premium}}
<p>Como miembro Premium, tu envio es gratuito.</p>
{{/if}}
<table>
{{#each productos}}
<tr>
<td>{{this.nombre}}</td>
<td>x{{this.cantidad}}</td>
<td>{{formatCurrency this.precio}}</td>
<td>{{formatCurrency (multiply this.cantidad this.precio)}}</td>
</tr>
{{/each}}
</table>
<p>Subtotal: {{formatCurrency subtotal}}</p>
<p>Descuento: -{{formatCurrency descuento}}</p>
<p><strong>Total: {{formatCurrency total}}</strong></p>
<p>Direccion de envio: {{direccion.calle}}, {{direccion.ciudad}}, {{direccion.region}}</p>Acceso a propiedades anidadas
Usa notacion de punto para acceder a objetos anidados dentro de data:
<p>Ciudad: {{direccion.ciudad}}</p>
<p>Region: {{direccion.region}}</p>Buenas practicas
- Usa
defaultpara variables opcionales para evitar que aparezcan espacios vacios en el correo. - Valida tu objeto
dataantes de enviar. Si un template espera variables que no existen endata, se renderizaran como cadenas vacias sin error. - Nombra tus
templateIdde forma descriptiva usando kebab-case:bienvenida,confirmacion-envio,recuperar-carro,factura-mensual. - Prueba tus templates en el editor de ReallyQuickEmails con datos de ejemplo antes de integrar con la API.