Skip to main content
Lifetime license included with every purchase
n8n workflowssales outreachlead automationemail sequences

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.

Nn8n Marketplace Team·June 13, 2026·9 min read

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.

Rate limits aren't obvious until they hit

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.

Reply detection needs its own workflow

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

NodePurpose
n8n-nodes-base.scheduleTrigger v1.2Fire outreach batches on a daily or weekly schedule
n8n-nodes-base.googleSheetsRead contact lists, update send and reply status
n8n-nodes-base.httpRequest v4.2Enrich contacts via Apollo, Hunter, or Clearbit
@n8n/n8n-nodes-langchain.openAi v2.1Generate personalized openers from enriched contact data
n8n-nodes-base.code v2Parse AI output, assemble email body, track daily send count
n8n-nodes-base.gmailSend outreach emails; also used for inbox polling
n8n-nodes-base.waitHold execution between sequence steps
n8n-nodes-base.filterBlock follow-ups when replied = true
n8n-nodes-base.switchRoute contacts by status, tier, or sequence position

Getting Started with n8n Outreach Automation

What you'll need

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.

  1. 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.
  2. Build the Schedule Trigger. Fire once daily at 8 AM in the sender's timezone. Connect to the Sheets read node.
  3. Add a Filter node. Pass through only rows where status = queued.
  4. Add the enrichment HTTP Request (optional). Call Apollo's /people/match endpoint with the email field. Store the enriched fields in the node output for the next step.
  5. Add the OpenAI node for the personalized opener. Use @n8n/n8n-nodes-langchain.openAi v2.1. Wire the contact fields from the upstream node using n8n's expression editor.
  6. Add a Code node. Read $json.output[0].content[0].text, build the full email body string, and output the send-ready object with to, subject, and body fields.
  7. Add the Gmail send node. Wire the three fields from the Code node output. Set the Gmail credential.
  8. Write status back to Sheets. Mark status = sent and record today's date in sent_date after the send completes.
  9. Build the Wait + reply-check + follow-up block and chain it to complete the sequence.
  10. 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
FAQ

Common questions

How do I build an automated outreach sequence in n8n?
A Schedule Trigger pulls contacts from a Google Sheet where status equals queued. An HTTP Request node enriches each contact via Apollo's /people/match endpoint. An @n8n/n8n-nodes-langchain.openAi v2.1 node generates a personalized opener from the enriched data. A Code node reads the output at $json.output[0].content[0].text, builds the email body, and passes it to a Gmail send node. A Wait node holds execution for 72 hours before a reply check and follow-up block run.
Can n8n personalize cold outreach emails automatically?
Yes. The @n8n/n8n-nodes-langchain.openAi v2.1 node generates a one-sentence personalized opener per contact using enriched fields like role, company size, and industry. The output is at $json.output[0].content[0].text. A Code node slots that opener into a human-written email template, so only the first line is AI-generated — the rest stays consistent and avoids the cadence that AI-detection tools flag.
How does n8n handle follow-up deduplication and reply detection?
A separate workflow runs every 30 minutes on a Schedule Trigger, reads your sent folder, and writes replied = true back to the source Google Sheet or Airtable row. Before each follow-up fires, a Google Sheets read node checks the reply status and a Filter node blocks the send if replied equals true. Without the polling workflow running in parallel, the reply check always returns false — even when someone responds.
Stop reading. Start running.

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.

Free — $40 value

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