Expresiones — item actual
{{ $json.campo }} # campo del item actual
{{ $json.objeto.subcampo }} # campo anidado
{{ $json.lista[0] }} # primer elemento de array
{{ $json.lista[0].nombre }} # campo dentro de array
Referenciar otros nodos
{{ $('Nodo').item.json.campo }} # item actual del nodo
{{ $('Nodo').all()[0].json.campo }} # primer item del nodo
{{ $('Nodo').all().length }} # cuántos items tiene
Fecha y hora
{{ $now }} # fecha/hora actual
{{ $now.toISO() }} # "2025-01-15T10:30:00Z"
{{ $now.format('YYYY-MM-DD') }} # "2025-01-15"
{{ $now.format('DD/MM/YYYY HH:mm') }}# "15/01/2025 10:30"
{{ $now.minus({days: 7}).toISO() }} # hace 7 días
Strings
{{ $json.texto.toUpperCase() }} # MAYÚSCULAS
{{ $json.texto.toLowerCase() }} # minúsculas
{{ $json.texto.trim() }} # quitar espacios
{{ $json.texto.includes('hola') }} # true/false
{{ $json.texto.replace('a','b') }} # reemplazar
{{ $json.texto.split(',') }} # dividir en array
{{ $json.a + ' ' + $json.b }} # concatenar
Números y arrays
{{ $json.precio * 1.21 }} # calcular IVA
{{ Math.round($json.valor) }} # redondear
{{ parseInt($json.texto) }} # texto a entero
{{ $json.numero.toFixed(2) }} # 2 decimales
{{ $json.lista.length }} # longitud
{{ $json.lista.join(', ') }} # unir con coma
{{ $json.lista.filter(x => x > 5) }}# filtrar
{{ $json.lista.map(x => x * 2) }} # transformar
Condicionales
{{ $json.activo ? 'SÍ' : 'NO' }}
{{ $json.precio > 100 ? 'caro' : 'barato' }}
{{ $json.nombre || 'Sin nombre' }} # valor por defecto
Variables especiales
| Variable | Descripción |
$json | Datos del item actual |
$binary | Datos binarios del item |
$now | Fecha/hora actual (luxon) |
$today | Fecha de hoy (sin hora) |
$workflow.name | Nombre del flujo |
$execution.id | ID de la ejecución |
$execution.mode | "manual" o "trigger" |
$env.MI_VAR | Variable de entorno |
Nodos más usados
Webhook
- Trigger que recibe peticiones HTTP
- Método: GET, POST, PUT, DELETE
- Respuesta: inmediata o al final del flujo
HTTP Request
- Llama cualquier API externa
- Configurar: Method, URL, Headers, Body
- Auth: Bearer Token, Basic Auth, etc.
Set
- Crear o modificar campos del item
- Modo "Keep Only Set": elimina el resto
IF / Switch
- IF: divide en rama true y false
- Switch: múltiples ramas por valor
- Condiciones: igual, mayor, contiene, regex…
Code (JavaScript)
- Lógica personalizada en JS
return items para pasar items al nodo siguiente
Merge / Loop Over Items / Wait
- Merge: une dos ramas (Append, By Index, By Key)
- Loop: itera items de uno en uno
- Wait: pausa X segundos (útil para rate limits)
Código en el nodo Code
// Modificar y devolver items
return items.map(item => ({
json: {
...item.json, // mantener campos existentes
nuevo_campo: 'valor',
precio_iva: item.json.precio * 1.21
}
}));
// Filtrar items
return items.filter(item => item.json.activo === true);
// Crear items nuevos
return [
{ json: { id: 1, nombre: 'Primero' } },
{ json: { id: 2, nombre: 'Segundo' } }
];
Atajos de teclado
| Atajo | Acción |
Ctrl/Cmd + S | Guardar flujo |
Ctrl/Cmd + Z | Deshacer |
Ctrl/Cmd + A | Seleccionar todo |
Ctrl/Cmd + C / V | Copiar / Pegar nodos |
Delete | Eliminar nodo |
Ctrl/Cmd + Enter | Ejecutar flujo |
Scroll | Zoom in/out |
Espacio + Drag | Mover el canvas |
APIs públicas gratuitas para practicar
| API | URL | Descripción |
| Open-Meteo | https://api.open-meteo.com/v1/forecast?latitude=40.42&longitude=-3.70¤t_weather=true | Clima en tiempo real |
| JSONPlaceholder | https://jsonplaceholder.typicode.com/posts | Posts de prueba |
| Cat Facts | https://catfact.ninja/fact | Datos aleatorios |
| Random User | https://randomuser.me/api/ | Usuarios aleatorios |
| IP Info | https://ipinfo.io/json | Info de tu IP |
| Chuck Norris | https://api.chucknorris.io/jokes/random | Chistes aleatorios |
Errores comunes y soluciones
| Error | Causa | Solución |
Cannot read property of undefined | Campo no existe en el JSON | Usar $json.campo || 'default' |
Workflow did not return data | Último nodo no devuelve nada | Revisar que Respond to Webhook esté al final |
401 Unauthorized | Credenciales incorrectas | Verificar API key o token |
429 Too Many Requests | Rate limit de la API | Agregar nodo Wait entre llamadas |
Test URL only works in test mode | URL de test en producción | Usar Test URL con "Listen for test event" |
Probar webhooks con curl
# GET simple
curl https://TU-N8N/webhook-test/mi-flujo
# POST con JSON
curl -X POST https://TU-N8N/webhook-test/mi-flujo \
-H "Content-Type: application/json" \
-d '{"nombre": "Ana", "email": "ana@ejemplo.com"}'
# POST con autenticación
curl -X POST https://TU-N8N/webhook/mi-flujo \
-H "Content-Type: application/json" \
-H "Authorization: Bearer mi-token" \
-d '{"dato": "valor"}'