A complete cold email outreach pipeline built on n8n and Google Sheets. Import prospects, run multi-step email sequences, track replies, and get daily campaign reports.
Cold email outreach requires consistent followup sequences, reply detection, and status tracking across hundreds of prospects. Most tools charge $50-200/month per seat and lock you into their platform.
This system provides a free, self-hosted outreach pipeline with full control over your data and sending.
| # | File | Purpose |
|---|---|---|
| --- | ------ | --------- |
| 01 | 01-prospect-import.json | Webhook import with validation, dedup, and Sheets storage |
| 02 | 02-outreach-sequence.json | Scheduled 4-step email sequence with timing logic |
| 03 | 03-reply-tracker.json | Webhook to log replies and notify team |
| 04 | 04-campaign-report.json | Daily campaign analytics email |
Prospect Import (webhook/CSV)
|
v
Workflow 01: Validate & Store
+-> Deduplicate by email
+-> Save to Google Sheets (status: new)
Scheduled (every 4 hours):
|
v
Workflow 02: Outreach Sequence
+-> Read prospects with status != replied/bounced
+-> Check timing (Day 0/3/7/14)
+-> Send appropriate email template
+-> Update step + next_send_at in Sheets
Reply received:
|
v
Workflow 03: Reply Tracker
+-> Match email to prospect
+-> Mark as replied in Sheets
+-> Notify team via email
Daily Schedule:
|
v
Workflow 04: Campaign Report
+-> Aggregate metrics by campaign
+-> Reply rate, bounce rate, step distribution
+-> Email report to admin
| Step | Timing | Template |
|---|---|---|
| ------ | -------- | ---------- |
| 1 - Initial | Day 0 | Introduction + value proposition |
| 2 - Follow-up 1 | Day 3 | Brief followup + case study mention |
| 3 - Follow-up 2 | Day 7 | Different angle + call-to-action |
| 4 - Breakup | Day 14 | Polite closing, leaves door open |
| Credential Type | Used For | Placeholder in JSON |
|---|---|---|
| ---------------- | ---------- | --------------------- |
| Google Sheets OAuth2 | Prospect storage and tracking | YOUR_GOOGLE_SHEETS_CREDENTIAL_ID |
| SMTP | Sending outreach emails and reports | YOUR_SMTP_CREDENTIAL_ID |
# Required
OUTREACH_SECRET=your-webhook-auth-secret
OUTREACH_ADMIN_EMAIL=admin@yourbusiness.com
| Placeholder | Description |
|---|---|
| ------------- | ------------- |
YOUR_OUTREACH_SHEET_ID | Google Sheet ID for prospect data |
YOUR_GOOGLE_SHEETS_CREDENTIAL_ID | n8n Google Sheets credential ID |
YOUR_SMTP_CREDENTIAL_ID | n8n SMTP credential ID |
YOUR_NOTIFICATION_EMAIL | Fallback admin email (also set via OUTREACH_ADMIN_EMAIL env) |
| Column | Type | Description |
|---|---|---|
| -------- | ------ | ------------- |
| text | Primary key, prospect email | |
| name | text | Prospect name |
| company | text | Company name |
| title | text | Job title |
| campaign | text | Campaign identifier |
| status | text | new / in_sequence / replied / bounced / completed |
| step | number | Current sequence step (0-4) |
| last_sent_at | datetime | When last email was sent |
| next_send_at | datetime | When next email is due |
| replied | boolean | Whether prospect replied |
| replied_at | datetime | Reply timestamp |
| bounced | boolean | Whether email bounced |
| imported_at | datetime | Import timestamp |
Create a Google Sheet with the columns above. Name the tab "Prospects".
Import all 4 JSON files into n8n. Replace all YOUR_* placeholders.
curl -X POST https://your-n8n.com/webhook/outreach/import \
-H "Content-Type: application/json" \
-d '{
"_secret": "your-outreach-secret",
"prospects": [
{"email": "john@company.com", "name": "John", "company": "Acme Inc", "campaign": "q1-2026"}
]
}'
curl -X POST https://your-n8n.com/webhook/outreach/reply \
-H "Content-Type: application/json" \
-d '{"email": "john@company.com", "subject": "Re: Quick question", "message": "Sure, let us chat!"}'
共 1 个版本