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

VariableDescripción
$jsonDatos del item actual
$binaryDatos binarios del item
$nowFecha/hora actual (luxon)
$todayFecha de hoy (sin hora)
$workflow.nameNombre del flujo
$execution.idID de la ejecución
$execution.mode"manual" o "trigger"
$env.MI_VARVariable 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

AtajoAcción
Ctrl/Cmd + SGuardar flujo
Ctrl/Cmd + ZDeshacer
Ctrl/Cmd + ASeleccionar todo
Ctrl/Cmd + C / VCopiar / Pegar nodos
DeleteEliminar nodo
Ctrl/Cmd + EnterEjecutar flujo
ScrollZoom in/out
Espacio + DragMover el canvas

APIs públicas gratuitas para practicar

APIURLDescripción
Open-Meteohttps://api.open-meteo.com/v1/forecast?latitude=40.42&longitude=-3.70&current_weather=trueClima en tiempo real
JSONPlaceholderhttps://jsonplaceholder.typicode.com/postsPosts de prueba
Cat Factshttps://catfact.ninja/factDatos aleatorios
Random Userhttps://randomuser.me/api/Usuarios aleatorios
IP Infohttps://ipinfo.io/jsonInfo de tu IP
Chuck Norrishttps://api.chucknorris.io/jokes/randomChistes aleatorios

Errores comunes y soluciones

ErrorCausaSolución
Cannot read property of undefinedCampo no existe en el JSONUsar $json.campo || 'default'
Workflow did not return dataÚltimo nodo no devuelve nadaRevisar que Respond to Webhook esté al final
401 UnauthorizedCredenciales incorrectasVerificar API key o token
429 Too Many RequestsRate limit de la APIAgregar nodo Wait entre llamadas
Test URL only works in test modeURL de test en producciónUsar 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"}'