Secuencia outbound en n8n

Orquesta toques email/LinkedIn con delays, stop on reply, HITL en paso 1 y upsert CRM (Europe/Madrid).
Secuencia outbound n8n con steps, delays, HITL, HubSpot o Pipedrive, Sheets y Slack. Cadence bajo RGPD Europe/Madrid.
Descarga el workflow
JSON listo para importar en n8n (Import from File). Sustituye solo REEMPLAZA_* y credenciales.
Qué problema resuelve frente al blast masivo
Enviar el mismo email a quinientas filas un martes a las 9:00 no es prospección: es un blast que quema dominio, baja la tasa de respuesta y deja en el CRM contactos marcados como contactados sin contexto de qué paso les tocaba ni por qué canal.
Este workflow de n8n no dispara SMTP ni automatiza LinkedIn. Es una máquina de estados que, por cada lead, calcula si toca el siguiente paso, con qué canal y cuántas horas faltan. Genera un borrador en Preparar mensaje paso (borrador), respeta stopOnReply y maxSteps, y deja traza en CRM, Sheets y Slack. El envío real lo haces tú con tu proveedor ya autorizado, después de revisar el borrador si aplica HITL.
La guía educativa —diferencia blast vs secuencia, cadencia, cumplimiento B2B y checklist operativo— está en /secuencias-outbound-automatizadas-guia-paso-a-paso. Este recurso es la mitad de implementación: el JSON importable que convierte esa estrategia en evaluaciones repetibles con timezone Europe/Madrid.
Qué necesitas antes de importar el JSON
Una instancia de n8n (local para probar, Cloud o VPS en la UE) y una secuencia escrita: cuántos pasos (1–3 de partida), delays entre toques, canales (channelsCsv: email, linkedin), tono del primer mensaje y criterio claro de baja. Sin ese documento, Config solo repite números sueltos.
Leads ya cualificados o al menos con email, nombre, cargo y empresa. Este flujo no sustituye al constructor de listas ICP: empieza donde termina tu filtro. Campos mínimos útiles: firstName, lastName, email, title, company, sequenceState, currentStep, enrolledAt, lastTouchAt y repliedAt cuando aplique.
CRM con API (HubSpot Private App o api_token de Pipedrive), pestaña Google Sheets Secuencia_Outbound y un Incoming Webhook de Slack. Decide sequenceName, maxSteps (3), delays por paso, maxTouchesPerDay (40 como techo de referencia), stopOnReply (true) y requireHitlBeforeStep1 (true recomendado) antes de Active. El JSON llega con REEMPLAZA_* y emails @example.com a propósito.
Cómo está construido el workflow (mapa del lienzo)
El lienzo abre con el sticky INSTRUCCIONES (conectar + VPS) y Manual Trigger secuencia.
Desde Config sale Payload de prueba (3 leads, 3 estados): Marta Roig (pending_step1), Pau Illa (waiting_step2) y Clara Peña (replied_stop). Ese payload alimenta Evaluar siguiente paso, que calcula nextStep, nextChannel, waitHours, skipReason, scheduledNextAtUtc y shouldTouchNow.
IF debe ejecutar toque ahora filtra filas con shouldTouchNow === true. True → Preparar mensaje paso (borrador) → IF requireHitl (paso 1) → Slack HITL aprobación o Auto (sin HITL requerido) → Upsert CRM (last_outbound_step) → Append Sheets (Secuencia_Outbound) → Slack resumen toque. False → Append Sheets (omitido) con skipReason. El workflow llega inactive y en timezone Europe/Madrid.
Cómo funciona Evaluar siguiente paso (delays, stopOnReply, maxSteps)
El nodo Evaluar siguiente paso lee la configuración y el estado de cada lead. Si sequenceState es replied_stop y stopOnReply está activo, marca skipReason respondio_stop_secuencia y no programa más toques. Si currentStep ≥ maxSteps, cierra con secuencia_completada_max_steps.
Si aún quedan pasos, calcula nextStep = currentStep + 1, elige nextChannel rotando según channelsCsv (paso 1 → email, paso 2 → linkedin, etc.) y aplica el delay del paso (delayHoursStep1, delayHoursStep2, delayHoursStep3). El ancla temporal es lastTouchAt o, si es el primer toque, enrolledAt. Compara horas transcurridas con el delay: si la ventana se cumplió, shouldTouchNow = true; si no, skipReason ventana_delay_no_cumplida y waitHours indica cuánto falta. scheduledNextAtUtc documenta cuándo tocaría el siguiente intento.
Para el paso 1 con requireHitlBeforeStep1 activo, el Code marca requireHitl = true cuando shouldTouchNow y nextStep === 1.
Payload de prueba: Marta, Pau y Clara (tres ramas distintas)
Marta Roig (Head of RevOps, Vertex Cloud SL, pending_step1, currentStep 0, enrolledAt hace ~3 h) representa un lead recién inscrito listo para el primer toque. Con delayHoursStep1 = 2, la ventana ya se cumplió: shouldTouchNow = true, nextStep = 1, nextChannel = email y requireHitl = true si requireHitlBeforeStep1 está activo. Verás el borrador en Slack HITL antes de cualquier envío real.
Pau Illa (Director Comercial, NortLog B2B, waiting_step2, currentStep 1, lastTouchAt hace ~60 h) simula el segundo toque. Con delayHoursStep2 = 48, la ventana también se cumple: nextStep = 2, nextChannel = linkedin y requireHitl = false (solo aplica al paso 1). El flujo pasa por Auto y actualiza last_outbound_step en el CRM.
Clara Peña (VP Sales, SaaSForge, replied_stop, currentStep 2, repliedAt hace ~18 h) demuestra stopOnReply: aunque no haya alcanzado maxSteps, la secuencia se detiene con skipReason respondio_stop_secuencia. Ejecuta Manual Trigger sin CRM real primero y revisa shouldTouchNow, skipReason y draftMessage en cada rama antes de conectar credenciales.
HITL en el paso 1 y Upsert CRM con last_outbound_step
IF requireHitl (paso 1) bifurca según requireHitl del item. Si es el primer toque y requireHitlBeforeStep1 = true, Slack HITL aprobación envía el borrador (asunto, cuerpo, canal, empresa) para revisión humana antes de que copies el mensaje a tu herramienta de envío. Si HITL está desactivado o es paso 2+, Auto (sin HITL requerido) continúa sin bloqueo en n8n.
Upsert CRM (last_outbound_step) es un HTTP Request que escribe el progreso de la secuencia en HubSpot o Pipedrive según crmProvider. En HubSpot actualiza propiedades como last_outbound_step, sequence_name y outbound_channel; créalas como custom properties si aún no existen. En Pipedrive actualiza la persona asociada al email del lead.
El nodo no envía el email: solo registra qué paso se preparó y cuándo.
Sheets Secuencia_Outbound, Slack e importar el JSON
Crea la pestaña Secuencia_Outbound con columnas: fecha, batchLabel, sequenceName, firstName, lastName, email, company, nextStep, nextChannel, shouldTouchNow, skipReason, waitHours, scheduledNextAtUtc, requireHitl, estado (enviado, pendiente_hitl u omitido) y complianceFlag. Comparte la hoja con la cuenta OAuth de Google Sheets en n8n y pega el Spreadsheet ID en sheetsId.
Hay tres nodos Append Sheets: uno para toques enviados o preparados, otro para pendientes HITL y otro para omitidos (delay no cumplido, respuesta recibida o secuencia completada). Slack resumen toque notifica cada acción con empresa, email, paso, canal y skipReason si aplica.
Import: n8n → ⋯ → Import from File → assets/workflows/secuencias-outbound-automatizadas-n8n.json. En producción sustituye Manual Trigger + Payload de prueba por Schedule Trigger + lectura Sheets/CRM que entregue el mismo shape de campos. No mezcles filas demo @example.com con leads reales en la misma ejecución.
Producción 24/7: Schedule como máquina de estados (Make, Zapier)
Un evaluador que solo corre cuando abres el portátil no mantiene secuencias vivas. En producción sustituye Manual Trigger por Schedule Trigger (p. ej. cada hora) que lee el estado real desde Sheets o CRM y ejecuta Evaluar siguiente paso por lote. Evita un nodo Wait de días: bloquea la ejecución y no escala. scheduledNextAtUtc en cada item documenta cuándo reintentar.
VPS UE (Hetzner, OVH, IONOS… ): Ubuntu, Docker Compose, n8n + Postgres, HTTPS, GENERIC_TIMEZONE=Europe/Madrid, WEBHOOK_URL y N8N_ENCRYPTION_KEY. Firewall 80/443 (+ SSH). Backups Postgres y export periódico de workflows.
Make o Zapier replican el mapa: Schedule → leer filas pendientes → Router con la lógica de delay y stopOnReply → borrador → Slack HITL → update CRM → Sheets. Este JSON es el esqueleto n8n; no copies secretos entre plataformas.
RGPD, interés legítimo B2B, HITL y EU AI Act
Tratas datos de contacto B2B (email, nombre, cargo, empresa). La base jurídica habitual es interés legítimo, documentada: mensaje relevante al cargo, minimización de campos y vía clara de baja. stopOnReply y skipReason respondio_stop_secuencia honran respuestas y evitan insistir tras un no me interesa.
Revisa humanamente cada borrador del paso 1 (requireHitlBeforeStep1) antes del primer toque real. Ese HITL es el colchón frente a homónimos, tono inadecuado o alucinaciones si más adelante conectas un LLM a Preparar mensaje. complianceFlag rgpd_interes_legitimo_b2b_hitl_antes_primer_toque recuerda la revisión en Sheets.
Si generas mensajes con un modelo generativo o automatizas decisiones de cadencia con IA, sois deployers bajo el Reglamento (UE) 2024/1689 (EU AI Act). Desde el 2 de febrero de 2025 el Artículo 4 exige alfabetización en IA. Detalle en /uso-responsable-de-ia-y-transparencia. Texto informativo; no sustituye asesoramiento legal.
Preguntas frecuentes
¿Este flujo envía emails o mensajes de LinkedIn automáticamente?
No. Preparar mensaje paso (borrador) solo genera un borrador (asunto/cuerpo). El envío real lo haces tú con SMTP, tu ESP o LinkedIn ya autorizado, después de HITL en el paso 1 si requireHitlBeforeStep1 está activo.
¿Qué hace Evaluar siguiente paso exactamente?
Calcula nextStep, nextChannel, shouldTouchNow, waitHours, skipReason y scheduledNextAtUtc por lead. Respeta stopOnReply, maxSteps y los delays de Config Secuencia Outbound con timezone Europe/Madrid.
¿Por qué Marta, Pau y Clara en el payload demo?
Marta (pending_step1) fuerza primer toque con HITL. Pau (waiting_step2) simula segundo toque automático tras cumplir delay. Clara (replied_stop) demuestra que stopOnReply detiene la secuencia aunque no se haya llegado a maxSteps.
¿Debo usar Wait de n8n para los delays de días?
No en producción. Un Wait largo bloquea la ejecución. Usa Schedule Trigger (cada hora) + lectura Sheets/CRM + Evaluar siguiente paso. scheduledNextAtUtc documenta cuándo reintentar.
¿Qué escribe Upsert CRM (last_outbound_step)?
Actualiza el progreso de la secuencia en HubSpot o Pipedrive según crmProvider: last_outbound_step, sequence_name y canal. No sustituye el envío; es trazabilidad para la máquina de estados.
¿Qué columnas debe tener la pestaña Secuencia_Outbound?
fecha, batchLabel, sequenceName, email, company, nextStep, nextChannel, shouldTouchNow, skipReason, waitHours, scheduledNextAtUtc, requireHitl, estado (enviado, pendiente_hitl u omitido) y complianceFlag. Sin esa pestaña, los Append Sheets fallarán.
¿Dónde van mis tokens de HubSpot, Pipedrive y Slack?
Nunca en el JSON descargado. Crea Credentials dentro de n8n y enlázalas en los nodos HTTP/Sheets. Config Secuencia Outbound trae REEMPLAZA_* a propósito.
¿Dónde está la guía larga de este recurso?
En el artículo companion /secuencias-outbound-automatizadas-guia-paso-a-paso. Esta página es la mitad de implementación (JSON + pasos). El artículo cubre blast vs secuencia, cadencia, HITL y RGPD con más contexto.