Módulo 2: Branching y Decisiones Avanzadas
Switch con Muchas Ramas
Descripción de la cápsula
En G1-M07-03 viste Switch con 3-4 ramas. La realidad de negocio a veces requiere 10, 15, o más ramas: 12 países con processing distinto, 8 tipos de pedido, 15 estados de un ticket. Un Switch así es válido pero requiere disciplina: mal estructurado se vuelve un nido de spaghetti; bien estructurado es legible y mantenible.
En esta cápsula vas a aprender cómo organizar Switch grandes, cuándo conviene agrupar categorías (12 ramas → 4 categorías + 3 ramas cada una), cómo extraer cada rama a un sub-workflow cuando crecen mucho (preview de cápsula 07), y la importancia del fallback robusto cuando hay tantos casos.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Manejar Switch de 4-15 ramas con orden y claridad
- ✅ Decidir cuándo agrupar categorías (jerarquía vs flat)
- ✅ Estructurar el canvas para que un Switch grande sea legible
- ✅ Diseñar fallback robusto en Switch grandes
- ✅ Reconocer el momento de extraer ramas a sub-workflows
El problema del Switch grande
Visualmente, un Switch con 12 ramas en el canvas se ve así:
┌─→ rama 1
├─→ rama 2
├─→ rama 3
├─→ rama 4
├─→ rama 5
[input] ─→ [Switch] ──────────┼─→ rama 6
├─→ rama 7
├─→ rama 8
├─→ rama 9
├─→ rama 10
├─→ rama 11
├─→ rama 12
└─→ default
Cada rama puede tener 3-10 nodos más. El canvas total es 100+ nodos. Imposible ver sin scrollear, imposible mantener mentalmente, imposible para alguien nuevo.
Estrategias para Switch grandes
Estrategia 1: Mantener cada rama corta
Regla: cada rama del Switch tiene máximo 2-3 nodos.
Si una rama crece a 5+ nodos, considera:
- Reorganizar la lógica
- Extraer a sub-workflow (cápsula 07)
- Pre-computar en el Set antes del Switch
Estrategia 2: Layout consistente
Las ramas se ven mejor cuando están alineadas verticalmente (n8n canvas):
[Switch]
│
├─→ [Set 1] → [Slack 1]
│
├─→ [Set 2] → [Slack 2]
│
├─→ [Set 3] → [Slack 3]
│
...
Mismo formato cada rama. Si difiere, convierte cada salida en un sub-workflow para que el canvas se mantenga uniforme.
Estrategia 3: Agrupar categorías (jerárquico)
Si tienes 12 categorías que se parecen entre sí en grupos, considera 2 niveles de Switch en lugar de 1 grande.
Ejemplo: 12 países
Flat (anti-patrón):
[Switch sobre country]
├─→ USA
├─→ Canada
├─→ UK
├─→ Germany
├─→ France
├─→ Spain
├─→ Mexico
├─→ Brazil
├─→ Argentina
├─→ Chile
├─→ Colombia
└─→ Peru
Jerárquico:
[Set: region = "north_america" | "europe" | "latam"]
│
▼
[Switch sobre region]
├─→ "north_america" → [Switch sobre country (3 países)]
├─→ "europe" → [Switch sobre country (3 países)]
└─→ "latam" → [Switch sobre country (6 países)]
Ventajas:
- Cada Switch interno tiene menos ramas
- Si agregas otro país de LATAM, solo tocas un Switch
- Lógica de procesamiento compartida por región se hace una vez
Cuándo agrupar (cuándo no)
Agrupar tiene sentido si:
- Las categorías comparten lógica dentro del grupo (mismo formato de mensaje, mismas validaciones)
- Hay 8+ categorías
- Las categorías cambian con frecuencia (agregar país nuevo es común)
Agrupar NO tiene sentido si:
- Cada categoría es completamente única (sin lógica compartida)
- Hay 5 o menos categorías
- Los grupos son artificiales (forzados, no naturales)
Patrón: Set + Switch (siempre)
Ya viste esto en G1-M07-07 pero vale repetir: antes del Switch, ten un Set que calcula la categoría.
Por qué importa más con Switch grandes
Con 12 ramas, el Switch tiene reglas que parecen:
country === "USA"→ salida 1country === "Canada"→ salida 2- ...
country === "Peru"→ salida 12
Si el campo cambia (de country a country_code), tocas 12 reglas. Doloroso.
Con Set previo:
- Set crea
categorycalculado en una sola expression - Switch sobre
category(no sobre el campo crudo) - Cambia el campo origen: tocas una expression en el Set
Diseño del Set previo
Para un Switch grande, el Set debe ser explícito y legible:
[Set: categorizar]
Field: category
Type: String
Value: {{
// Norte América
["USA", "Canada"].includes($json.country) ? "na_" + $json.country.toLowerCase() :
// Europa (mayores)
["UK", "Germany", "France"].includes($json.country) ? "eu_" + $json.country.toLowerCase() :
// Latam (mayores)
["Mexico", "Brazil", "Argentina"].includes($json.country) ? "latam_" + $json.country.toLowerCase() :
// Default
"other"
}}
Resultado: category es un string normalizado tipo "na_usa", "eu_uk", "latam_mexico", etc.
Switch sobre {{ $json.category }} con reglas que matchean cada valor.
Naming de salidas del Switch
Cuando un Switch tiene 10+ salidas, nombrar las salidas se vuelve crítico.
Mal naming
- Salida 1, 2, 3, 4...
- Salida "default", "default 2"
Buen naming
na_usa,na_canada,eu_uk,latam_mexico,default_otros- Reflejan el contenido, no el orden
n8n te deja nombrar cada salida en el editor del Switch. Aprovéchalo. Los nombres aparecen en el canvas, haciendo el workflow auto-documentado.
Cuándo extraer a sub-workflows
(Cubierto en cápsula 07, pero preview:)
Si una rama del Switch tiene 5+ nodos o lógica que se repite en otra rama, extrae a sub-workflow.
Resultado
[Switch]
├─→ "enterprise_usa" → [Execute Workflow: process_enterprise_usa]
├─→ "enterprise_eu" → [Execute Workflow: process_enterprise_eu]
├─→ "starter" → [Execute Workflow: process_starter]
└─→ "free" → [Execute Workflow: process_free]
Cada Execute Workflow llama a otro workflow que tiene los nodos del procesamiento. El workflow principal queda limpio: trigger → Set → Switch → 4 calls → fin.
Fallback robusto
Con muchas ramas, la probabilidad de que aparezca un valor inesperado es alta. Tu Switch necesita un fallback que:
- Capture el caso (no descartar silenciosamente)
- Notifique que apareció algo nuevo
- Loggee para revisión
Implementación
En la salida default del Switch:
[default] → [Slack: "🚨 Categoría inesperada: {{ $json.country }}. Lead: {{ $json.email }}"]
→ [Sheet: append a 'pending_categories' para revisar]
Cuando aparezca un país nuevo (ej. recién entras a Portugal), te enteras en minutos en lugar de descubrir 3 meses después que se descartaba silenciosamente.
Ejemplo completo: routing por tipo de pedido (e-commerce)
Requirements
Pedidos llegan con type que puede ser: physical, digital, subscription, gift_card, service, refund, partial_refund.
Procesamiento distinto por tipo + agrupación lógica:
- Tangible (physical, gift_card): preparar envío
- Digital (digital, subscription): activar acceso
- Service (service): asignar a equipo
- Reembolso (refund, partial_refund): procesar reembolso
Implementación
[Order Webhook]
│
▼
[Set: categorizar]
- category: {{
["physical", "gift_card"].includes($json.type) ? "tangible" :
["digital", "subscription"].includes($json.type) ? "digital" :
$json.type === "service" ? "service" :
["refund", "partial_refund"].includes($json.type) ? "refund" :
"unknown"
}}
│
▼
[Switch sobre category]
│
├─→ "tangible" → [Execute Workflow: prepare_shipping]
├─→ "digital" → [Execute Workflow: activate_access]
├─→ "service" → [Execute Workflow: assign_team]
├─→ "refund" → [Execute Workflow: process_refund]
└─→ "unknown" → [Slack alert + Sheet log]
Análisis
- 1 Switch principal con 5 salidas (manejable)
- Cada salida es 1 nodo (sub-workflow call) — canvas limpio
- Fallback explícito para tipos nuevos
- Sub-workflows se editan independientemente sin tocar el principal
Trampas comunes
Trampa 1: Switch sobre el campo crudo sin normalizar
Qué pasa: Switch sobre {{ $json.country }}. Los datos vienen como "USA", "usa", "U.S.A.", "United States". Solo matchea el primero.
Cómo evitar: Set previo que normaliza (lowercase, mapping de variantes, etc.).
Trampa 2: Demasiadas categorías sin agrupación
Qué pasa: 25 ramas en un Switch. Imposible mantener.
Cómo evitar: agrupar jerárquicamente o extraer a sub-workflows.
Trampa 3: Reglas que se solapan en Switch
Qué pasa: Tu Switch tiene reglas:
monto > 100→ salida Amonto > 1000→ salida B
Un pedido de $5000 cumple ambas. Va a la primera que matchea (A) — no a la más específica (B).
Cómo evitar:
- Orden importa: poner más específicas primero
- Mejor: categorías mutuamente exclusivas en el Set previo
Trampa 4: Default que silenciosamente descarta
Qué pasa: Switch sin Extra Output activado. Items que no matchean se descartan. Pasa el tiempo, no entiendes por qué algunos leads no aparecen.
Cómo evitar: siempre Extra Output como default, conectado a log/notify.
Trampa 5: Cambiar el campo source sin actualizar Set
Qué pasa: Refactorizas algo y el campo ahora viene como country_code. El Set previo todavía dice $json.country → siempre devuelve "unknown" → todo va a default.
Cómo evitar:
- Test después de cualquier refactor que cambie nombres
- Pin data para validar que el Set produce las categorías correctas
Ejercicio: refactorizar Switch grande
Objetivo: practicar transformar Switch flat a jerárquico.
Tu tarea
Imagina este Switch flat con 9 ramas:
customer_tierpuede ser:bronze,silver,gold,platinum,vip,enterprise,partner,internal,test
Refactoriza a una estructura jerárquica usando agrupación.
Solución sugerida
Grupos lógicos:
- Paying customers: bronze, silver, gold, platinum
- High-value: vip, enterprise, partner
- Internal/non-paying: internal, test
Set previo:
{{
["bronze", "silver", "gold", "platinum"].includes($json.customer_tier) ? "paying" :
["vip", "enterprise", "partner"].includes($json.customer_tier) ? "high_value" :
["internal", "test"].includes($json.customer_tier) ? "internal" :
"unknown"
}}
Switch principal: 4 salidas (paying / high_value / internal / unknown). Cada salida puede tener un Switch interno si necesitas distinguir.
Resumen y siguiente paso
- Switch con muchas ramas requiere disciplina para mantenerlo legible
- Mantener cada rama corta (2-3 nodos máximo) — si crece, extraer
- Agrupar jerárquicamente cuando hay 8+ categorías con lógica compartida
- Set previo siempre — Switch sobre categoría calculada, no campo crudo
- Nombrar salidas descriptivamente para canvas auto-documentado
- Fallback robusto: notifica + loggea, nunca descartar silenciosamente
- Sub-workflows para ramas con 5+ nodos
- 5 trampas: campo crudo, demasiadas categorías sin grupos, reglas que se solapan, default silencioso, refactor sin actualizar Set
Antes de avanzar deberías poder:
- Diseñar Switch con 8+ ramas usando agrupación
- Decidir cuándo flat vs jerárquico
- Saber qué nombres asignar a salidas para legibilidad
Lo que sigue (cápsula 04):
Profundizamos el patrón pre-cálculo. Has visto Set antes de IF/Switch en varios ejemplos. La cápsula 04 lo formaliza: cómo diseñar el Set previo para que la lógica downstream sea ridículamente simple, y los patrones de categorización inteligente.
Recursos adicionales
- Refactoring: Replace Conditional with Polymorphism - Patrón general aplicable.
- n8n Sub-workflow Documentation - Execute Workflow node.
Creado: Mayo 11, 2026 Versión: 1.0