Chuleta de n8n: expresiones, datos y errores típicos

Todo lo dinámico en n8n va entre {{ }}. Dentro tienes cuatro variables ($json, $node, $now, $env) y una trampa que se lleva por delante a casi todo el mundo: los datos del webhook no están en la raíz, están bajo .body.

⬇️ Descargar en PDF (gratis, sin registro)

Variables y sintaxis básica

Qué escribesQué haceCuándo usarlo
{{ }}Marca lo que n8n tiene que evaluar. Sin ellas, es texto literal.Siempre que el valor dependa de los datos. Nunca las anides.
$json.campoUn campo de la salida del nodo anterior.El caso normal: trabajar con lo que acaba de llegar.
$node["Nombre"].json.campoUn campo de cualquier nodo anterior por su nombre.Cuando necesitas algo de dos o tres pasos atrás, no del inmediato.
$nowLa fecha y hora actuales.Sellos de tiempo, nombres de fichero, filtros por fecha.
$env.CLAVEUna variable de entorno de la instancia.Con cuidado: muchas instancias lo bloquean. Para secretos, usa credenciales.
$json['con espacios']Acceso por corchetes.Obligatorio si la clave lleva espacios, acentos o símbolos.

Dónde están tus datos

El 90% de los "no me llega el dato" se resuelve en esta tabla.

De dónde vieneCómo se accedeLa trampa
Nodo Webhook{{$json.body.email}}El error nº1. El nodo envuelve los datos bajo .body para conservar cabeceras, params y query. En la raíz no hay nada tuyo.
Campo anidado{{$json.user.email}}Si el padre no existe, el error dirá "cannot read property of undefined". Revisa la ruta entera, no la última clave.
Elemento de un array{{$json.items[0].name}}Los índices empiezan en 0. El último: {{$json.items[$json.items.length - 1].name}}.
Otro nodo, con espacios en el nombre{{$node["HTTP Request"].json.data}}Distingue mayúsculas. "http request" no encuentra nada.
Webhook desde otro nodo{{$node["Webhook"].json.body.email}}El .body sigue ahí aunque referencies el nodo por su nombre.
Cuántos elementos hay{{$json.users.length}}Sin paréntesis: es una propiedad, no un método.

Transformar el dato al vuelo

Qué escribesQué haceCuándo usarlo
$now.toFormat('yyyy-MM-dd')Formatea la fecha (por debajo es Luxon).Nombres de fichero, campos de fecha, agrupar por día.
$now.plus({days: 7})Suma tiempo. minus resta.Vencimientos, recordatorios, ventanas de fechas.
$json.email.toLowerCase()Normaliza texto. También trim, replace, substring.Antes de comparar o de usar el valor como clave.
$json.tags.split(',').join(', ')Parte y vuelve a unir.Para convertir listas separadas por comas en algo legible.
$json.precio * 1.21Aritmética directa.IVA, descuentos, totales. Sin nodo extra.
$json.email || '[email protected]'Valor por defecto si viene vacío.Para que un campo ausente no reviente el resto del flujo.
$json.estado === 'activo' ? 'Sí' : 'No'Condicional en una línea.Textos que cambian según un campo, sin montar una rama entera.

Dónde NO van las expresiones

SitioQué pasa si lo intentasQué hacer
Nodo CodeEscribes JavaScript, no expresiones. '={{$json.email}}' es una cadena de texto literal, no el dato.Acceso directo: $json.email, o $input.all() para todos los elementos.
Ruta del webhookNo se evalúa. La ruta tiene que ser estática.Un texto fijo, tipo formulario-contacto.
Campos de credencialesNo se evalúan y, si funcionara, dejarías el secreto a la vista.El sistema de credenciales de n8n, para eso está.

Errores típicos

Preguntas frecuentes

¿Por qué mi expresión sale como texto literal?

Porque le faltan las llaves dobles. n8n solo evalúa lo que va entre {{ y }}; cualquier otra cosa la trata como texto. Ojo también con las llaves triples: envolver dos veces tampoco funciona.

El webhook recibe los datos pero el campo llega vacío, ¿por qué?

Es el error más repetido de n8n. El nodo Webhook no deja los datos en la raíz: los mete bajo .body, para no pisar las cabeceras, los parámetros y la query. Donde escribiste $json.email tiene que poner $json.body.email.

¿Puedo usar expresiones dentro de un nodo Code?

No, y es una confusión habitual. Dentro de un nodo Code escribes JavaScript normal y accedes directamente: $json.email, sin llaves y sin comillas. Las llaves solo valen en los campos de los nodos, no dentro del código.

¿Cómo referencio un nodo cuyo nombre lleva espacios?

Con corchetes y comillas: $node["HTTP Request"].json.data. El nombre tiene que coincidir exactamente con el del lienzo, mayúsculas incluidas: "http request" no encuentra el nodo.

¿Cómo pongo la fecha de hoy con el formato que quiero?

Con $now y toFormat: $now.toFormat('yyyy-MM-dd'). Para sumar o restar tiempo, plus y minus con un objeto: $now.plus({days: 7}). Por debajo es Luxon, así que sus formatos valen.

Vídeos relacionados

¿Quieres pasar de flujos sueltos a agentes que trabajan solos? El curso de n8n de Frogames va paso a paso y con proyectos reales.

Ver los cursos de Frogames →