Módulo 7: Wait Nodes y Flujos Asíncronos

Mini-Proyecto: Workflow con Espera y Aprobación

Descripción de la cápsula

Cierre del módulo. Construyes workflow real con espera humana integrada: solicitud de reembolso que requiere aprobación de admin si monto > $500, con timeout y escalación.


Lo que vas a aprender

  • Integrar HITL en workflow productivo
  • Manejar timeouts y escalación
  • Auditar decisiones

El escenario

Caso: sistema de refunds.

  • Cliente solicita refund vía form
  • Si monto ≤ $500: auto-aprobar
  • Si monto > $500: requiere aprobación de admin (Slack interactivo)
  • Admin tiene 24h para aprobar/rechazar
  • Si timeout: escalar al manager

Workflow

[Webhook: refund request]
   │
[Set: enrich datos]
   │
[IF: monto > 500]
├─ TRUE (alto monto) → [HITL: Slack a admin]
│                       │
│                       [Wait for Webhook: 24h timeout]
│                       │
│                       [IF: timeout?]
│                       ├─ TRUE → [Slack a manager: "refund pending escalado"] → cancel
│                       └─ FALSE → [Switch action]
│                                   ├─→ "approve" → procesar refund
│                                   └─→ "reject" → notificar cliente "rechazado"
│
└─ FALSE (monto bajo) → procesar refund automático

Implementación

1. Webhook con auth

Webhook: POST /refund-request
Auth: Header Auth X-Form-Secret

2. Set para enriquecer

- is_high_amount: $json.body.amount > 500
- formatted_amount: '$' + $json.body.amount.toFixed(2)
- request_id: $json.body.request_id || 'auto-' + DateTime.now().toMillis()

3. IF para bifurcar

[IF: is_high_amount]
├─ TRUE → HITL path
└─ FALSE → auto path

4. Auto path (monto bajo)

[Procesar refund (HTTP a sistema de pagos)]
   │
[Send Email al cliente: "tu refund de {{ formatted_amount }} fue procesado"]
   │
[Sheet log: 'refunds_processed' con auto=true]

5. HITL path (monto alto)

[Slack: send message con Block Kit]
  Mensaje:
  ⚠️ Refund pendiente: {{ formatted_amount }}
  Cliente: {{ $json.body.customer_email }}
  Razón: {{ $json.body.reason }}

  [Block Kit con buttons]:
  - ✅ Aprobar (link: $resumeUrl?action=approve)
  - ❌ Rechazar (link: $resumeUrl?action=reject)
   │
[Wait for Webhook: timeout 24 hours]

6. Después del Wait

[IF: $json.error?.message === 'TIMEOUT']  // depende de versión n8n
├─ TRUE → [Slack a manager + Sheet log 'refunds_escalated']
└─ FALSE → [Switch sobre $json.body.action]
            ├─→ "approve" → procesar refund + Sheet log con approver
            └─→ "reject" → notificar cliente + Sheet log

7. Logging

Sheets:

  • refunds_processed: todos los refunds (auto y aprobados)
  • refunds_rejected: rechazados
  • refunds_escalated: escalados a manager por timeout

8. Error Workflow

Asignar [GUARDIAN] como Error Workflow.


Test scenarios

Test 1: Monto bajo (auto)

POST con monto = $100. Verifica:

  • IF va por FALSE (auto)
  • Refund procesado
  • Email al cliente
  • Sheet 'refunds_processed' tiene fila con auto=true

Test 2: Monto alto - aprobar

POST con monto = $1000. Verifica:

  • Slack llega al admin con botones
  • Click "Aprobar" → workflow reanuda
  • Refund procesado
  • Sheet log con approver

Test 3: Monto alto - rechazar

POST con monto = $1000. Click "Rechazar".

  • Cliente recibe email "rechazado"
  • Sheet 'refunds_rejected' con fila

Test 4: Monto alto - timeout

POST con monto = $1000. Esperar 24h sin click (o reducir timeout para test).

  • Slack al manager llega
  • Sheet 'refunds_escalated' con fila

Variantes

Variante 1: Form en lugar de Slack

Usar Tally form en lugar de Slack buttons. Pros: más datos, contras: más fricción.

Variante 2: Multi-aprobación

Para monto > $5000: 2 aprobaciones. Wait después del primer aprobador, después second Wait con el segundo.

Variante 3: Auditoría completa

En cada Sheet log incluir: request_id, monto, decisión, approver (de Slack metadata), timestamp.


Lo que aplicaste

ConceptoDónde
HITL (cápsula 06)Slack actionable
Wait for Webhook (05)Pause hasta decisión
Timeout management (02)Escalación
Auditoría (M06)Sheets logging
Error Workflow[GUARDIAN] asignado

Resumen y siguiente paso

Lo que construiste:

  • Workflow real con human-in-the-loop
  • Manejo de timeouts y escalación
  • Auditoría completa

Lo que sigue (Módulo 8 — Proyecto Sistema Alertas):

Cierre de toda la guía G2. Mini-proyecto integrador grande: sistema de alertas programadas que combina TODOS los patrones de G2 — triggers avanzados, branching, loops, merge, scheduling, error handling, wait.


Creado: Mayo 11, 2026 Versión: 1.0