Módulo 3: Loops e Iteraciones
Mini-Proyecto: Procesar 1000 Items con Rate Limit
Descripción de la cápsula
Cierre del módulo. Vas a construir un workflow real que procesa 1000 items llamando una API con rate limit, integrando todos los patrones del módulo: SplitInBatches, Wait, retry de fallos, Aggregate al final, y reporting completo.
El caso: enriquecer 1000 leads con datos adicionales desde una API (Clearbit-style, mock o real). Esta es una tarea común en automatización de marketing/sales y demuestra dominio de los patterns de loops en producción.
Lo que vas a aprender
Al terminar este mini-proyecto serás capaz de:
- ✅ Integrar SplitInBatches + Wait + retry + Aggregate
- ✅ Procesar volumen realista (1000 items) sin saturar APIs
- ✅ Manejar errores durante el loop sin perder progreso
- ✅ Reportar resultados comprehensivos al final
- ✅ Sentir confianza para procesar listas grandes en producción
El escenario
Lo que tienes
Un Google Sheet con 1000 leads (columns: name, email, company). Quieres:
- Para cada lead, llamar una API de enrichment (simulada o real)
- La API devuelve datos extra (
industry,company_size,linkedin_url,funding) - Combinar lead + datos enrichment
- Guardar el resultado en otro Sheet
leads_enriched - Al final, mandar reporte a Slack con stats
Restricciones
- API rate limit: 10 requests/segundo (600/min)
- Tu plan de n8n: suficiente para 1000+ ejecuciones internas
- Algunos leads van a fallar (datos incompletos, API timeout) — esperado ~5%
Output esperado
- Sheet
leads_enrichedcon 950-1000 filas (los que se enriquecieron OK) - Sheet
leads_failedcon 50 filas (los que fallaron, con razón) - Slack: "Procesados 1000 leads. 952 enriquecidos. 48 fallaron. Tiempo: 2.5 min."
Paso 1: Preparar los datos
1.1. Crear el Sheet de input
Sheet leads_to_enrich. Si no tienes 1000 leads reales, genera con datos fake:
- Usa Mockaroo o similar
- 1000 filas con columns:
name,email,company
1.2. Crear Sheets para output
leads_enriched: columnsname, email, company, industry, company_size, linkedin_url, funding, enriched_atleads_failed: columnsname, email, company, failure_reason, attempted_at
1.3. API de enrichment
Para este proyecto puedes:
- Opción A (más realista): usar Clearbit free tier, Hunter.io, o similar
- Opción B (gratis): mock con JSONPlaceholder o Beeceptor — recibe email, responde con datos fake
Para la lección, asumimos mock que responde:
{
"email": "input email",
"industry": "Software",
"company_size": "50-200",
"linkedin_url": "https://linkedin.com/...",
"funding": "Series A"
}
O error 404 si email es inválido / no encuentra.
Paso 2: Construir el workflow
2.1. Workflow nuevo
Nombre: [PROY-G2M03] Enriquecer 1000 leads
2.2. Trigger
Manual Trigger (para development). En producción podrías usar Schedule diario.
2.3. Leer el Sheet
Google Sheets node:
- Operation: Get Rows
- Document:
leads_to_enrich - Filter: ninguno (todos)
Output: 1000 items.
2.4. SplitInBatches
[SplitInBatches]
- Batch Size: 10
10 items por batch → 100 batches. Con rate limit 10/seg, batch 10 + Wait 1s = exactamente al ritmo.
2.5. Dentro del loop: HTTP Request a la API
[HTTP Request]
- URL: https://your-api/enrich
- Method: POST
- Body: { "email": "{{ $json.email }}" }
- Continue On Fail: ON ← importante (cápsula 6 de G1)
- Retry On Fail: ON, max 2, wait 5000ms ← para errores transitorios
2.6. Separar éxitos y fallos
Después del HTTP, IF para clasificar:
[IF: $json.error existe o status code >= 400]
├─ TRUE → branch fallidos
└─ FALSE → branch exitosos
Branch exitosos:
- Set node: combinar datos lead + enrichment
- Sheet Append a
leads_enriched
Branch fallidos:
- Sheet Append a
leads_failedcon razón
2.7. Wait entre batches
Después del procesamiento de cada batch:
[Wait 1 second]
2.8. Loop back
Conectar el último nodo (Wait) de vuelta a SplitInBatches.
2.9. Done branch
Cuando SplitInBatches termina:
[Done] → [reporte final]
Paso 3: Reporte final con Aggregate
3.1. Leer los Sheets de resultados
Después del Done:
[Sheets: leer 'leads_enriched'] → processed_ok
[Sheets: leer 'leads_failed'] → processed_fail
3.2. Calcular stats
[Set:]
- total_processed: ok + fail
- total_ok: $json.processed_ok.length
- total_fail: $json.processed_fail.length
- success_rate: total_ok / total_processed * 100
- total_time: (variable que mantengas con $now al inicio y diferencia al final)
3.3. Slack
[Slack]
Mensaje:
📊 *Enrichment completado*
Total procesados: {{ $json.total_processed }}
✅ Exitosos: {{ $json.total_ok }}
❌ Fallidos: {{ $json.total_fail }}
Tasa éxito: {{ $json.success_rate.toFixed(1) }}%
Tiempo: {{ $json.total_time }} segundos
Sheets:
• Enriched: {{ url al sheet }}
• Failed: {{ url al sheet }}
Paso 4: Estimación de tiempo
Antes de ejecutar, calcula cuánto va a tardar:
1000 items / 10 batch_size = 100 batches
Tiempo por batch:
- 10 HTTP requests paralelas: ~1-2 segundos
- Wait: 1 segundo
Total por batch: ~3 segundos
Total: 100 × 3 = 300 segundos = 5 minutos
Si tu plan tiene timeout >5 min, perfecto. Si no, considerar:
- Reducir batch size (más batches, más rápido por batch)
- Aumentar paralelismo dentro del batch
- Dividir en 2 workflows con Schedule
Paso 5: Ejecutar y monitorear
5.1. Test con pocos items primero
No empieces con 1000. Cambia tu Sheet input a 20 items o usa un Filter al inicio que toma solo 20. Valida que todo funciona en pequeño.
5.2. Ejecutar con 1000
Cuando confirmes que funciona:
- Quita el Filter
- Click Execute Workflow
- Monitorear: abre Executions panel, ve progreso
5.3. Si algo falla durante
- Workflow se detiene → revisa nodo rojo
- Algunos items fallaron pero el loop continuó (gracias a Continue on Fail)
5.4. Verificar resultados
Al terminar:
- Sheet
leads_enricheddebe tener ~950+ filas - Sheet
leads_faileddebe tener ~50 filas con razones - Slack message recibido
Variantes opcionales
Si te quedaron ganas:
Variante 1: Resilience al failure mid-loop
¿Qué pasa si n8n se reinicia a mitad del procesamiento? Pierdes los items en progreso.
Solución:
- Agregar columna
already_processedal Sheet input - Al inicio del loop, marcar
already_processed = truedespués de procesar - Workflow restartable: empieza con Filter
already_processed = false
Variante 2: Retry diario de los fallidos
Si tienes 50 fallidos, vale la pena retry mañana (datos cambian, APIs se recuperan):
- Schedule diario que lee
leads_failed - Re-procesa solo los que la razón sugiere retry vale la pena (timeout, 5xx — no 404)
- Marca como permanently_failed después de N retries
Variante 3: Dashboard de progreso en tiempo real
Crear un Sheet progress_tracker que se actualiza cada batch:
current_batch,total_batches,ok_so_far,fail_so_far,pct_complete
Útil para procesamientos largos donde quieres ver progreso sin abrir Executions.
Reflexión final
Lo que aplicaste en este proyecto
| Patrón | Dónde |
|---|---|
| SplitInBatches (cápsula 03) | Loop principal de 100 batches |
| Process all pattern (cápsula 04) | Estrategia del loop |
| Rate limiting (cápsula 05) | Wait 1s entre batches |
| Retry on Fail (G1-M06) | HTTP node retry config |
| Continue on Fail (G1-M06) | Para no parar el loop al primer fail |
| Sheet append durante loop | Acumulación durable |
| Aggregate después del loop | Sheets read + stats |
| Reporting con Slack | Mensaje final |
Cobertura total del módulo aplicada en un solo workflow.
Lo que aprendiste en M03 (zoom out)
| Antes de M03 | Después de M03 |
|---|---|
| Procesabas máximo ~100 items | Procesas 1000+ sin saturar APIs |
| Iteración implícita era todo | Sabes cuándo explícita vale |
| Te confundía SplitInBatches | Lo usas con confianza |
| No pensabas en rate limits | Calculas Wait según API |
| Te perdían datos al fallar | Manejas errores en loops |
Más importante: ahora puedes escalar workflows a volumen real sin temor.
Resumen y siguiente paso
Lo que construiste:
- Workflow productivo procesando 1000 items
- Integración de loops, rate limit, retry, agregación, reporting
- Tasas de éxito típicas y manejo de fallos
Lo que sabes:
- Estimar tiempo de procesamientos grandes
- Diseñar loops resilientes
- Reportar resultados completos al equipo
Antes de pasar a M04:
- Workflow funcionando con 1000 items (o equivalente)
- Sheets de output configurados
- Reporte de Slack recibido
- Confianza para procesar listas grandes
Lo que sigue (Módulo 4 — Merge Avanzado y Fan-Out/Fan-In):
Hasta acá los workflows han tenido flujo principal lineal con iteraciones. M04 te enseña flujos paralelos: dividir el procesamiento en N caminos simultáneos (fan-out), procesar cada uno, y combinar resultados (fan-in). Es lo que necesitas cuando un workflow consulta múltiples APIs en paralelo y combina sus respuestas, o cuando procesa categorías distintas que terminan en un reporte único.
Recursos adicionales
- Mockaroo - Para generar datos fake de prueba.
- Beeceptor - Para mockear API endpoints.
- Clearbit Enrichment API - API real de enrichment (free tier limitado).
Creado: Mayo 11, 2026 Versión: 1.0