1 / 15
← Inicio

⚙️ Sistemas Funcionales

Patrones y conectores que hacen tu automatización PRO

Los sistemas funcionales son pequeños patrones y nodos que hacen que tus flujos sean más robustos, escalables y mantenibles.

Son como los tornillos de una máquina: pequeños pero esenciales.

📦
Buffers
Acumula datos antes de procesarlos
🔀
Enrutamiento
Envía datos por diferentes caminos
🔄
Retry & Error
Maneja fallos con elegancia
📬
Colas
Procesa tareas en orden

📦 Buffer de Mensajes

Acumula antes de procesar

Un buffer acumula múltiples items antes de procesarlos juntos. Útil para optimizar llamadas a APIs o bases de datos.

📨
Mensajes
BUFFER
📧
📧
📧
📧
📧
Procesar Batch
💡 Casos de uso
Envío de emails: Acumula 100 emails y envía en un solo batch
Inserts a DB: En vez de 1000 inserts, haz 10 de 100 registros
API con límites: Agrupa requests para no exceder rate limits
En n8n: Split In Batches
Trigger → Split In Batches (batch size: 50) → Proceso → Loop

Cada iteración procesa 50 items
Espera entre batches para no sobrecargar

🔄 Split In Batches

El nodo más útil que no conocías

📊 ¿Qué hace?
Divide un array grande en grupos pequeños y los procesa uno por uno. Perfecto para no sobrecargar APIs o bases de datos.
1
Tienes: 1000 contactos para actualizar
2
Split In Batches: Divide en grupos de 50
3
Procesa: Actualiza 50 contactos
4
Loop: Vuelve al Split para el siguiente batch
5
Termina: Cuando no hay más batches
Configuración típica
Batch Size: 50          // Items por batch
Options:
  - Reset: false        // Continuar donde quedó
  - Pause Between: 1s   // Esperar entre batches (rate limiting)

✅ Pro Tips:

• Usa "Pause Between Batches" para respetar rate limits de APIs
• Combínalo con Error Handling para reintentar batches fallidos
• El batch size ideal depende de la API (revisa su documentación)

🔗 Merge Node

Combina datos de múltiples fuentes

El nodo Merge combina datos de dos o más ramas de tu flujo. Esencial cuando necesitas juntar información de diferentes fuentes.

Append
Junta todos los items de ambas ramas en una sola lista. [A,B] + [C,D] = [A,B,C,D]
🔄
Combine
Combina items por posición o por campo clave (como un JOIN de SQL).
Wait
Espera a que lleguen datos de TODAS las ramas antes de continuar.
Ejemplo: Combinar por campo clave
Rama 1 (Clientes):
[{id: 1, name: "Juan"}, {id: 2, name: "Ana"}]

Rama 2 (Pedidos):
[{customer_id: 1, total: 100}, {customer_id: 2, total: 200}]

Merge (Combine by: id = customer_id):
[{id: 1, name: "Juan", total: 100}, {id: 2, name: "Ana", total: 200}]

💡 Caso común: Tienes dos APIs (clientes y pedidos) y necesitas combinar la información para generar un reporte unificado.

🔀 Enrutamiento Condicional

Envía datos por el camino correcto

📦 Datos entrantes
🔀
ROUTER
¿Qué condición cumple?
VIP
📧
Normal
🗑️
Spam
🛠️ Nodos para enrutamiento en n8n
IF: 2 salidas (true/false)
Switch: Múltiples salidas por valor
Filter: Solo deja pasar lo que cumple condición
Route: Enrutamiento avanzado con reglas
Ejemplo: Switch por tipo de cliente
Switch Node:
  Field: {{ $json.customer_type }}
  
  Rules:
    - "vip" → Rama 1 (Atención prioritaria)
    - "normal" → Rama 2 (Proceso estándar)
    - "trial" → Rama 3 (Onboarding especial)
    - default → Rama 4 (Revisar manualmente)

🔍 Filter Node

Deja pasar solo lo que necesitas

📊
100 items
🔍
FILTER
status = "active"
25 items
💡 Diferencia con IF
IF: Divide en 2 ramas (true y false van a diferentes lugares)
Filter: Solo una salida (descarta lo que no cumple)
Condiciones comunes en Filter
// Solo emails de Gmail
{{ $json.email.includes('@gmail.com') }}

// Solo pedidos mayores a $100
{{ $json.total > 100 }}

// Solo registros con campo no vacío
{{ $json.name !== '' && $json.name !== null }}

// Múltiples condiciones
{{ $json.status === 'active' && $json.age >= 18 }}

