Cambiar tema

n8n avanzado: Webhook, ramas IF/Switch y diseño de flujos event-driven

Easton editorial illustration: service topology model

El botón naranja “Test Workflow” llevaba pulsado diecisiete veces.

Cada vez había que hacer clic manualmente. ¿No podía funcionar como una API de verdad — alguien llama y el flujo arranca solo? Luego descubrí el Webhook de n8n: en pocas palabras, un timbre; cuando suena, el workflow entra en acción.

Aquí veremos cómo instalar ese timbre y, según quién llame, derivar a distintas ramas. Si ya dominas nodos básicos de n8n pero sientes que tus flujos “esperan pasivamente”, esto puede abrirte camino.

Contenido:

  • Parámetros del nodo Webhook que marean al principio
  • IF vs Switch: cuándo usar cada uno
  • Caso completo de pedidos, listo para importar
  • Trampas habituales en producción

1. Configuración profunda del nodo Webhook

Primero: Webhook y disparador programado no son lo mismo.

El programado es un despertador — suena cada X minutos haga falta o no. Webhook es un timbre — solo suena cuando alguien llama. Eso es lo event-driven. No revisas la puerta cada cinco minutos; el repartidor toca y ya lo sabes. Datos oficiales indican que los webhooks reducen el overhead de polling un 90-95% Reducción de polling — menos recursos, menos espera.

1.1 Qué método HTTP elegir

Lo primero en el nodo Webhook es HTTP Method. n8n soporta DELETE, GET, HEAD, PATCH, POST y PUT.

Guía rápida:

  • POST: recibir datos (formularios, nuevos pedidos). Lo más habitual.
  • GET: disparo simple (enlace corto que ejecuta el flujo).
  • PUT/PATCH: actualizar datos (p. ej. cambio de estado de pedido).

Yo uso POST casi siempre por el body.

1.2 Cuatro modos de respuesta

“Response Mode” define cómo n8n responde al llamador:

ModoCuándo usarlo
ImmediatelyDevuelve 200 al instante, sin esperar el resto. Tareas en segundo plano.
When Last Node FinishesEspera a que termine el flujo. Cuando necesitas devolver datos.
Using ‘Respond to Webhook’ NodeUn nodo intermedio decide la respuesta. Más flexible, un nodo extra.
Streaming responseSalida streaming de Agent IA. Función reciente.

Trampa: con “Immediately” el cliente recibe 200 aunque falle un nodo posterior. En tareas background, añade notificación de errores.

1.3 Parámetros de ruta RESTful

Path admite rutas dinámicas, p. ej. orders/:orderId. Tras los dos puntos va el nombre de variable.

Llamando /orders/12345, en el flujo usas {{ $params.orderId }} y obtienes 12345. Más limpio que query strings.

1.4 Límite de payload

El máximo es 16MB Payload máximo. Por encima, error.

Opciones para archivos grandes:

  1. Variable de entorno N8N_PAYLOAD_SIZE_MAX
  2. Subir a object storage y pasar solo la URL al Webhook

16 MB cubre la mayoría de casos; para ficheros grandes, la segunda opción es más sensata.

2. IF vs Switch: cómo elegir ramas condicionales

Ambos enrutan datos, pero mal elegidos generan IF anidados interminables o un Switch mal dimensionado.

2.1 IF: dos salidas

Solo true y false.

Como preguntar al repartidor: “¿Es perecedero?” Sí → nevera; no → puerta.

Tipos soportados: String, Number, Date & Time, Boolean, Array, Object — contains, regex, greater than, etc.

2.2 Switch: múltiples salidas

Varias salidas. “¿De qué departamento?” Finanzas, técnico, operaciones…

Modos:

  • Rules: una condición por salida. Intuitivo.
  • Expression: JavaScript que devuelve el índice de salida. Lógica compleja.

2.3 Tabla de decisión

EscenarioNodoMotivo
Solo true/falseIFDos salidas bastan
3+ ramasSwitchSin anidar
Lógica complejaSwitch + ExpressionCódigo más rápido que formularios
Merge posteriorIFCombina bien con Merge

Señal de alerta: IF dentro de IF dentro de IF → usa Switch.

2.4 Tipos comparables

