Publicado: 7 de agosto de 2026

Cold email a escala en n8n

Cold email a escala en n8n | Logixb2b

Cola de envío con verificación, rate limit, borrador HITL y upsert CRM (Europe/Madrid).

Cold email a escala n8n: cola, verificación, HITL, HubSpot o Pipedrive, Sheets y Slack. Rate limit 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 ciego

Disparar cientos de correos desde un buzón sin verificar, sin warmup y sin techo diario no es cold email a escala: es un blast que quema dominio, baja la tasa de respuesta y deja el CRM lleno de contactos marcados como contactados sin contexto de campaña. Este workflow de n8n orquesta la cola: filtra no verificados, aplica maxEmailsPerDay, prepara un borrador, exige HITL si lo configuras y deja traza en CRM, Sheets Cold_Email y Slack.

El flujo no envía SMTP. El envío real lo haces con Instantly u otro ESP autorizado, donde viven el warmup y la rotación de inbox. La guía educativa de las cuatro fases está en /cold-email-escala-herramientas-automatizacion. Este recurso es la mitad de implementación: el JSON importable con timezone Europe/Madrid.

Úsalo cuando ya tengas ICP y emails cualificados, y quieras un control repetible antes de subir volumen: verificación obligatoria, techos diarios, aprobación humana en los primeros lotes y registro de cada decisión (enviado, pendiente HITL u omitido).

Qué necesitas antes de importar el JSON

Una instancia de n8n (local para probar, Cloud o VPS en la UE) y una campaña escrita: nombre, techos diarios, criterio de baja y tono del primer mensaje. Sin ese documento, Config solo repite números sueltos.

Leads con email, nombre, cargo, empresa y flag de verificación. Este flujo no sustituye al constructor de listas ICP ni al verificador: empieza donde terminan. Campos útiles: firstName, lastName, email, title, company, emailVerified, queueState, repliedAt.

CRM con API (HubSpot Private App o api_token de Pipedrive), pestaña Google Sheets Cold_Email y Incoming Webhook de Slack. Decide campaignName, maxEmailsPerDay, maxPerInbox, requireVerifiedEmail, requireHitlBeforeSend, stopOnReply, sheetsId, slackWebhookUrl y batchLabel 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 cold email. Config Cold Email Escala concentra campaignName, techos, flags de verificación e HITL, crmProvider, tokens placeholder, sheetsId, slackWebhookUrl, batchLabel, timezone Europe/Madrid y emailsSentToday (contador de referencia para el demo).

Desde Config sale Payload de prueba (4 leads): Ana (verified_ready), Bruno (unverified_skip), Carla (replied_stop) y Diego (pending_hitl). Ese payload alimenta Filtrar y rate-limit, que calcula queueReady, skipReason y requireHitl.

IF cola lista: true → Preparar borrador cold email → IF requireHitl → Slack HITL o Auto → Upsert last_cold_email_at → Append Sheets → Slack resumen. False → Append Sheets (omitido) con skipReason. El workflow llega inactive y en timezone Europe/Madrid.

Cómo funciona Filtrar y rate-limit

El nodo lee Config y cada lead. Si stopOnReply está activo y hay repliedAt o queueState replied_stop, marca skipReason respondio_stop_cola. Si requireVerifiedEmail es true y emailVerified es false, marca email_no_verificado.

Si emailsSentToday ya alcanzó maxEmailsPerDay, marca techo_diario_alcanzado. Solo cuando pasa los filtros, queueReady = true. Si además requireHitlBeforeSend está activo, requireHitl = true para forzar la rama de aprobación.

maxPerInbox queda documentado en Config como techo de referencia: aplícalo también en el ESP. Este evaluador no sustituye los límites del proveedor de envío.

Payload de prueba: Ana, Bruno, Carla y Diego

Ana Rios (Head of Sales, NorTech SL, verified_ready, emailVerified true) entra en cola. Con HITL activo verás el borrador en Slack antes de cualquier envío real.

Bruno Vila (CEO, OrbitSoft, unverified_skip, emailVerified false) se omite con email_no_verificado: demuestra por qué no debes meter filas sin verificar en la cola de producción.

Carla Mendez (VP Revenue, PlainData, replied_stop) demuestra stopOnReply: aunque el email esté verificado, la respuesta previa detiene la cola. Diego Soler (Director Comercial, AtlasOps, pending_hitl) refuerza la rama humana. Ejecuta Manual Trigger sin CRM real primero y revisa queueReady, skipReason y draftMessage en cada rama.

