Módulo 1: Triggers Avanzados
Combinar Múltiples Triggers en un Workflow
Descripción de la cápsula
Hasta acá cada workflow tenía un solo trigger. Pero a veces el mismo procesamiento debería dispararse por eventos distintos: "procesar leads cada mañana automáticamente Y también cuando alguien manualmente lo pide Y también cuando llega un webhook urgente". En n8n, puedes poner múltiples triggers en el mismo workflow — cualquiera de ellos dispara la ejecución.
En esta cápsula vas a aprender los patrones para combinar triggers sin que el workflow se vuelva caótico, los 3 casos de uso principales (mismo procesamiento, diferenciar por trigger, fallback), cómo diferenciar dentro del workflow qué trigger lo disparó (importante para procesar distinto), y los límites de cuándo es mejor tener workflows separados.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Agregar múltiples triggers a un solo workflow
- ✅ Reconocer 3 patrones de uso para combinar triggers
- ✅ Diferenciar dentro del workflow qué trigger lo disparó
- ✅ Decidir entre múltiples triggers en 1 workflow vs N workflows separados
- ✅ Evitar las trampas comunes de la combinación
El patrón básico: múltiples triggers convergen
[Manual Trigger] ──┐
[Schedule Trigger]─┼─→ [Set: normalizar] → [resto del workflow]
[Webhook Trigger]──┘
Los 3 triggers están conectados al mismo nodo siguiente (Set). Cuando cualquiera dispara, el workflow ejecuta desde ese punto.
Cómo hacerlo
- Crear el workflow
- Agregar primer trigger (ej. Schedule)
- Agregar segundo trigger desde el
+del canvas (no del primer trigger) - Conectar ambos al primer nodo de procesamiento
- Repetir para más triggers si necesitas
Importante: los triggers no se conectan entre sí — cada uno es un punto de entrada independiente.
Los 3 casos de uso
Caso 1: Mismo procesamiento, diferentes triggers
Cuándo: quieres ejecutar exactamente la misma lógica desde varias fuentes.
Ejemplo: workflow que "procesa los leads del Sheet":
- Schedule: cada día a las 9am, automático
- Manual: alguien del equipo lo dispara cuando agrega leads urgentes
- Webhook: un cliente VIP envía leads críticos via API
Todos hacen lo mismo: leer Sheet, procesar, notificar.
Beneficio: un solo lugar para mantener la lógica. Cambias el procesamiento, los 3 disparadores se benefician.
Caso 2: Procesamiento distinto según trigger
Cuándo: la lógica mayoritariamente la misma pero algunos detalles cambian según cómo se disparó.
Ejemplo: mismo workflow de procesamiento, pero:
- Si vino de Manual: procesa y notifica también al usuario que lo disparó
- Si vino de Schedule: procesa y notifica al canal general
- Si vino de Webhook urgente: procesa con prioridad alta y notifica con
@here
Necesitas bifurcar según el trigger origen (más abajo).
Caso 3: Fallback / redundancia
Cuándo: quieres respaldo — si el trigger primario falla, el secundario lo cubre.
Ejemplo:
- Webhook (Stripe): captura pagos en tiempo real
- Schedule (cada hora): consulta API de Stripe para pagos del horario y procesa los que no se capturaron por webhook
Híbrido push + polling de respaldo (cápsula 06).
Diferenciar qué trigger disparó
Para casos 2 y 3, necesitas saber cuál de los triggers disparó la ejecución.
Método 1: Inspeccionar el origen
Cada trigger tiene su propio nodo. En el workflow, puedes verificar cuál tiene output:
// Code node o expression
$('Manual Trigger').isEmpty() // true si NO disparó este
$('Schedule Trigger').isEmpty()
$('Webhook Trigger').isEmpty()
Solo uno va a tener output — el que disparó.
Método 2: Marcar el trigger con Set node
Más limpio: agregar un Set después de cada trigger que marca el origen:
[Manual Trigger] → [Set: source = "manual"] ──┐
[Schedule] → [Set: source = "schedule"]─┼─→ [resto]
[Webhook] → [Set: source = "webhook"] ─┘
Después en el workflow, usar {{ $json.source }} para bifurcar.
Método 3: Diferenciar por estructura del input
A veces los triggers producen estructuras tan diferentes que el input mismo te dice cuál fue:
- Webhook:
$json.body.email - Schedule:
$jsonvacío o con timestamp - Manual: similar al Schedule
Pero es frágil — la estructura puede cambiar entre versiones de n8n. Mejor usar Método 2.
Patrón completo: ejemplo con bifurcación
[Manual Trigger] ─→ [Set: source="manual"]────┐
[Schedule] ─→ [Set: source="schedule"]──┼─→ [Procesar común] ─→ [Switch: source]
[Webhook] ─→ [Set: source="webhook"]───┘ │
├─ "manual" → Notificar usuario
├─ "schedule" → Notificar canal general
└─ "webhook" → Notificar urgente @here
Pasos:
- Cada trigger marca su origen con Set
- Convergen en el procesamiento común
- Al final, Switch sobre
sourcebifurca a notificaciones distintas
Cuándo separar en workflows distintos
Combinar triggers no siempre es la mejor decisión. Separa en workflows distintos cuando:
1. La lógica diverge mucho
Si lo que hace el workflow después del trigger es muy diferente según el origen, es mejor tener workflows separados que un workflow con un Switch enorme al inicio.
2. Los triggers tienen rates muy distintos
- Schedule: 1 vez al día
- Webhook: 100 veces al día
Combinarlos significa que cada vez que llega webhook, el Schedule está "compitiendo" en el mismo workflow (no realmente, pero los logs/ejecuciones se mezclan). Mejor separados.
3. Necesitas distintos Error Workflows por tipo
Si Manual y Schedule deberían fallar a distintos Slack channels, separados es más claro.
4. Distinto retention / settings
Por ejemplo, "save on success: none" para uno y "save: all" para otro.
Ejemplo: cuándo combinar vs separar
Escenario A: lectura de Sheet (combinar)
- Schedule diario + Manual on-demand + Webhook urgente
- Todos leen el mismo Sheet, procesan igual, notifican al mismo canal
- Combinar: sí. La diferencia es solo "quién dispara".
Escenario B: respuesta a eventos de Stripe (separar)
payment.succeeded: crear factura, notificar ventascustomer.subscription.deleted: cancelar acceso, notificar retention teaminvoice.payment_failed: pausar acceso, notificar billing
Separar: cada uno tiene flow muy distinto. Mismo trigger (Stripe webhook) pero dispara workflows distintos según el event.type — esto se logra filtrando en el trigger o teniendo workflows con filtros específicos.
Trampas comunes
Trampa 1: Triggers conectados entre sí (no funciona)
Qué pasa: Intentas conectar Schedule después del Manual. n8n no permite — los triggers son puntos de inicio, no pasos intermedios.
Cómo evitar: Recordar que los triggers son paralelos, cada uno punto de entrada. Conectarlos al mismo siguiente nodo.
Trampa 2: Webhook se ejecuta también con Schedule
Qué pasa: Asumes que tener Webhook + Schedule significa "Schedule llama al webhook". No funciona así. Schedule es un trigger independiente que ejecuta el workflow directamente.
Cómo evitar: Entender que cada trigger es independiente. No se invocan entre sí.
Trampa 3: Output inesperado según trigger
Qué pasa: Tu workflow funciona perfecto cuando lo dispara Schedule (output limpio). Cuando lo dispara Webhook, falla porque el output del webhook es { body: {...}, headers: {...} } (no {...} directo).
Cómo evitar: Normalizar apenas después del trigger:
[Webhook] → [Set: data = $json.body, source = "webhook"] ──┐
[Schedule] → [Set: data = $json, source = "schedule"]────────┼─→ resto usa $json.data uniformemente
Trampa 4: Mismo nombre de campo distinto significado
Qué pasa: Webhook trae email en body.email. Schedule trae email en email directamente. Tu workflow usa {{ $json.email }} y a veces funciona, a veces no.
Cómo evitar: mismo Trampa 3 — normalizar al inicio para que el resto del workflow tenga estructura uniforme.
Trampa 5: Múltiples Schedule en el mismo workflow
Qué pasa: Pones 2 Schedule diferentes ("lunes 9am" y "viernes 5pm"). Funciona, pero dificulta entender qué corre cuándo.
Cómo evitar:
- Si los procesamientos son iguales, OK pero documenta con Sticky Note
- Si son distintos, separa en 2 workflows
Ejemplo práctico: workflow de leads con 3 triggers
Vamos a diseñar un workflow real combinando triggers.
Requirements
- Schedule cada mañana 8am: procesa todos los leads del Sheet acumulados
- Manual: alguien del equipo lo dispara cuando agregaron leads urgentes y no quieren esperar
- Webhook: plataforma de eventos manda leads de eventos en vivo (tiempo real)
Diseño
[Manual] → [Set: source="manual", filter=null] ──┐
[Schedule] → [Set: source="schedule", filter=null] ──┤
[Webhook] → [Set: source="webhook", filter="event"]──┘
│
▼
[Lee Sheet con filtro opcional]
│
▼
[Procesa leads]
│
▼
[Switch sobre source]
│
┌─────────────────────┼─────────────────────┐
│ │ │
"manual" "schedule" "webhook"
│ │ │
▼ ▼ ▼
Slack al user Slack al canal Slack URGENTE
(mencionar) general @here
Notas
- Set inicial unifica la estructura:
sourceyfilterse llenan en todos los triggers - Procesamiento común en el medio
- Switch final para notificación distinta
- Maintainable: cambias el procesamiento en un solo lugar
Resumen y siguiente paso
- Múltiples triggers en un workflow es posible y útil — cada uno es punto de entrada independiente
- 3 casos: mismo procesamiento, distinto según trigger, fallback/respaldo
- Diferenciar trigger con Set node marcando
source(más limpio que inspeccionar el input) - Cuándo separar workflows: lógica diverge mucho, rates muy distintos, diff Error Workflows, distintos settings
- Trampas: triggers conectados entre sí (no funciona), output inesperado según trigger, mismos nombres diff estructura
- Normalizar al inicio con Set para estructura uniforme
Antes de avanzar deberías poder:
- Combinar 2-3 triggers en un workflow
- Decidir entre combinar vs separar según el caso
- Normalizar inputs distintos en un formato común
- Diferenciar trigger de origen con Set + Switch
Lo que sigue (cápsula 08):
Cierre del módulo: mini-proyecto comparativo. Vas a construir un workflow que acepta los 4 tipos principales de trigger (Manual, Schedule, Webhook, App-event de Gmail) y verás en práctica cómo cada uno se comporta, cuándo brillar y cuándo defraudar.
Recursos adicionales
- Workflow Design with Multiple Triggers - Patrones avanzados.
- n8n Sticky Notes Documentation - Para documentar workflows con triggers complejos.
Creado: Mayo 11, 2026 Versión: 1.0