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: rechazadosrefunds_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
| Concepto | Dó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