Visión general
Las variables dinámicas te permiten escribir un mensaje que llega personalizado a cada persona.
En lugar de "¡Hola!", escribes ¡Hola {{ contact.first_name }}! y cada contacto recibe su propio nombre.
La variable siempre se escribe entre llaves dobles y se resuelve en el servidor, en el momento del envío — nunca en el navegador. Si el dato no existe, la variable queda como texto vacío y el resto del mensaje sale con normalidad.
Todas las variables usan el mismo vocabulario en todas las superficies: lo que funciona en el compositor de respuesta funciona igual en el correo, la campaña, el follow-up, el flujo y el contrato.
Requisitos previos
- Ninguno. Las variables básicas (contacto, cuenta, bandeja de entrada, agente) funcionan desde el primer día.
- Las variables de un módulo (cobro, agendamiento, contrato, pedido…) solo traen valor cuando ese módulo está en uso en la cuenta. Sin dato se resuelven vacías — nunca rompen el mensaje.
Paso a paso
- Abre cualquier campo de texto que acepte variables (compositor, macro, respuesta rápida, campaña, follow-up, contrato, recordatorio de la agenda…).
- Escribe
{{— la lista de variables aparece automáticamente. - O haz clic en el botón
{x}Insertar variable, cuando esté disponible en el encabezado del campo. - Busca por nombre (por ejemplo "importe" o "vencimiento") y haz clic para insertar.
- Comprueba el valor antes de enviar. Dentro de una conversación, el selector muestra lo que la
variable seleccionada va a producir para ese contacto: el nombre real, el importe real del cobro,
la fecha real de la cita. Al escribir
{{, el valor aparece en el panel de vista previa, en el campo Valor; con el botón{x}, aparece como una etiqueta en la propia fila del token. Lo que ves ahí es exactamente lo que recibirá el cliente. - Envía una prueba antes de lanzar a toda la base.
Configuración y opciones
El selector de variables
Hay dos formas de llegar a la misma lista:
- Escribiendo
{{dentro del editor. El selector se abre anclado al punto donde estás escribiendo, arriba o abajo de esa línea — gana el lado de la pantalla con más espacio — y con el campo de búsqueda ya enfocado: sigue escribiendo y la lista filtra. - Con el botón
{x} Insertar, en el encabezado de los campos que lo ofrecen (plantillas de WhatsApp, pasos de follow-up, recordatorios de la agenda, campos del constructor de flujos).
En ambos casos la búsqueda coincide tanto con el nombre del token como con la descripción — buscar "vencimiento" encuentra la variable aunque no sepas su nombre.
La lista nunca se reordena. Grupos y tokens llegan en el orden del catálogo del servidor, que ya
pone primero lo más usado (name, first_name, email… antes de los campos de dirección). Los
campos personalizados que creaste entran en el grupo del modelo al que pertenecen.
El panel de vista previa muestra dos campos del elemento seleccionado:
| Campo | Qué trae |
|---|---|
| Descripción | Qué significa la variable, en el idioma del panel |
| Valor | Lo que va a producir en esta conversación, calculado en el servidor por el mismo mecanismo que arma el mensaje al enviarlo |
Cuando el token no tiene valor para ese contacto, el panel dice «Sin valor para esta conversación» en texto apagado, en lugar de fingir un valor que no existe. Es la respuesta honesta — y es exactamente lo que necesitas ver antes de enviar.
En pantallas anchas el panel queda a la derecha de la lista; en pantallas estrechas baja debajo de ella; y cuando no cabe de ninguna de las dos formas, el selector muestra solo la lista, que sigue funcionando igual.
Teclado: ↑ ↓ (o Tab / Shift+Tab, o Ctrl+P / Ctrl+N) recorren la lista, que da la vuelta del último
elemento al primero; Enter inserta; Esc cierra y devuelve el foco al texto; Backspace con la
búsqueda vacía borra las {{ que abrieron el selector. Pasar el ratón sobre una fila ya la
selecciona, hacer clic inserta y hacer clic fuera cierra.
Dónde no se abre el {{. El disparador solo se reconoce al inicio de la línea o después de un
espacio, y el selector no se abre en una nota privada — elegir la variable de la lista es un
recurso del modo Respuesta. Una vez cerrado con Esc, solo vuelve a abrirse cuando escribes {{ de
nuevo.
Los grupos disponibles
| Grupo | Para qué sirve | Ejemplo |
|---|---|---|
| Contacto | Quién está del otro lado | {{ contact.first_name }} |
| Conversación | La conversación actual | {{ conversation.display_id }} |
| Cuenta / Marca | Tu empresa | {{ account.name }} · {{ brand.name }} |
| Agente | Quién atiende | {{ agent.available_name }} |
| Fecha y hora | El reloj, en la zona horaria de la cuenta | {{ now.date }} · {{ now.weekday }} |
| Negocio (CRM) | El negocio vinculado al contacto | {{ crm.title }} · {{ crm.value_formatted }} |
| Empresa | La empresa del contacto | {{ organization.legal_name }} |
| Cobro | El cobro más reciente | {{ payment.pay_url }} · {{ payment.due_date_formatted }} |
| Suscripción | El plan recurrente | {{ subscription.next_due_date_formatted }} |
| Pedido | El pedido más reciente | {{ order.amount_formatted }} |
| Agendamiento | La cita del contacto | {{ booking.date_formatted }} · {{ booking.manage_url }} |
| Contrato | El contrato abierto | {{ contract.sign_url }} |
| Tarea | La tarea vinculada al contacto | {{ task.due_at_formatted }} |
| Carrito y checkout | Recuperación de venta | {{ commerce.pay_url }} |
| Producto | El producto citado | {{ product.price_formatted }} |
| Grupo | Grupo de WhatsApp / cohorte | {{ group.invite_url }} |
| Equipo · SLA · Disponibilidad | Operación | {{ team.name }} · {{ wfm.online }} |
| Satisfacción · Interacción | Relación | {{ csat.rating }} · {{ engagement.tier }} |
| Vendedor · Meta · Comisión · Afiliado | Ventas | {{ seller.name }} · {{ affiliate.referral_code }} |
| Anuncio · Lead | Origen pago | {{ lead.headline }} |
| Artículo | Centro de Ayuda | {{ article.url }} |
| Cerebro de la Cuenta | Señales de IA | {{ brain.risk_band }} |
El selector solo muestra los grupos que funcionan en esa pantalla. Una campaña, por ejemplo, no tiene conversación, así que las variables de conversación no se ofrecen allí.
Señales del Cerebro de la Cuenta
Las variables {{ brain.* }} describen la conversación en la que se escribe el mensaje:
{{ brain.risk_score }}y{{ brain.risk_band }}muestran el riesgo de esa conversación o, si todavía no tiene una lectura, el de su contacto. Sin ninguna de las dos, quedan en blanco: nunca muestran el riesgo de otra conversación.{{ brain.insight_type }},{{ brain.insight_severity }}y{{ brain.department }}muestran el insight de esa conversación o de su contacto y, si no hay ninguno, el insight más reciente de la cuenta en conjunto (por ejemplo, un indicador de atención). Los insights de otras conversaciones y los marcados como sensibles nunca aparecen en variables.
El valor que muestra el selector es el mismo que recibe el mensaje al enviarse, para cualquier persona que pueda escribir en esa conversación. En flujos que se ejecutan sin conversación ni contacto, el riesgo es la lectura más reciente de la cuenta y el insight es el más reciente de la cuenta en conjunto.
Fecha y hora en la zona horaria de la cuenta
{{ now.date }}, {{ now.time }}, {{ now.datetime }} y los demás valores de now usan la zona horaria definida en la configuración de la cuenta, también en Flow Builder. Los tokens *_formatted también muestran las horas en esa zona. {{ now.timezone }} y {{ account.timezone }} muestran cuál está vigente. Sin una zona configurada o heredada del onboarding o de la configuración anterior, la cuenta usa UTC, aunque el servidor tenga otra zona.
Los filtros Liquid | date, | datetime y | time_of_day también usan la zona horaria configurada en la cuenta, igual que {{ now.* }} y los tokens *_formatted. Por ejemplo, {{ contact.created_at | datetime }} muestra el instante en el reloj de la cuenta.
Con un formato explícito como | date: '%H:%M', un instante con offset o Z también usa la zona de la cuenta. Una fecha pura conserva el día escrito; una cadena con fecha y hora sin offset conserva sus dígitos escritos, sin cambio de zona.
Las condiciones de fecha de Flow Builder interpretan fechas sin zona indicada, como 2026-10-06 00:00, en la zona horaria de la cuenta. Una fecha ISO con offset explícito conserva su instante. Revisa las comparaciones de flujos publicados que antes dependían de UTC. La condición de estar dentro de N días sigue comparando una duración de N × 24 horas.
Valores formateados
Todo valor de dinero y de fecha existe en dos formas:
- Cruda — el valor tal como está guardado:
{{ crm.value_amount }}→1500.0 - Formateada — lista para que el cliente la lea:
{{ crm.value_formatted }}→$ 1.500,00
Lo mismo vale para las fechas: {{ payment.due_date }} → 2026-08-08 y
{{ payment.due_date_formatted }} → 08/08/2026, siempre en la moneda, el idioma y la zona horaria
de tu cuenta.
Si un valor no tiene versión formateada, puedes formatearlo al vuelo con un filtro:
{{ payment.amount | money: 'ARS' }} → $ 1.500,00
{{ booking.starts_at | datetime }} → 08/08/2026 14:30
Campos personalizados
Los campos personalizados que creaste también se convierten en variables, con el formato
{{ contact.custom_attribute.clave }}. Esto vale para los campos de contacto, conversación, empresa,
negocio, producto, tarea, grupo, cobro, agendamiento, follow-up y contrato.
Casos de uso
- Cobro vencido:
Hola {{ contact.first_name }}, tu factura de {{ payment.amount_formatted }} venció el {{ payment.due_date_formatted }}. Paga aquí: {{ payment.pay_url }} - Recordatorio de cita:
Tu cita es el {{ booking.date_formatted }} a las {{ booking.time_formatted }} con {{ booking.host }}. ¿Necesitas reprogramar? {{ booking.manage_url }} - Contrato:
{{ contact.first_name }}, tu contrato "{{ contract.title }}" está listo: {{ contract.sign_url }} - Invitación al grupo:
¡Bienvenido! Entra en {{ group.name }}: {{ group.invite_url }}
Consejos, límites y buenas prácticas
- Envía siempre una prueba. Es la forma más rápida de ver si la variable trajo el valor esperado.
Esccierra, Backspace borra.Esccierra el selector pero mantiene las{{en el texto — útil cuando sí querías escribir llaves. Para quitar el disparador junto con él, usa Backspace con el campo de búsqueda vacío.- Lo que escribes después de
{{va a la búsqueda, no al mensaje. El campo de búsqueda del selector toma el foco apenas se abre. - Un dato ausente queda vacío. Escribe la frase de modo que siga teniendo sentido sin el valor — evita "Tu pedido de ha llegado".
- En campañas, cuidado extra. Si una variable usada en la plantilla aprobada no se resuelve para un destinatario, ese destinatario es omitido. Prefiere variables que sepas con certeza que existen.
- Documento fiscal: en los mensajes el documento solo aparece enmascarado
(
{{ contact.masked_tax_id }}). El documento completo es exclusivo de los contratos, que la propia persona firma. - No inventes variables. Si no está en el selector, no existe — y saldrá vacía.
- Dónde no aparece el valor. Fuera de una conversación (macro, respuesta rápida, campaña, plantilla de contrato) todavía no hay contacto, así que la lista muestra solo el nombre de la variable. Es el comportamiento correcto: ahí la variable aún no tiene dueño.
- Si tu rol oculta un dato, el valor también aparece oculto. Un agente que ve
a***@example.comen la ficha vea***@example.comen la lista de variables; es el mensaje enviado el que lleva el valor real.
Solución de problemas
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
El mensaje llegó con {{ ... }} literal |
La variable se escribió en un campo que no resuelve variables | Usa el selector: solo aparece donde las variables funcionan |
| La variable salió vacía | El dato no existe para ese contacto | Revisa el registro; ajusta la frase para que funcione sin el valor |
El valor salió como 1500.0 |
Usaste la versión cruda | Cámbiala por {{ ...value_formatted }} |
| La fecha vino con un día de diferencia | La zona horaria de la cuenta no es la esperada | Ajústala en Configuración de la cuenta |
| La campaña omitió destinatarios | Una variable de la plantilla aprobada no tenía valor | Revisa la plantilla y usa variables más seguras |
| El aviso «variables no definidas» aparece en una variable que funciona | La variable realmente no tiene valor para este contacto | Mira el valor junto a ella en la lista: si está en blanco, el dato no existe en la ficha |
Escribí {{ y el selector no se abrió |
Estás en una nota privada, donde el selector no se abre — o las {{ no vinieron al inicio de la línea ni después de un espacio |
Vuelve al modo Respuesta para elegir la variable de la lista; en una anotación interna, escribe el valor completo |
| El panel dice «Sin valor para esta conversación» | El token no tiene dato para este contacto | Revisa la ficha; ajusta la frase para que funcione sin el valor, o elige otra variable |
| El selector se abrió sin el panel de vista previa | No había espacio en la pantalla para él | Ensancha la ventana o dale más altura al editor — la lista funciona igual sin la vista previa |