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ácterSignifica
*Cualquier valor
5Valor específico (5)
1,3,5Lista de valores (1, 3 y 5)
1-5Rango (1 a 5 inclusivo)
*/15Cada 15 unidades
0-30/5Cada 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:

  1. Abre https://crontab.guru
  2. Pega tu expression en el input
  3. 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

  1. Crear workflow nuevo o abrir existente
  2. Agregar Schedule Trigger como 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) o Interval

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ónTimezone
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, no INSERT)

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:

  1. Cada día a las 6 de la mañana
  2. Cada hora exacta entre 8am y 8pm
  3. Lunes, miércoles y viernes a las 10am
  4. Cada 30 minutos
  5. Primer y quince de cada mes a medianoche
Ver respuestas
  1. 0 6 * * *
  2. 0 8-20 * * *
  3. 0 10 * * 1,3,5
  4. */30 * * * *
  5. 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

  1. Crontab Guru - Validador interactivo.
  2. n8n Schedule Trigger Docs - Referencia oficial.
  3. IANA Timezones - Lista completa de timezones.

Creado: Mayo 11, 2026 Versión: 1.0