💡 Pro Tip: Usa Filter al inicio de tus flujos para eliminar datos basura antes de procesarlos. Ahorra tiempo y recursos.

⏰ Wait Node

Pausa inteligente en tus flujos

El nodo Wait pausa la ejecución por un tiempo específico o hasta que ocurra un evento externo.

⏱️
Wait Time
Espera un tiempo fijo: 5 segundos, 1 hora, 3 días... Útil para rate limiting o delays entre acciones.
📅
Wait Until
Espera hasta una fecha/hora específica. "Enviar recordatorio el viernes a las 9am"
🔔
Wait for Webhook
Pausa hasta recibir un webhook externo. Útil para flujos de aprobación.
Ejemplo: Flujo de aprobación
1. Usuario solicita vacaciones
2. Enviar email al manager con link de aprobación
3. WAIT for Webhook (espera clic en "Aprobar" o "Rechazar")
4. Procesar respuesta y notificar al usuario

⚠️ Cuidado:

Los nodos Wait en modo webhook mantienen la ejecución "pausada" en n8n. Si tienes muchos flujos pausados, puede afectar el rendimiento. Considera usar un sistema de colas externo para flujos de larga duración.

🚨 Error Handling

Cuando las cosas salen mal

Los errores van a pasar. La pregunta es: ¿tu flujo está preparado? Un buen manejo de errores convierte un flujo frágil en uno robusto.

Stop on Error
El flujo se detiene completamente. Default en n8n. Simple pero puede perder datos.
⏭️
Continue on Error
Ignora el error y continúa con el siguiente item. Útil para procesos batch donde un fallo no debe parar todo.
🔀
Error Workflow
Ejecuta un flujo específico cuando hay error. Envía alertas, guarda logs, intenta recuperación.
Configurar Error Workflow
En el nodo → Settings → On Error:
  - "Stop Workflow" (default)
  - "Continue" (salta al siguiente item)
  - "Continue (using error output)" (envía error a otra rama)

En Workflow Settings:
  - Error Workflow: Selecciona un workflow que reciba los errores
💡 Pattern: Error Handler
Crea un workflow dedicado para errores que:
• Guarde el error en una DB o log
• Envíe alerta a Slack/Email
• Guarde los datos que fallaron para reprocesar después

🔄 Retry Logic

Si falla, intenta de nuevo

Intento 1
Error 500
Intento 2
Timeout
Intento 3
¡Éxito!
⚙️ Configuración de Retry en n8n
En el nodo HTTP Request
Settings → Retry On Fail:
  - Max Tries: 3
  - Wait Between Tries: 1000ms (1 segundo)
  - Backoff: Exponential (1s, 2s, 4s...)

💡 Exponential Backoff: Cada reintento espera más tiempo. Esto evita sobrecargar un servidor que está teniendo problemas.

Cuándo usar Retry
✅ Errores temporales: 
   - 500, 502, 503, 504 (server errors)
   - Timeouts
   - Rate limits (429)

❌ NO usar retry para:
   - 400 Bad Request (tu request está mal)
   - 401/403 (problema de auth)
   - 404 Not Found (el recurso no existe)

🔔 Webhooks

Tu flujo escucha al mundo

🌐
Servicio Externo
Stripe, GitHub, etc.
POST /webhook
🤖
n8n Webhook
Trigger del flujo
🛠️ Tipos de Webhook en n8n
Webhook: URL pública que recibe datos externos
Webhook Response: Permite responder al servicio que llamó
Wait for Webhook: Pausa el flujo hasta recibir un webhook
Ejemplo: Webhook de Stripe
URL: https://tu-n8n.com/webhook/stripe-payments

Stripe envía:
{
  "type": "payment_intent.succeeded",
  "data": {
    "object": {
      "amount": 2000,
      "customer": "cus_123..."
    }
  }
}

Tu flujo: 
  Webhook → IF (type == "payment_intent.succeeded") → Actualizar DB

🔒 Seguridad en Webhooks:

• Valida la firma del webhook (Stripe, GitHub envían headers de verificación)
• Usa HTTPS siempre
• Limita los IPs que pueden llamar si es posible
• No expongas información sensible en la URL

🚦 Rate Limiting

No sobrecargues las APIs

La mayoría de APIs tienen límites: 100 requests/minuto, 1000/hora, etc. Si los excedes, te bloquean. Rate limiting evita esto.

⏱️
Delay entre requests
Espera X milisegundos entre cada llamada. Simple pero efectivo para flujos pequeños.
📦
Batching
Agrupa múltiples operaciones en una sola llamada. Reduce el número total de requests.
📊
Rate Limiter (Redis)
Cuenta requests en una ventana de tiempo. Pausa cuando alcanzas el límite.
Implementar delay en n8n
Opción 1: Wait Node
  Loop → Wait (500ms) → HTTP Request → Loop