HITL, borrador y Upsert CRM con last_cold_email_at

IF requireHitl bifurca según el flag del item. Si aplica, Slack HITL aprobación publica asunto, cuerpo, empresa y email para revisión humana antes de copiar el mensaje a Instantly u otro ESP. Si HITL está desactivado, Auto continúa sin bloqueo en n8n.

Upsert CRM (last_cold_email_at) escribe progreso en HubSpot o Pipedrive según crmProvider. En HubSpot conviene crear propiedades custom (cold_campaign, last_cold_email_at). El nodo no envía el correo: solo registra que la cola preparó ese contacto.

Ese timestamp es la fuente de verdad para no duplicar envíos si el Schedule corre cada hora y para que el comercial vea la última actividad de cold email en la ficha.

Sheets Cold_Email, Slack e importar el JSON

Crea la pestaña Cold_Email con columnas: fecha, batchLabel, campaignName, email, company, verified, estado (cola_preparada, pendiente_hitl u omitido con skipReason) y crmProvider. Comparte la hoja con la cuenta OAuth de Google Sheets en n8n y pega el Spreadsheet ID en sheetsId.

Hay tres Append Sheets: cola preparada, pendiente HITL y omitido. Slack resumen notifica empresa, email y proveedor CRM. Import: n8n → ⋯ → Import from File → assets/workflows/cold-email-escala-n8n.json.

En producción sustituye Manual Trigger + Payload de prueba por Schedule Trigger + lectura Sheets/CRM con el mismo shape de campos. No mezcles filas demo @example.com con leads reales en la misma ejecución.

Producción 24/7, ESP, Make y Zapier

Un evaluador que solo corre cuando abres el portátil no mantiene colas vivas. Sustituye Manual Trigger por Schedule (por ejemplo cada hora), lee estado real y vuelve a ejecutar Filtrar y rate-limit por lote. Evita Wait largos: bloquean la ejecución y no escalan.

VPS UE: Ubuntu, Docker Compose, n8n + Postgres, HTTPS, GENERIC_TIMEZONE=Europe/Madrid, WEBHOOK_URL y N8N_ENCRYPTION_KEY. Aplica maxEmailsPerDay y warmup también en Instantly (u otro ESP). El techo del Config es referencia, no sustituye los límites del proveedor.

Make o Zapier replican el mapa: Schedule → leer pendientes → Router (verificado + techo + 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 y vía clara de baja. stopOnReply y skipReason respondio_stop_cola evitan insistir tras un no me interesa.

Revisa humanamente los borradores cuando requireHitlBeforeSend está activo. Ese HITL amortigua homónimos, tono inadecuado o alucinaciones si más adelante conectas un LLM a Preparar borrador. complianceFlag rgpd_interes_legitimo_b2b_hitl_antes_envio recuerda la revisión en Sheets.

Si generas mensajes con un modelo generativo, 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 el cold email por SMTP?

No. Preparar borrador cold email solo genera asunto y cuerpo. El envío real lo haces en Instantly u otro ESP autorizado tras HITL si aplica.

¿Qué hace Filtrar y rate-limit?

Marca queueReady y skipReason según email verificado, maxEmailsPerDay y stopOnReply, con timezone Europe/Madrid.

¿Por qué cuatro leads en el payload demo?

Ana (listo + HITL), Bruno (sin verificar), Carla (respuesta previa) y Diego (HITL) cubren las ramas principales sin tocar el CRM real.

¿Debo usar Wait de n8n para espaciar envíos?

No en producción. Un Wait largo bloquea la ejecución. Usa Schedule Trigger + lectura Sheets/CRM + Filtrar y rate-limit. El ESP aplica sus propios delays y warmup.

¿Qué escribe Upsert CRM (last_cold_email_at)?

Actualiza la ficha en HubSpot o Pipedrive con campaña y timestamp. No sustituye el envío; es trazabilidad de cola.

¿Qué columnas debe tener Cold_Email?

fecha, batchLabel, campaignName, email, company, verified, estado y crmProvider. Sin esa pestaña, los Append Sheets fallarán.

¿Dónde van tokens de HubSpot, Pipedrive y Slack?

Nunca en el JSON descargado. Crea Credentials dentro de n8n y enlázalas. Config trae REEMPLAZA_* a propósito.

¿Dónde está la guía larga de este recurso?

En /cold-email-escala-herramientas-automatizacion. Esta página es la mitad de implementación (JSON + pasos).