Automate Sales Outreach with n8n: Enrich, Sequence, and Follow Up at Scale
n8n outreach automation enriches contacts, personalizes sequences, and fires follow-ups without manual work. Browse pre-built templates to start today.
Sales outreach fails at scale in a predictable way: the first email goes out, a quarter of contacts don't respond, and the follow-up never happens because no one queued it. At 50 contacts that's a mild annoyance. At 500, it's pipeline leakage that compounds every week.
n8n outreach automation closes that gap by wiring the full sequence into a single workflow: pull contacts, enrich them, personalize the opener, send the first email, wait for replies, then trigger follow-ups for anyone who stayed silent. No separate sequencing tool. No per-seat pricing on top of what you already pay.
The sequence runs in n8n's queue mode overnight. Done right.
What You Can Automate with n8n Outreach Workflows
A well-built n8n outreach automation pipeline handles every stage of a prospecting sequence without manual intervention:
- Contact enrichment from Apollo, Hunter, or Clearbit using email address or company domain
- Personalized opening lines generated per contact from job title, company size, industry, or recent company news
- First-touch emails sent via Gmail, Outlook, or SMTP with field values resolved before send
- Reply detection that polls the inbox on a schedule before any follow-up fires
- Timed follow-up sequences at Day 3, Day 7, and Day 14 that stop automatically on reply
- Bounce and unsubscribe handling that writes the result back to the source list immediately
- CRM record creation on reply so hot leads don't sit untagged between tools
The n8n Outreach Pipeline
The core sequence flows left to right:
Schedule Trigger
→ Google Sheets (read contacts where status = queued)
→ Filter (skip sent / replied / unsubscribed)
→ HTTP Request (enrich via Apollo /people/match)
→ Code (normalize fields, build personalization context)
→ OpenAI (generate personalized opener)
→ Code (parse output, assemble email body)
→ Gmail / SMTP (send first-touch email)
→ Google Sheets (update status = sent, write sent_date)
→ Wait (72 hours)
→ Google Sheets (check reply status)
→ Filter (skip if replied = true)
→ Gmail / SMTP (follow-up #1)
Multi-step follow-ups extend the Wait → Check → Filter → Send block. It's the same three nodes repeated. You're not rebuilding the pattern each time; you're wiring it in again.
Step-by-Step Breakdown
1. Collect: Pull Contacts from the Source List
A n8n-nodes-base.scheduleTrigger v1.2 node fires once daily at 8 AM. It connects to a n8n-nodes-base.googleSheets node that reads rows where status = queued. An IF node skips any contact already marked sent, replied, or unsubscribed before the enrichment step runs.
This matters for API cost. Running 200 contacts through the enrichment API every morning — including ones already contacted — burns credits on records that don't need it. Filter first, enrich only what's new.
2. Enrich: Add Signal Before Writing the Message
The n8n-nodes-base.httpRequest v4.2 node calls Apollo's /people/match endpoint with the contact's email address. The response returns title, seniority, company_name, company_size, industry, and technologies. All of it feeds into the personalization step.
Apollo's free tier caps at 50 enrichment requests per day. A list of 300 contacts will fail partway through without rate-limit handling. Add a Wait node set to 1.2 seconds between each enrichment call. Slower, yes. But you won't hit a 429 error at contact 51 and find the rest of the batch missing data. If the company doesn't resolve, the Code node should fall back to the email domain and role rather than failing the whole execution.
3. Personalize: Generate the Opening Line
The @n8n/n8n-nodes-langchain.openAi v2.1 node writes a personalized first line per contact. The prompt receives enriched fields and outputs one sentence. Output arrives at $json.output[0].content[0].text.
A Code node reads that string and passes it into the email body assembly step. Don't parse for JSON here unless your prompt explicitly requests it — plain-text output is faster and doesn't need JSON.parse() wrapping.
Here's the actual take: don't let the AI write the full email. Write the opener in the AI step, write the rest in the Code node as a fixed template. Fully AI-generated emails have a distinct sentence rhythm that recipients recognize after the second line. A personalized opener on a human-written body doesn't. It's a two-minute fix that meaningfully affects reply rates.
4. Send: First-Touch Email
The n8n-nodes-base.gmail node (or n8n-nodes-base.sendEmail for SMTP) sends the assembled message. Subject and body come from the Code node output.
Set a daily sending cap from the start. Gmail's SMTP limit is 500 messages per day for standard accounts, 2,000 for Google Workspace. A batch of 600 contacts will hit the cap partway through and fail silently for everyone at the end of the list. Add a counter in the Code node and halt execution if the day's send count reaches your configured ceiling. Write the count to a Sheets cell and reset it at midnight.
After the send, a second Sheets write marks status = sent and records sent_date. Both fields drive the reply-detection workflow that runs separately.
5. Follow Up: Wait, Check, Send
The n8n-nodes-base.wait node pauses the execution for 72 hours. After that, a Sheets read checks whether replied = true for the contact. A Filter node blocks the follow-up if it does. The second send fires for anyone still showing replied = false.
n8n doesn't poll your Gmail inbox during the Wait period. Build a separate workflow with a Schedule Trigger running every 30 minutes. It reads your sent mail folder, looks for replies, and writes replied = true back to the source Sheet row. Without this polling workflow running in parallel, the reply-check step always returns false, even for contacts who replied hours ago. You'll send follow-ups to people who said yes. That's a deliverability problem, not just an annoyance.
Implementation Patterns
Pattern 1: Single-Step Outreach with Pre-Researched Lists
Skip enrichment entirely. A Sheets read pulls a list with name, company, role, and a custom note column already filled in by whoever built the list. The Code node uses that note as the opener without an API call. Good for high-quality lists of 50–100 contacts where the research already happened and you just want the sending and status tracking automated.
Pattern 2: Enriched Multi-Touch Cold Outreach
The full pipeline: Schedule Trigger → Sheets read → Apollo enrichment → OpenAI opener → Code (body) → Gmail send → status write → Wait → reply check → follow-up. The Creator Outreach Enrich and Sequence template covers this end-to-end, with YOUR_OPENAI_CREDENTIAL and YOUR_APOLLO_CREDENTIAL placeholders ready to swap. The template targets creator partnerships specifically, but the enrichment-to-sequence pattern is identical for B2B cold outreach. Update the prompt and email template copy and it runs the same day.
Pattern 3: Rescue Stalled Contacts
A separate weekly workflow reads contacts where sent_date is 21-plus days ago and status = sent (not replied, not unsubscribed), and routes them through a re-engagement sequence with a different subject line and a lighter ask. The Stalled Lead Rescue template handles this pattern: it queries a no-response tag, fires a simplified re-engagement email, and archives the contact after two attempts without a reply.
n8n Nodes for Outreach Automation Workflows
| Node | Purpose |
|---|---|
n8n-nodes-base.scheduleTrigger v1.2 | Fire outreach batches on a daily or weekly schedule |
n8n-nodes-base.googleSheets | Read contact lists, update send and reply status |
n8n-nodes-base.httpRequest v4.2 | Enrich contacts via Apollo, Hunter, or Clearbit |
@n8n/n8n-nodes-langchain.openAi v2.1 | Generate personalized openers from enriched contact data |
n8n-nodes-base.code v2 | Parse AI output, assemble email body, track daily send count |
n8n-nodes-base.gmail | Send outreach emails; also used for inbox polling |
n8n-nodes-base.wait | Hold execution between sequence steps |
n8n-nodes-base.filter | Block follow-ups when replied = true |
n8n-nodes-base.switch | Route contacts by status, tier, or sequence position |
Getting Started with n8n Outreach Automation
An n8n instance (self-hosted or n8n Cloud), a Gmail credential, and a Google Sheet with your contact list. Optionally: an OpenAI API key and an Apollo key for enrichment and personalization. The minimal single-step workflow runs in about 5 nodes. The full enriched multi-touch setup with reply detection spans 12 to 15 nodes across two workflows.
- Set up the Google Sheet. Columns:
email,name,company,role,status,sent_date,replied_date. Status values:queued,sent,replied,unsubscribed. This is your deduplication layer. - Build the Schedule Trigger. Fire once daily at 8 AM in the sender's timezone. Connect to the Sheets read node.
- Add a Filter node. Pass through only rows where
status = queued. - Add the enrichment HTTP Request (optional). Call Apollo's
/people/matchendpoint with the email field. Store the enriched fields in the node output for the next step. - Add the OpenAI node for the personalized opener. Use
@n8n/n8n-nodes-langchain.openAiv2.1. Wire the contact fields from the upstream node using n8n's expression editor. - Add a Code node. Read
$json.output[0].content[0].text, build the full email body string, and output the send-ready object withto,subject, andbodyfields. - Add the Gmail send node. Wire the three fields from the Code node output. Set the Gmail credential.
- Write status back to Sheets. Mark
status = sentand record today's date insent_dateafter the send completes. - Build the Wait + reply-check + follow-up block and chain it to complete the sequence.
- Build the separate reply-polling workflow on a 30-minute schedule so the reply-check step has accurate data to read.
The Creator Outreach Enrich and Sequence template ships steps 1 through 8 pre-wired. The follow-up block is included in the same template package.
Get the Outreach Sequence Template →The hardest parts of outreach automation aren't the n8n nodes — they're the sending limits and the reply-detection workflow that most tutorials skip. Without a daily cap and a polling workflow running in parallel, you'll exceed the Gmail quota, send follow-ups to people who already replied, and the automation won't feel reliable. Both pieces need to be in place before the sequence is trustworthy.
For teams that want to qualify leads before they enter the outreach sequence, the n8n lead scoring guide covers ranking contacts 0–100 with an AI scoring step before any email fires. For handling replies once they arrive, n8n email inbox automation covers routing, tagging, and auto-response workflows for the inbound side.
The Email Follow-Up Automator template is a good standalone option if you've already got first-touch emails running and just need the follow-up cadence wired without rebuilding from scratch.
Browse all lead and outreach templates →Common questions
How do I build an automated outreach sequence in n8n?
Can n8n personalize cold outreach emails automatically?
How does n8n handle follow-up deduplication and reply detection?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
Get 3 tested n8n templates, free
The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Test-run on a live n8n instance like everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.
- 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
- 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
- 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14
More automation guides

n8n Churn Prevention: Score At-Risk Subscribers Before They Cancel
Churn Announces Itself Before It Happens Most cancellation events look sudden from the Stripe dashboard. They aren't. The signals arrive two to four weeks earlier: logins drop from daily to twice a we…

n8n Telegram Automation: Alerts, Bots, and Notification Workflows
Telegram Gets Read. Email Doesn't. Most alert pipelines route to email. That's fine until the alert actually matters — a service down at 2 a.m., a high-value user hitting a plan ceiling, a negative re…

Automate Freemium Conversion with n8n Workflows
Free Users Don't Upgrade on Their Own Most SaaS products convert fewer than 5% of free signups to paid. That's not a product quality problem. It's a timing problem. Free users hit moments of genuine n…