Opción 2: Split In Batches
  Split In Batches → HTTP Request
  Options: Pause Between Batches = 1000ms

Opción 3: Code Node (avanzado)
  await new Promise(resolve => setTimeout(resolve, 500));
📋 Límites comunes de APIs
OpenAI: 60-10000 RPM según tier
Stripe: 100 reads/sec, 100 writes/sec
HubSpot: 100 requests/10 segundos
Airtable: 5 requests/segundo

📬 Colas de Mensajes

Procesa tareas de forma ordenada

Task 1
Task 2
Task 3
Task 4
Task 5
Worker

Una cola almacena tareas para procesarlas después, una por una. Perfecto cuando recibes muchos eventos y no puedes procesarlos todos al instante.

🛠️ Implementar colas en n8n
Redis: LPUSH para agregar, RPOP para sacar
RabbitMQ: Nodo nativo en n8n
AWS SQS: Colas managed de Amazon
Database: Tabla con status (pending/processing/done)
Pattern: Cola con Redis
Flujo 1 (Productor):
  Webhook → Redis (LPUSH "tasks" task_data)

Flujo 2 (Consumidor):
  Schedule Trigger (cada 5s) → Redis (RPOP "tasks") → 
  IF (hay tarea) → Procesar → Loop

✅ Ventajas de las colas:

• Desacoplan productor y consumidor
• Manejan picos de tráfico sin perder datos
• Permiten reintentos si el procesamiento falla
• Escalan horizontalmente (múltiples workers)

🔌 Conectores Útiles

Pequeños nodos, gran impacto

🔄
Loop Over Items
Itera sobre cada item
📊
Aggregate
Suma, cuenta, agrupa
🔀
Sort
Ordena por campo
🎯
Limit
Toma los primeros N
🔗
Set
Modifica/añade campos
🗑️
Remove Duplicates
Elimina repetidos
📝
Rename Keys
Renombra campos
🔧
Code
JavaScript custom
📋
Edit Fields
Transforma datos
📤
Respond to Webhook
Respuesta HTTP

💡 Pro Tip: Combina estos nodos para crear transformaciones de datos complejas. Filter → Sort → Limit → Set es un patrón muy común.

💼 Ejemplo: Sistema Completo

Procesador de pedidos con todos los patrones

1
Webhook - Recibe pedidos de la tienda online
2
Filter - Solo pedidos con status "paid"
3
Switch - Envío nacional vs internacional
4
HTTP Request - Crear envío en courier (con retry)
5
Merge - Combina datos del pedido + tracking
6
Split In Batches - Actualiza DB en lotes de 10
7
Send Email - Notifica al cliente con tracking
8
Error Workflow - Si algo falla, alerta a Slack

🎯 Patrones usados:

✅ Webhook (entrada de datos)
✅ Filter (limpieza de datos)
✅ Switch (enrutamiento condicional)
✅ Retry (resiliencia en APIs)
✅ Merge (combinar datos)
✅ Batching (optimización)
✅ Error Handling (robustez)

🧠 Quiz Final

¡Demuestra que dominas los sistemas funcionales!

Tienes que procesar 5000 registros y la API destino tiene un límite de 100 requests/minuto. ¿Qué nodo usarías?
A) Loop Over Items sin delay
B) Split In Batches con pause entre batches
C) Procesar todos en paralelo
D) Usar solo el nodo Filter
Necesitas combinar datos de dos APIs: una con clientes y otra con sus pedidos. ¿Qué modo del Merge Node usarías?
A) Append (juntar todo)
B) Combine by Field (JOIN por customer_id)
C) Wait (esperar a ambos)
D) No se puede hacer
Un HTTP Request está fallando con error 503. ¿Cuál es la mejor estrategia?
A) Ignorar el error y continuar
B) Detener el flujo inmediatamente
C) Retry con exponential backoff
D) Cambiar a otra API diferente
¿Cuál es la diferencia principal entre IF y Filter nodes?
A) No hay diferencia
B) IF tiene 2 salidas, Filter solo 1 (descarta lo que no cumple)
C) Filter es más rápido
D) IF solo funciona con números
Tu webhook recibe 1000 pedidos por minuto en picos. ¿Cómo manejarías esto?
A) Procesar todo en tiempo real sin cola
B) Rechazar pedidos cuando hay mucha carga
C) Cola de mensajes (Redis/RabbitMQ) con workers
D) Aumentar el timeout del webhook