Módulo 1: Triggers Avanzados
Schedule Trigger con Cron Expressions
Descripción de la cápsula
Schedule Trigger es probablemente el trigger que más vas a usar en producción real. En G1-M04 lo configuraste para casos simples ("cada hora", "diario a las 9am"). En esta cápsula vas a ir más profundo: cron expressions completas, casos típicos de negocio (días laborales, fines de mes, horarios de oficina), timezones de LATAM, y los anti-patrones que llevan a workflows que corren cuando no deben.
Las cron expressions parecen intimidantes al inicio (0 9 * * 1-5 ¿qué?), pero son 5 campos simples que vas a leer fluido en 10 minutos. Y vale la pena dominarlas — son el lenguaje universal de scheduling, no solo en n8n sino en cron de Linux, GitHub Actions, GitLab CI, AWS EventBridge, etc.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Leer y escribir cron expressions sin pánico
- ✅ Configurar Schedule Trigger en modo cron vs intervalo
- ✅ Resolver 8 casos típicos de negocio con la expression correcta
- ✅ Manejar timezones LATAM correctamente
- ✅ Evitar anti-patrones clásicos del scheduling
- ✅ Usar crontab.guru para validar expressions visualmente
Modos del Schedule Trigger
Modo 1: Interval (intervalo simple)
Configuras "cada X segundos/minutos/horas/días". Es el modo más simple.
Ejemplos:
- Cada 5 minutos
- Cada 2 horas
- Cada 1 día
Cuándo usar: intervalos regulares sin horario específico.
Modo 2: Cron Expression
Configuras una expression de 5 campos que describe cuándo correr con precisión. Es el modo profesional.
Ejemplos:
- "Cada lunes a las 9am"
- "Primer día de cada mes a las 6am"
- "Cada 15 min entre 9am y 5pm en días laborales"
Cuándo usar: cuando necesitas horarios específicos o patrones complejos.
Cron expressions: los 5 campos
Una cron expression tiene 5 campos separados por espacios:
* * * * *
│ │ │ │ │
│ │ │ │ └── Día de la semana (0-6, donde 0=Domingo)
│ │ │ └──── Mes (1-12)
│ │ └────── Día del mes (1-31)
│ └──────── Hora (0-23)
└────────── Minuto (0-59)
Algunos sistemas usan 6 campos (agregando segundos al inicio). n8n usa 5 campos estándar — sin segundos. Si copias una expression de Linux, debería funcionar; si viene con 6 campos, quita el primero.
Los caracteres especiales
Cada campo puede ser:
| Carácter | Significa |
|---|---|
* | Cualquier valor |
5 | Valor específico (5) |
1,3,5 | Lista de valores (1, 3 y 5) |
1-5 | Rango (1 a 5 inclusivo) |
*/15 | Cada 15 unidades |
0-30/5 | Cada 5 unidades, dentro de 0-30 |
Lectura: cómo decodificar una expression
Toma esta expression: 0 9 * * 1-5
Lees campo por campo:
- 0 (minuto): minuto 0 (al inicio de la hora)
- 9 (hora): a las 9 (de la mañana — formato 24h)
- * (día del mes): cualquier día del mes
- * (mes): cualquier mes
- 1-5 (día de la semana): lunes a viernes
Significado: "Cada día laboral a las 9:00 am"
8 casos de negocio con su cron expression
Caso 1: Diario a las 9am
0 9 * * *
Minuto 0 de la hora 9, cualquier día.
Caso 2: Lunes a viernes a las 9am
0 9 * * 1-5
Minuto 0 de la hora 9, días 1-5 (lunes a viernes).
Caso 3: Cada hora en horas de oficina (9am-6pm)
0 9-18 * * 1-5
Minuto 0, horas 9 a 18, lunes a viernes.
Caso 4: Cada 15 min en horas de oficina
*/15 9-18 * * 1-5
Cada 15 min de la hora, en el rango 9-18, lunes a viernes.
Caso 5: Primer día del mes a las 6am
0 6 1 * *
Minuto 0, hora 6, día 1 del mes.
Caso 6: Último viernes del mes
n8n no soporta L (last) en todos los modos. Workaround: usar día de la semana + IF en el workflow que verifica si es la última semana del mes.
Alternativa más simple: ejecutar cada viernes y agregar un IF al inicio del workflow:
0 9 * * 5
- IF:
{{ DateTime.now().plus({weeks: 1}).month !== DateTime.now().month }}
Caso 7: Cada lunes a las 10am, miércoles a la 3pm, viernes a las 5pm
0 10 * * 1 (lunes 10am)
0 15 * * 3 (miércoles 3pm)
0 17 * * 5 (viernes 5pm)
No se puede en una sola expression con horas distintas por día. Solución: 3 Schedule Triggers en un workflow (cápsula 07) o 3 workflows.
Caso 8: Cada 30 min entre 9am y mediodía, lunes a viernes
*/30 9-11 * * 1-5
(Nota: 9-11 cubre hasta las 11:59, no las 12. Si quieres incluir las 12, usa 9-12.)
Herramienta esencial: crontab.guru
Para validar tu expression sin adivinar:
- Abre
https://crontab.guru - Pega tu expression en el input
- Te muestra:
- Traducción humana ("At 09:00 on every day-of-week from Monday through Friday")
- Próximas ejecuciones ("Next at 2026-05-12 09:00:00")
Es gratis, sin login, sin instalación. Úsalo antes de cada Schedule importante.
Configurar Schedule en n8n
Paso A: Agregar el nodo
- Crear workflow nuevo o abrir existente
- Agregar
Schedule Triggercomo primer nodo
Paso B: Elegir modo
En el editor:
- Trigger Times: elige cuántas ventanas de horario quieres
- Por cada ventana:
- Mode:
Cron Expression(recomendado) oInterval
- Mode:
Paso C: Configurar cron
Si elegiste Cron Expression:
- Expression: pega tu cron de 5 campos
- Timezone: importante — elige el correcto (más abajo)
Paso D: Save y activate
- Save
- Activate toggle = ON para que empiece a correr
- En Executions vas a ver las ejecuciones que va disparando
Timezones LATAM (importante)
n8n maneja Schedule en la timezone que configures. Si no la configuras, usa la timezone del server de n8n — que puede ser UTC, no la tuya.
Timezones comunes LATAM
| Región | Timezone |
|---|---|
| México (CDMX, Guadalajara) | America/Mexico_City |
| Colombia (Bogotá) | America/Bogota |
| Argentina (Buenos Aires) | America/Argentina/Buenos_Aires |
| Chile (Santiago) | America/Santiago |
| Perú (Lima) | America/Lima |
| Brasil (São Paulo) | America/Sao_Paulo |
| España (Madrid) | Europe/Madrid |
Por qué importa
- Daylight saving time: algunas regiones cambian de hora. Si configuras UTC, tu horario se mueve solo cuando cambia DST localmente.
- Comunicación con equipo: si tu equipo está en CDMX y configuras UTC para "9am hora oficina", a algunos les llega a las 3am.
Cómo configurar
En el Schedule Trigger:
- Busca el campo Timezone
- Elige de la lista (n8n lista las IANA timezones)
- Verifica con crontab.guru convertido a tu zona
Anti-patrones del scheduling
Anti-patrón 1: Cron cada minuto sin justificación
Qué pasa: Configuras * * * * * (cada minuto) "para que sea responsive". Resultado: 60 ejecuciones/hora × 24h = 1,440 ejecuciones diarias del mismo workflow.
Por qué es problema:
- Consumes ejecuciones de tu plan rápido
- APIs externas se saturan
- Logs se vuelven gigantes
Solución: ¿realmente necesitas cada minuto? Casi nunca. Si es "casi tiempo real", 5-15 min suele ser más que suficiente.
Anti-patrón 2: Schedule sin verificación de input
Qué pasa: Schedule corre cada 6 horas y lee Sheet. Algunos días el Sheet está vacío, pero el workflow sigue procesando y mandando emails de "0 leads procesados".
Solución:
- IF al inicio que verifica si hay datos
- Si no hay → log silent o terminar sin notificar
- Si hay → procesar normal
Anti-patrón 3: Múltiples horarios sin pensar en solapamiento
Qué pasa: Tienes Schedule cada hora + otro a las 9am específico. A las 9am, ambos disparan al mismo tiempo. Dos ejecuciones simultáneas.
Solución:
- Diseñar para evitar solapamientos
- O hacer el workflow idempotente (puede correr 2 veces sin causar problema — ej. usa
INSERT OR IGNORE, noINSERT)
Anti-patrón 4: Cron con timezone equivocada
Qué pasa: Configuras "lunes a las 9am" pensando en CDMX, pero el server está en UTC. El workflow corre a las 3am hora CDMX.
Solución: siempre verificar y configurar la timezone explícitamente.
Anti-patrón 5: Workflows largos en Schedule frecuente
Qué pasa: Schedule cada 5 min, pero el workflow tarda 10 min. Se solapan ejecuciones — la segunda inicia antes que la primera termine.
Solución:
- Reducir tiempo del workflow
- Aumentar intervalo (cada 15-30 min)
- Configurar n8n para no permitir ejecuciones concurrentes del mismo workflow (depende de versión/plan)
Trampas comunes
Trampa 1: Confundir día de la semana
Qué pasa: Configuras 0 9 * * 7 (esperando domingo). En n8n, 7 puede o no ser válido dependiendo de versión — el estándar oficial es 0-6 donde 0 = domingo.
Cómo evitar: Usar 0 para domingo, no 7. Verificar con crontab.guru.
Trampa 2: Esperar a que sea la hora justa
Qué pasa: Activas un Schedule a las 8:55am con cron 0 9 * * *. Esperas que corra a las 9am. No corre porque n8n tarda en sincronizar el reloj a veces.
Cómo evitar: Esperar al menos 1-2 minutos después de activar antes de esperar la primera ejecución.
Trampa 3: DST no manejado
Qué pasa: Configuras "9am todos los días". Cuando hay cambio de hora (DST), la primera ejecución del día puede saltarse o duplicarse.
Cómo evitar: Para workflows críticos donde DST importa, probar manualmente la semana del cambio y monitorear.
Trampa 4: Usar segundos sin saberlo
Qué pasa: Copias una cron expression de 6 campos (con segundos) de un tutorial Linux. n8n usa 5 campos. Tu expression no funciona o funciona raro.
Cómo evitar: Verificar que tu cron es de 5 campos. Si tiene 6 (0 0 9 * * 1-5), quita el primero (0 9 * * 1-5).
Ejercicio: traducir 5 casos a cron
Objetivo: practicar lectura/escritura de cron.
Tu tarea
Escribe la cron expression para cada caso. Verifica con crontab.guru:
- Cada día a las 6 de la mañana
- Cada hora exacta entre 8am y 8pm
- Lunes, miércoles y viernes a las 10am
- Cada 30 minutos
- Primer y quince de cada mes a medianoche
Ver respuestas
0 6 * * *0 8-20 * * *0 10 * * 1,3,5*/30 * * * *0 0 1,15 * *
Resumen y siguiente paso
- Schedule Trigger soporta 2 modos: Interval (simple) y Cron (preciso)
- 5 campos cron: minuto, hora, día del mes, mes, día de la semana
- crontab.guru valida tus expressions visualmente — usar siempre
- Timezone importante — configurar la de tu región LATAM/España
- 8 casos de negocio cubiertos con sus expressions
- 5 anti-patrones: cada minuto sin razón, sin validar input, sin manejar solapamiento, timezone mala, workflow más largo que intervalo
- 4 trampas: día de semana 7 vs 0, esperar después de activar, DST, 6 vs 5 campos
Antes de avanzar deberías poder:
- Leer una cron expression y traducirla a horario natural
- Escribir cron para casos típicos (días laborales, fin de mes, etc.)
- Configurar timezone correctamente
- Saber cuándo Schedule no es el trigger correcto
Lo que sigue (cápsula 04):
Profundizamos el siguiente trigger: Webhook. Vas a ir más allá del "POST básico" de G1: autenticación con headers, response modes avanzados (responder con datos calculados), validar HMAC signatures de servicios como Stripe, y diseñar webhooks que son public-facing pero seguros.
Recursos adicionales
- Crontab Guru - Validador interactivo.
- n8n Schedule Trigger Docs - Referencia oficial.
- IANA Timezones - Lista completa de timezones.
Creado: Mayo 11, 2026 Versión: 1.0