Leadfeeder to Google Sheets, enriched leads ready
Your best leads are already on your site. The problem is they show up in the wrong places, at the wrong time, and usually without enough detail to act. This Leadfeeder Sheets enrichment workflow fixes the daily “who visited?” scramble and turns it into a clean, enriched list your team can actually use.
Growth marketers feel it when campaigns drive traffic but no one follows up fast. Sales ops teams see it in messy spreadsheets and duplicate rows. And SDR managers end up chasing context instead of coaching outreach.
This automation pulls yesterday’s visitors from Leadfeeder, enriches companies via Apollo, updates Google Sheets with deduplication, and pings Telegram if something breaks. You’ll see how it works, what you need, and what to tweak.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Leadfeeder to Google Sheets, enriched leads ready
flowchart LR
subgraph sg0["Daily Trigger (9 AM) Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Daily Trigger (9 AM)", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Leadfeeder Account ID"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Generate Pagination Sequence"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Pagination Controller", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Current Page Number", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Lead Data (Leadfeed.."]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Last Page Condition", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Leads (Last Page)", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Enrich with Apollo (Last Page)"]
n9@{ icon: "mdi:database", form: "rounded", label: "Save Leads to Google Sheets ..", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Leads (Full Page)", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Enrich with Apollo (Full Page)"]
n12@{ icon: "mdi:database", form: "rounded", label: "Save Leads to Google Sheets ..", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Rate Limit Delay (40s)", pos: "b", h: 48 }
n0 --> n1
n3 --> n4
n13 --> n3
n6 --> n7
n6 --> n10
n10 --> n11
n7 --> n8
n4 --> n5
n1 --> n2
n2 --> n3
n11 --> n12
n8 --> n9
n5 --> n6
n12 --> n13
end
subgraph sg1["Workflow Error Listener Flow"]
direction LR
n14@{ icon: "mdi:play-circle", form: "rounded", label: "Workflow Error Listener", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format Error Report"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send Alert to Telegram"]
n15 --> n16
n14 --> n15
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n14 trigger
class n6 decision
class n9,n12 database
class n1,n5,n8,n11 api
class n2,n15 code
classDef customIcon fill:none,stroke:none
class n1,n2,n5,n8,n11,n15,n16 customIcon
The Problem: Daily Lead Enrichment Turns Into Busywork
It adds up fast. Here’s where it breaks down in real teams.
- Manual exports and copy-paste usually take about 30–60 minutes per day once you include cleanup.
- Without enrichment, reps write generic outreach because they have no industry, size, or revenue context.
- Duplicate rows creep in over time, which means reporting becomes a guessing game.
- If an API request fails silently, you can go days without realizing yesterday’s traffic never made it into your pipeline.
The Solution: Daily Leadfeeder → Apollo Enrichment → Sheets (With Alerts)
This n8n workflow runs every morning and builds a dependable “yesterday’s visitors” pipeline. At 9:00 AM server time, it fetches your Leadfeeder account, then pulls the prior day’s visitor/company results in batches. Each company gets enriched through Apollo.io so you’re not stuck with just a name and a URL. Next, the workflow normalizes website fields, applies fallbacks when Apollo data is missing, and writes the record into Google Sheets using ID matching so you update existing rows instead of adding duplicates. If something goes wrong, Telegram alerts your team so it’s fixed before follow-up slips.
The workflow starts on a daily schedule. From there, it paginates through Leadfeeder safely (with a cap so it doesn’t run wild), enriches each record through Apollo, and then merges everything into a clean Google Sheet. Errors go to Telegram, so you’re not flying blind.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team reviews 50 visitor companies per day. Manually, even a quick process is maybe 2 minutes to copy the visitor data and 3 minutes to look up firmographics, which is about 4 hours of busywork each day. With this workflow, the only “hands-on” part is checking the Google Sheet and acting on the top accounts, which might take 10 minutes. The enrichment and sheet updates run in the background, and the built-in 40-second delay helps avoid Apollo throttling.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Leadfeeder for yesterday’s visitor/company data
- Apollo.io to enrich firmographics and profiles
- Google Sheets to store and share enriched leads
- Telegram for error alerts your team will notice
- Leadfeeder API token (get it from Leadfeeder API/settings)
- Apollo API key (get it from Apollo dashboard settings)
Skill level: Intermediate. You’ll connect a few accounts, map sheet columns, and run a test for “yesterday” to confirm data lands correctly.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Daily scheduled trigger at 9:00 AM. The workflow runs automatically based on server time, so the process is consistent and doesn’t depend on someone remembering.
Leadfeeder retrieval with safe pagination. It fetches your Leadfeeder account, generates a page sequence (up to 50 pages as a safety cap), then pulls yesterday’s leads in batches of 100. When a page returns fewer than 100 results, it stops, which prevents pointless calls.
Apollo enrichment with rate limiting. Each lead is processed individually, enriched in Apollo, and normalized so common fields (like websites) match reliably. There’s a built-in delay (40 seconds) to reduce the chance of throttling.
Google Sheets update plus Telegram alerting. The workflow appends or updates rows using ID-based deduplication, then sends Telegram alerts if an error trigger fires so you can fix it before the day’s outreach.
You can easily modify the sheet columns and the enrichment fields to match your scoring model or ABM segments. See the full implementation guide below for customization options.
Common Gotchas
- Google Sheets OAuth credentials can expire or lack edit access. If rows stop updating, check the connected Google account and the spreadsheet sharing permissions first.
- If you’re using Wait logic for Apollo rate limiting, processing times vary. Bump up the wait duration if downstream HTTP Request nodes fail because Apollo hasn’t returned data yet.
- Apollo enrichment is only as good as your prompts and field mapping. If you leave defaults and generic fallbacks, you’ll end up with inconsistent industries and lots of manual cleanup.
Frequently Asked Questions
About an hour if your APIs and sheet are ready.
No. You’ll connect accounts, paste API keys, and map a few sheet columns.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Apollo API usage based on how many companies you enrich each day.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but plan to spend a few minutes on column mapping. Update the Google Sheets “append/update row” mapping to match your headers, and adjust the Set (Edit Fields) nodes where the workflow normalizes websites and fills Apollo fallbacks. Common tweaks include adding a lead score column, storing the visit date in a separate field, and tagging rows by campaign or landing page.
Usually it’s an expired or incorrect Bearer token in the HTTP header. Regenerate the Leadfeeder API token and replace it in the Leadfeeder HTTP Request nodes. Also check that your account ID retrieval succeeds, because a wrong account context can make the “get leads” call look like it’s working while returning empty results.
A lot, realistically, because it’s built around batching and pagination. It pulls results in batches of 100 and can page up to 50 pages as a safety cap, so you’re looking at up to about 5,000 visitor companies in a run before you’d even need to adjust limits. On n8n Cloud, your practical ceiling is your monthly execution allowance and how many items you process per run. If you self-host, there’s no execution limit, but Apollo rate limits and your server resources still matter.
Often, yes, because this workflow needs batching, stop logic, and rate limiting to stay friendly with APIs. n8n makes that kind of control straightforward, and self-hosting can keep costs predictable when volume grows. Zapier or Make can be quicker for a tiny 2-step flow, but they get awkward (and pricey) when you’re looping over hundreds of records. If you want, Talk to an automation expert and we’ll tell you which route is honestly simplest for your setup.
Set this up once and your “yesterday’s visitors” list becomes a reliable morning routine instead of a daily fire drill. The workflow handles the repetitive parts, so your team can focus on outreach that actually converts.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.