Módulo 7: Wait Nodes y Flujos Asíncronos
Wait Until: Programar Acciones Futuras
Descripción de la cápsula
Wait Until pausa hasta un timestamp absoluto. Útil cuando sabes la fecha/hora exacta (cumpleaños del cliente, día de evento, hora específica de campaña).
Lo que vas a aprender
- ✅ Configurar Wait Until con expressions dinámicas
- ✅ Manejar timezones correctamente
- ✅ Casos típicos de scheduling per-item
Configuración
Wait node con:
- Mode: Wait Until
- Until: timestamp ISO o expression
Expression dinámica
// 3 días desde ahora
{{ DateTime.now().plus({ days: 3 }).toISO() }}
// Una hora antes de la cita del cliente
{{ DateTime.fromISO($json.appointment_date).minus({ hours: 1 }).toISO() }}
// El próximo lunes 9am
{{ DateTime.now().setZone('America/Mexico_City').plus({ weeks: 1 }).set({ weekday: 1, hour: 9, minute: 0 }).toISO() }}
Casos típicos
Caso 1: Recordatorio antes de evento
[Trigger: nueva reservación]
│
[Wait Until: $json.date - 24 horas]
│
[Send Email: recordatorio]
Cada reservación tiene su propia ejecución que despierta 24h antes de la fecha.
Caso 2: Cumpleaños
[Trigger: cliente nuevo]
│
[Set: fecha del próximo cumpleaños]
│
[Wait Until: próximo cumpleaños]
│
[Send Email: feliz cumpleaños + descuento]
│
[Wait Until: siguiente cumpleaños (+ 1 año)]
│
... loop
(Loop infinito — un workflow por cliente que vive años.)
Realmente este caso es mejor con Schedule diario que filtra cumpleaños de hoy. Wait Until per-customer escala mal.
Caso 3: Lanzamiento de campaña
[Manual Trigger]
│
[Sheet: leer suscriptores]
│
[Wait Until: 2026-06-01T09:00:00 CDMX]
│
[Send Email: campaña]
Workflow se "arma" pero espera al día específico.
Caso 4: Trial expiration
[Trigger: nuevo trial]
│
[Wait Until: $json.signup_date + 14 días]
│
[IF: usuario sigue activo y no upgrade?]
└─ TRUE → [Send Email: "tu trial vence mañana"]
Wait Until con timezone
// 9am CDMX el próximo lunes
{{
DateTime.now()
.setZone('America/Mexico_City')
.plus({ weeks: 1 })
.set({ weekday: 1, hour: 9, minute: 0, second: 0 })
.toISO()
}}
.setZone() convierte a CDMX. .set() ajusta a 9am lunes. .toISO() produce timestamp con offset apropiado.
Limitaciones
Wait muy lejos en el futuro
Wait hasta dentro de años es teóricamente posible pero arriesgado:
- n8n versions cambian
- Plan limits
- Servidor outages
Mejor: usar Schedule alternativo (cápsula 03) para waits de meses+.
Cambios en datos durante el Wait
Si el workflow espera 30 días, los datos pineados al inicio están outdated al despertar.
Solución: al despertar, re-leer datos críticos antes de actuar.
[Wait Until: 30 días]
│
[HTTP: leer estado actual del cliente] ← refresh
│
[procesamiento con datos frescos]
Trampas comunes
Trampa 1: Wait Until con timestamp pasado
Qué pasa: Wait Until a 2026-05-01 cuando hoy es 2026-05-11. Timestamp es pasado.
Comportamiento: depende de versión — algunos n8n ejecutan inmediatamente, otros lanzan error.
Cómo evitar: Validar que el timestamp es futuro antes del Wait:
[IF: $json.timestamp > $now]
├─ TRUE → continuar con Wait
└─ FALSE → skip / log "fecha pasada"
Trampa 2: Timezone implícita
(Cubierto en cápsula 02 también.) Siempre explícita la timezone.
Trampa 3: Workflow vive mucho tiempo
Wait Until de 1 año → execution en estado "Waiting" 1 año. Si abres Executions panel, ves 1000s de waiting executions.
Cómo evitar: Wait Until largos = considerar Schedule alternativo. Más limpio.
Trampa 4: Olvidar refresh de datos
Qué pasa: Wait 30 días. Workflow al despertar usa datos pineados del inicio. Datos están viejos.
Cómo evitar: Re-leer estado crítico después del Wait.
Resumen
- Wait Until: pausa hasta timestamp absoluto
- Configurar con expressions dinámicas (Luxon)
- Timezone awareness crítica
- Casos: recordatorios, cumpleaños, lanzamientos, expiraciones
- Limitaciones: waits muy largos mejor con Schedule alternativo
- 4 trampas: timestamp pasado, timezone implícita, workflow vive mucho, sin refresh
Lo que sigue: Resume Webhook — workflows que continúan cuando llega un evento externo.
Creado: Mayo 11, 2026 Versión: 1.0