String, Number, Date & Time, Boolean, Array, Object — mismos operadores en IF y Switch.

Date & Time sirve para pedidos vencidos, comparando fechas directamente.

3. Caso práctico: procesamiento automático de pedidos

Un amigo con e-commerce revisaba pedidos a mano: panel, avisos, llamadas. Le dije que n8n podía automatizarlo; dudaba.

Dos semanas después, almacén: “¿Cómo es que no se nos escapa ningún pedido?“

3.1 Requisitos

  • pending → avisar almacén
  • paid → email de confirmación
  • shipped → actualizar logística
  • cancelled → reembolso

Cuatro estados → Switch.

3.2 Configuración Webhook

  • HTTP Method: POST
  • Path: orders/:orderId
  • Response Mode: When Last Node Finishes
  • Authentication: Header Auth

Header X-Shop-Secret con valor aleatorio; solo quien lo conoce puede invocar.

3.3 Switch en modo Rules

Regla 1: {{ $json.status }} equals "pending" → pending
Regla 2: {{ $json.status }} equals "paid" → paid
Regla 3: {{ $json.status }} equals "shipped" → shipped
Regla 4: {{ $json.status }} equals "cancelled" → cancelled

Fallback Output: Extra Output para estados desconocidos.

3.4 JSON del flujo completo

Importable en n8n:

{
  "name": "Order Processing",
  "nodes": [
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [250, 300],
      "parameters": {
        "httpMethod": "POST",
        "path": "orders/:orderId",
        "responseMode": "responseNode",
        "authentication": "headerAuth"
      }
    },
    {
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [500, 300],
      "parameters": {
        "mode": "rules",
        "rules": [
          { "output": "pending", "conditions": { "value1": "{{ $json.status }}", "operation": "equals", "value2": "pending" } },
          { "output": "paid", "conditions": { "value1": "{{ $json.status }}", "operation": "equals", "value2": "paid" } },
          { "output": "shipped", "conditions": { "value1": "{{ $json.status }}", "operation": "equals", "value2": "shipped" } },
          { "output": "cancelled", "conditions": { "value1": "{{ $json.status }}", "operation": "equals", "value2": "cancelled" } }
        ],
        "fallbackOutput": "extra"
      }
    },
    {
      "name": "Notify Warehouse",
      "type": "n8n-nodes-base.slack",
      "position": [750, 200]
    },
    {
      "name": "Send Confirmation",
      "type": "n8n-nodes-base.emailSend",
      "position": [750, 300]
    },
    {
      "name": "Update Tracking",
      "type": "n8n-nodes-base.httpRequest",
      "position": [750, 400]
    },
    {
      "name": "Process Refund",
      "type": "n8n-nodes-base.stripe",
      "position": [750, 500]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Switch", "type": "main", "index": 0 }]] },
    "Switch": {
      "main": [
        [{ "node": "Notify Warehouse", "type": "main", "index": 0 }],
        [{ "node": "Send Confirmation", "type": "main", "index": 0 }],
        [{ "node": "Update Tracking", "type": "main", "index": 0 }],
        [{ "node": "Process Refund", "type": "main", "index": 0 }]
      ]
    }
  }
}

Sustituye Slack, Email, HTTP Request y Stripe por tu configuración.

3.5 Prueba y activación

Dos URLs:

  • Test URL: solo al probar manualmente
  • Production URL: activa con el interruptor Active

Flujo: probar con Test URL → activar → configurar Production URL en la plataforma.

Prueba con curl:

curl -X POST https://your-n8n-instance.com/webhook/orders/12345 \
  -H "Content-Type: application/json" \
  -H "X-Shop-Secret: your-secret-key" \
  -d '{"status": "paid", "customer_email": "[email protected]"}'

200 y logs de ejecución = éxito.

4. Evitar problemas en producción

4.1 No escatimes en seguridad

Header Auth es el mínimo. Si la IP del llamador es fija, añade IP Whitelist en opciones avanzadas del Webhook.

JWT Auth es más robusto pero más complejo. Para sistemas propios, Header Auth + IP Whitelist suele bastar.

4.2 Alguien debe enterarse de los errores

Si el Webhook falla, el cliente puede ver solo un 500.

