Módulo 2: Branching y Decisiones Avanzadas
Sub-Workflows para Manejar Complejidad
Descripción de la cápsula
Hasta ahora todos tus workflows han sido monolíticos — un trigger, todo el procesamiento, y los nodos finales, en un solo canvas. Funciona perfecto para workflows pequeños. Pero cuando crecen — sea por cantidad de nodos, por lógica compleja, o por reutilización — un solo canvas se vuelve insostenible.
Sub-workflows son la solución: divides tu workflow en piezas más pequeñas, cada una con su propio canvas, y las conectas con el nodo Execute Workflow. Es el equivalente a "funciones" en programación — extraes lógica reutilizable y compleja a su propia "función" (otro workflow).
En esta cápsula vas a aprender cuándo extraer a sub-workflows, cómo configurar Execute Workflow node, cómo pasar datos entre workflows, los 3 patrones principales (utility, branch extractor, multi-tenant), y las trampas de organización al usar muchos sub-workflows.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Identificar cuándo extraer a sub-workflow es la mejor decisión
- ✅ Crear y configurar un sub-workflow llamable
- ✅ Llamarlo desde otro workflow con Execute Workflow
- ✅ Pasar datos correctamente entre workflows
- ✅ Aplicar 3 patrones comunes de sub-workflows
- ✅ Organizar tu account de n8n con sub-workflows sin caos
Cuándo extraer a sub-workflow
Criterio 1: Reutilización
Tienes lógica que se repite en 2+ workflows. Ejemplo: "validar formato de email + verificar dominio" se necesita en 3 workflows.
Solución: crear [UTIL] validate-email como sub-workflow. Los 3 workflows lo llaman.
Criterio 2: Complejidad de una rama
Una rama de tu Switch tiene 8+ nodos. El canvas principal pierde claridad.
Solución: extraer esa rama a [PROC] manejar-enterprise y llamarlo desde el Switch.
Criterio 3: Equipos / responsabilidades distintas
Un workflow es mantenido por 2 personas distintas según la sección. Cada uno responsable de una parte.
Solución: separar en sub-workflows con dueños claros.
Criterio 4: Testing independiente
Quieres testear la lógica X aisladamente sin disparar todo el workflow.
Solución: extraer X a sub-workflow que puedes ejecutar con datos de prueba.
Criterio 5: Versionamiento independiente
Cierta lógica cambia frecuentemente, otra es estable. Quieres tocar solo la parte cambiante.
Solución: sub-workflows separan los ciclos de cambio.
Cuándo NO extraer
- Workflow simple (<10 nodos) — no hay complejidad para justificar
- Lógica de uso único — si solo se usa en este lugar, sub-workflow es overhead
- Performance crítica — Execute Workflow agrega latencia microscópica (raramente importa, pero existe)
- Cuando el sub-workflow sería casi vacío — 1-2 nodos no justifica un workflow propio
Crear un sub-workflow llamable
Paso A: Crear el workflow
- Workflows →
+ Add workflow - Nombre con convención (ver más abajo)
- Crear
Paso B: Trigger especial
El primer nodo NO es Webhook ni Schedule — es Execute Workflow Trigger (también llamado When Executed by Another Workflow).
- Agregar primer nodo: busca
Execute Workflow→ elige Trigger (no Action) - Configurar el input schema opcional — qué campos espera recibir
Paso C: Lógica del sub-workflow
Después del trigger, agrega los nodos que hacen el procesamiento.
Paso D: Output
El último nodo debería producir el output que devuelve al workflow padre. Si no hay output explícito, el padre recibe lo que sea que tenga el último nodo.
Paso E: Save y activar (?)
- Save siempre
- Activate: depende. Para sub-workflows llamados sincrónicamente, no necesita estar activo — Execute Workflow node puede llamarlo de cualquier modo. Para llamadas asíncronas o como Error Workflow, sí debe estar activo.
Llamar a un sub-workflow
En el workflow padre
- Agregar nodo
Execute Workflow(Action, no Trigger) - Workflow: elige el sub-workflow del dropdown
- Pass Data: elige qué datos pasar:
All input items(default — pasa todos los items que llegaron al nodo)Specified fields(pasa solo campos específicos)
- Save
Cómo se ejecuta
Cuando el workflow padre llega a Execute Workflow:
- Pausa el workflow padre
- Ejecuta el sub-workflow con los datos del input
- Cuando termina, devuelve los items del último nodo del sub-workflow
- Reanuda el workflow padre con esos datos
3 patrones principales
Patrón 1: Utility workflows (reusables)
Propósito: lógica que se usa en múltiples workflows.
Ejemplos:
[UTIL] validate-email: recibe{email}, devuelve{is_valid, reason}[UTIL] enrich-with-clearbit: recibe{email}, devuelve datos enriquecidos de la persona[UTIL] check-spam-domain: recibe{email}, devuelve{is_spam: true|false}
Convención de nombre: [UTIL] prefix para identificarlos rápido en la lista.
Patrón 2: Branch extractors (extraer ramas complejas)
Propósito: sacar una rama compleja del Switch principal.
Ejemplos:
[BRANCH-PROY-X] manejar-lead-enterprise: lógica de 15 nodos para procesar enterprise[BRANCH-PROY-X] manejar-lead-trial: lógica equivalente para trial
Convención: prefijo [BRANCH] + nombre del proyecto/workflow padre.
Patrón 3: Multi-tenant / per-client logic
Propósito: mismo workflow base, lógica específica por cliente/inquilino.
Ejemplos:
[CLIENT-ACME] custom-validation: validaciones específicas de Acme[CLIENT-BETA] custom-validation: equivalente de Beta
Workflow padre: decide qué sub-workflow llamar según el cliente:
[Switch sobre client]
├─→ "acme" → Execute Workflow [CLIENT-ACME] custom-validation
├─→ "beta" → Execute Workflow [CLIENT-BETA] custom-validation
└─→ default → Execute Workflow [CLIENT-DEFAULT] custom-validation
Pasar datos: el contrato implícito
Cuando el padre llama al sub-workflow, pasa items JSON. El sub-workflow opera sobre esos items, los modifica/procesa, y devuelve items al padre.
Buena práctica: documentar el "contrato"
En el primer nodo (Execute Workflow Trigger) del sub-workflow, agrega un Sticky Note con:
INPUT esperado:
{
email: string (required)
name: string (required)
amount: number (optional, default 0)
}
OUTPUT devuelto:
{
...input,
is_valid: boolean,
invalid_reason: string,
category: string
}
Esto es el contrato del sub-workflow. Quien lo llama sabe qué pasar y qué esperar.
Si cambias el contrato
Si cambias campos de input/output del sub-workflow:
- Todos los callers se afectan
- Si no actualizas los callers, algo se rompe
Implicación: los contratos deberían ser estables. Cambiarlos requiere coordinación.
Organización: sin caos
Si extraes muchas cosas a sub-workflows, tu lista en n8n puede tener 50+ workflows. Necesitas organización.
Convención de nombres
Prefijos por tipo:
| Prefijo | Significa | Ejemplo |
|---|---|---|
[PROY-XYZ] | Workflow principal de un proyecto | [PROY-M07] Cotizaciones |
[UTIL] | Utility reutilizable | [UTIL] validate-email |
[BRANCH] | Rama extraída de otro workflow | [BRANCH-Cotizaciones] manejar-enterprise |
[GUARDIAN] | Error Workflow | [GUARDIAN] Error Notifier |
[CLIENT-X] | Específico de cliente | [CLIENT-ACME] validation |
Folders (si tu plan los soporta)
n8n Cloud tiene folders. Crear:
Production / Project AProduction / Project BUtilitiesError Workflows
Tags
Etiquetar workflows por estado:
productionstagingexperimentaldeprecated
Ejemplo completo: refactor con sub-workflow
Workflow original
[Webhook]
│
[Set: validar]
│
[IF: válido]
├─ TRUE → [Switch sobre type]
│ ├─→ "enterprise" → [nodos 1-8 procesando enterprise]
│ ├─→ "mid" → [nodos 1-6 procesando mid]
│ └─→ "small" → [Send Email simple]
└─ FALSE → [log rechazado]
20+ nodos en un canvas. La rama "enterprise" sola tiene 8 nodos.
Refactorizado con sub-workflows
Workflow principal:
[Webhook]
│
[Execute Workflow: [UTIL] validate-lead] ← devuelve is_valid
│
[IF: is_valid]
├─ TRUE → [Switch sobre type]
│ ├─→ "enterprise" → [Execute Workflow: [BRANCH] proc-enterprise]
│ ├─→ "mid" → [Execute Workflow: [BRANCH] proc-mid]
│ └─→ "small" → [Send Email simple]
└─ FALSE → [log rechazado]
5 nodos en el canvas principal. Limpio.
Sub-workflows:
[UTIL] validate-lead: 4 nodos (validaciones diversas)[BRANCH] proc-enterprise: 8 nodos (lógica original de enterprise)[BRANCH] proc-mid: 6 nodos
Beneficios:
- Canvas principal legible de una mirada
- Sub-workflows testables independientemente
validate-leadreutilizable en otros workflows
Trampas comunes
Trampa 1: Sub-workflow demasiado pequeño
Qué pasa: Extraes 2 nodos a sub-workflow "por consistencia". Ahora tienes overhead de llamada para casi nada.
Cómo evitar: sub-workflow con menos de 5 nodos generalmente no vale la pena (excepción: utility muy reutilizado).
Trampa 2: Cambiar contrato sin avisar a callers
Qué pasa: Renombras un campo del output del sub-workflow. 3 workflows que lo usan ahora fallan silenciosamente porque el campo viejo no existe.
Cómo evitar:
- Documentar el contrato con Sticky Note
- Antes de cambiar, buscar qué workflows llaman al sub (en n8n hay forma de ver llamadas, o grep manual)
- Versionar: en lugar de cambiar, crear
[UTIL] validate-email-v2y migrar callers gradualmente
Trampa 3: Sub-workflows que se llaman entre sí formando ciclos
Qué pasa: A llama a B, B llama a C, C llama a A. Loop infinito.
Cómo evitar: n8n debería detectar y prevenir, pero documenta tus llamadas para evitar accidentes.
Trampa 4: Demasiados sub-workflows
Qué pasa: Refactorizaste todo a sub-workflows. Tienes 80 workflows en tu lista. Encontrar algo es imposible.
Cómo evitar: balance. Sub-workflows solo para casos justificados. No es virtud por sí mismo.
Trampa 5: Sub-workflow sin tests
Qué pasa: Tienes [UTIL] validate-email usado en 5 workflows. Lo modificas. Algo se rompe en 1 de los 5 que no testeaste.
Cómo evitar:
- Mantener casos de prueba para cada sub-workflow
- Antes de modificar, probar con esos casos
- Si los 5 callers usan el sub diferente, considerar que cada uno tenga su propio sub específico
Ejercicio: identificar candidatos a extraer
Objetivo: mirar tus workflows existentes y identificar candidatos.
Tu tarea
Revisa los workflows que has construido (G1 + G2). Para cada uno, hazte:
- ¿Hay alguna rama compleja (5+ nodos) que se beneficiaría de extraer?
- ¿Hay lógica duplicada entre workflows (validación email, etc.)?
- ¿Hay alguna parte que cambiarías frecuentemente mientras el resto se queda igual?
Anota los candidatos. Si tienes 1-3, considera extraerlos. Si tienes 0, tus workflows están bien tamaños actuales — no fuerces sub-workflows sin necesidad.
Resumen y siguiente paso
- Sub-workflows = piezas reutilizables/extraídas, llamadas con Execute Workflow
- 5 criterios para extraer: reutilización, complejidad de rama, equipos diferentes, testing aislado, versionamiento
- 3 patrones: utilities reutilizables, branch extractors, multi-tenant
- Contrato implícito: documentar input/output esperado con Sticky Note
- Convención de nombres:
[UTIL],[BRANCH],[CLIENT-X],[GUARDIAN] - 5 trampas: sub demasiado pequeño, cambiar contrato sin avisar, ciclos, demasiados subs, sub sin tests
Antes de avanzar deberías poder:
- Crear un sub-workflow callable y llamarlo desde otro
- Decidir cuándo extraer es beneficioso
- Aplicar convenciones de nombre para mantener orden
Lo que sigue (cápsula 08):
Cierre del módulo: mini-proyecto que aplica todos los patrones. Vas a construir un árbol de decisión de 3 niveles para procesar tickets de soporte — con pre-cómputo, filtros en cadena, Switch consolidado, y sub-workflows. Es la consolidación práctica del módulo.
Recursos adicionales
- Execute Workflow Node - Referencia oficial.
- Workflow Composition Patterns - Patrones avanzados.
- Don't Repeat Yourself (DRY) - Principio que motiva extracción.
Creado: Mayo 11, 2026 Versión: 1.0