Añade Error Trigger → Slack con mensaje e ID de ejecución. Problemas de madrugada en el móvil, no al día siguiente por quejas.

4.3 Rendimiento: responder rápido

Muchas APIs externas al final del flujo = respuesta lenta y timeout del cliente.

Modo Immediately: 200 al instante, procesamiento en background. El cliente no sabe el resultado final.

Válido para tareas batch o avisos no críticos; no para pagos o consultas en tiempo real.

4.4 Depurar con Executions

Menú Executions: entrada/salida, duración por nodo, errores.

Por defecto se guardan 1000 ejecuciones; ajusta EXECUTIONS_DATA_MAX_AGE o exporta logs.

Logs de Test y Production están separados.


Resumen

Webhook = timbre para n8n. Configura HTTP Method y Response Mode; usa parámetros de ruta cuando puedas.

IF para dos ramas; Switch para tres o más. No anides IF.

El flujo de pedidos es reutilizable; cambia Slack, Email y Stripe. Prueba con Test URL antes de activar.

Seguridad: Header Auth y, si aplica, IP Whitelist. Errores con notificación — si no, ni te enteras.


Configurar un flujo Webhook en n8n

Construir desde cero un flujo de pedidos disparado por Webhook, con ramas condicionales y autenticación

⏱️ Estimated time: 30 min

  1. 1

    Step 1: Configurar el nodo Webhook

    Parámetros básicos:

    • HTTP Method: POST (recibir datos)
    • Path: orders/:orderId (ruta dinámica)
    • Response Mode: When Last Node Finishes (devolver resultado)
    • Authentication: Header Auth
  2. 2

    Step 2: Diseñar ramas Switch

    Cuatro reglas:

    • pending → avisar almacén
    • paid → email de confirmación
    • shipped → actualizar logística
    • cancelled → reembolso

    Fallback Output: Extra Output para estados desconocidos.
  3. 3

    Step 3: Añadir nodos por rama

    Un nodo por salida:

    • Slack: almacén
    • Email: confirmación
    • HTTP Request: logística
    • Stripe: reembolso

    Sustituye por tus servicios.
  4. 4

    Step 4: Configurar seguridad

    Producción:

    • Header Auth: X-Shop-Secret personalizado
    • IP Whitelist: restringir IP
    • Error Trigger: Slack en caso de error
  5. 5

    Step 5: Probar y activar

    Validación:

    • Test URL + curl
    • Revisar Executions
    • Activar Production URL
    • Configurar URL en la plataforma de comercio

FAQ

¿Qué diferencia hay entre Webhook y disparador programado?
Webhook es event-driven: solo ejecuta cuando hay una llamada externa. El programado hace polling cada intervalo fijo. Webhook reduce un 90-95% el overhead de polling; ideal para respuesta en tiempo real.
¿IF o Switch?
Según número de ramas:

• Dos ramas (true/false) → IF
• Tres o más → Switch
• Lógica compleja → Switch + Expression

Si anidas IF, pasa a Switch.
¿Cuál es el límite de payload del Webhook?
Por defecto 16 MB. Para más, ajusta N8N_PAYLOAD_SIZE_MAX o sube el archivo a object storage y pasa solo la URL.
¿Cómo configurar autenticación?
Recomendado:

• Header Auth con header y secreto personalizados
• IP Whitelist
• JWT Auth (más seguro, más complejo)

En desarrollo Header Auth basta; en producción añade IP Whitelist.
¿Immediately vs When Last Node Finishes?
Immediately devuelve 200 sin esperar el resto del flujo; apto para tareas en background. When Last Node Finishes espera el resultado final; apto cuando hay que devolver datos. Con Immediately, errores posteriores no llegan al cliente.
¿Cómo depurar un flujo Webhook?
Executions en el menú lateral:

• Entrada/salida y tiempos por nodo
• Logs separados Test vs Production
• Por defecto 1000 ejecuciones; ajustable por variable de entorno
¿Qué tener en cuenta en producción?
Puntos clave:

• Header Auth + IP Whitelist
• Error Trigger + Slack
• Immediately + procesamiento background en alto tráfico
• Exportar o limpiar logs periódicamente
• Test URL para pruebas; Production URL solo tras validar

6 min de lectura · Publicado el: 9 abr 2026 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog