Apify + Google Sheets: funded leads with email drafts
You find a “recently funded” company, then you copy names into a sheet, then you hunt for an email, then you write a cold email from scratch. By the time you hit send, the lead is cold and your notes are scattered across five tabs.
This is the kind of mess that slows down SDRs first, but growth marketers and agency owners doing outbound for clients feel it too. With funded leads automation, you go from “who should we contact?” to “draft ready in the sheet” in one run.
This workflow pulls funded companies via Apify, enriches contacts via Apollo, and writes first-touch email drafts with OpenAI. You’ll see what it replaces, what you need, and how the flow works end-to-end.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Apify + Google Sheets: funded leads with email drafts
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Run an Actor", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get dataset items", pos: "b", h: 48 }
n3["<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/>Code"]
n4["<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/>Apollo - Get Company Details"]
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/code.svg' width='40' height='40' /></div><br/>Code1"]
n6["<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/>Get Email"]
n7["<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/>Apollo - Get User"]
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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Message a model", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Append or update row in sheet", pos: "b", h: 48 }
n11 --> n13
n11 --> n12
n3 --> n15
n5 --> n3
n8 --> n5
n6 --> n8
n9 --> n6
n1 --> n2
n13 --> n14
n7 --> n9
n7 --> n8
n2 --> n4
n10 --> n11
n4 --> n7
n15 --> n10
n0 --> n1
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 trigger
class n13 ai
class n1,n2,n11 decision
class n10,n14,n15 database
class n4,n6,n7 api
class n3,n5 code
classDef customIcon fill:none,stroke:none
class n3,n4,n5,n6,n7,n8 customIcon
The Challenge: Turning “Funded” Into “Contacted” Without the Busywork
Finding recently funded companies is the easy part. The real time sink starts right after: opening profiles, guessing who the decision-maker is, chasing emails, and trying to personalize a message without sounding like a template. It’s not just slow. It’s fragile. One missed copy-paste, one wrong row, one duplicate contact, and you end up with messy outreach, confused reporting, and teammates stepping on each other’s toes. Honestly, the worst part is the mental load. You can’t stay in “sales mode” when you’re doing spreadsheet admin.
The friction compounds fast. Here’s where it typically breaks down.
- Crunchbase research turns into a long loop of tabs, notes, and half-finished rows in a sheet.
- Contact enrichment gets inconsistent because different people use different tools and filters.
- Emails get written too late, so your “hot” funding signal isn’t leveraged while it still matters.
- Duplicates creep in, which means more retries, more bounces, and less trust in the list.
The Fix: Apify → Apollo → Google Sheets → AI Email Drafts
This workflow is built to run your outbound “front end” like a pipeline instead of a scavenger hunt. You start by running an Apify actor that scrapes a Crunchbase search for recently funded companies. For each company, the workflow pulls company profile details, then calls Apollo to identify relevant decision-makers and enrich their contact records (including email discovery). Next, it formats everything into a clean payload and upserts it into Google Sheets, so the same company doesn’t get added five times. After the rows exist, the workflow checks which leads are missing an email draft. If the draft is empty, OpenAI generates a first-touch email using the company and person fields, then saves the final draft back to the same row.
The workflow starts with a manual launch in n8n. From there, Apify collects funded-company results, Apollo enriches the people layer, and Google Sheets becomes your single source of truth. Finally, OpenAI writes the first email draft only when it’s needed, so you don’t waste tokens regenerating content you already approved.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you pull 10 newly funded companies per run (the template’s default count). Manually, you might spend about 10 minutes per company to copy details, find 1–2 decision-makers, and draft something decent, which is roughly 2 hours for a small batch. With this workflow, you trigger the run in n8n, wait for Apify + Apollo to populate your Google Sheet, then review drafts in one place. The human time drops to about 15 minutes of QA and light edits, not a full research session.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Apify to run the Crunchbase scraping actor.
- Crunchbase access so the search URL and cookies work.
- Apollo.io API key (get it from Apollo settings/API).
- Google Sheets to store leads and email drafts.
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Intermediate. You’ll be editing a Crunchbase search URL, adding API keys, and matching Google Sheet columns to the workflow fields.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Manual launch from n8n. You run the workflow when you want a fresh batch, usually daily or a few times a week. This keeps spend predictable since Apify and Apollo can be credit-based.
Funded-company scraping via Apify. The Apify actor uses your Crunchbase discovery URL (filters, industry, funding round, location) and outputs a dataset of companies. The workflow then retrieves those dataset entries so n8n can process them.
Company + contact enrichment with Apollo. For each company, HTTP requests fetch the profile and query Apollo for relevant people, then the workflow splits people into batches, finds emails, and merges the person data back together. A couple of small “formatting” code steps turn that mess into clean, consistent fields for your sheet.
Google Sheets as the system of record. The workflow upserts each lead row so repeats don’t create duplicates, then re-reads the sheet and checks whether the email draft cell is empty. If it is, OpenAI generates a draft and the workflow updates the exact row.
You can easily modify the Crunchbase search filters and the Apollo persona criteria to match your ICP. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually so you can validate data enrichment before automating.
- Add the Manual Launch Trigger node as the starting point.
- Connect Manual Launch Trigger to Execute Apify Actor to initiate the pipeline.
Step 2: Connect Apify and Apollo Data Collection
This step captures Crunchbase data via Apify and enriches company/contact details using Apollo APIs.
- In Execute Apify Actor, set the actor input to use the provided customBody JSON, including
cookieandsearch.urlvalues. - Credential Required: Connect your Apify credentials in Execute Apify Actor and Retrieve Dataset Entries (credentials are not configured in the workflow).
- In Retrieve Dataset Entries, set Resource to
Datasetsand Dataset ID to{{ $json.defaultDatasetId }}. - In Fetch Company Profiles, set URL to
https://api.apollo.io/v1/mixed_companies/searchand JSON Body to{ "q_organization_name": "{{ $json.funded_organization_identifier.value }}", "page": 1, "per_page": 1 }. - In Lookup Key Contacts, set URL to
https://api.apollo.io/v1/people/searchand JSON Body to{ "q_organization_domains_list": ["{{ $json.organizations[0].primary_domain }}"], "person_seniorities": ["vp", "head", "director"], "person_titles": ["engineering","technology","product","operations","infrastructure","devops","data science","machine learning","cloud"], "pagination": { "page": 1, "per_page": 10 } }. - In Find Contact Email, set URL to
https://api.apollo.io/v1/people/matchand JSON Body to{ "id": "{{ $json.id }}" }. - Credential Required: Connect your
httpHeaderAuthcredentials in Fetch Company Profiles, Lookup Key Contacts, and Find Contact Email (credentials are not configured in the workflow).
Step 3: Set Up Contact Processing and Merge Logic
This section splits contacts, fetches emails, and merges them back into the company record.
- In Split People Records, set Field to Split Out to
people. - Lookup Key Contacts outputs to both Split People Records and Combine Person Data in parallel.
- Keep Combine Person Data as a merge point before Merge Email Mapping.
- In Merge Email Mapping, keep the provided JS Code to match each person by
idand injectperson.email. - In Format Sheet Payload, keep the provided JS Code and ensure it references Fetch Company Profiles with
$('Fetch Company Profiles').all().
Step 4: Configure Google Sheets Output and Updates
These nodes write enriched contacts to your sheet and then read back rows for AI personalization.
- In Upsert Lead Row, set Operation to
appendOrUpdate. - Map columns in Upsert Lead Row using expressions like
{{ $json.person_email }},{{ $json.company_name }}, and{{ $json.person_designation }}as shown in the node. - Set Document ID and Sheet Name in Upsert Lead Row to your Google Sheet values (replace
[YOUR_ID]). - In Read Sheet Rows, set the same Document ID and Sheet Name so the AI step reads the correct rows.
- In Update Sheet Entry, set Operation to
updateand map Person Email to{{ $('Check Email Empty').item.json['Person Email'] }}and Personalised Email to{{ $json.message.content }}. - Credential Required: Connect your Google Sheets credentials in Upsert Lead Row, Read Sheet Rows, and Update Sheet Entry (credentials are not configured in the workflow).
Step 5: Set Up AI Email Generation and Conditional Routing
The workflow checks for missing emails and generates a personalized outreach message only when needed.
- In Check Email Empty, confirm the condition uses
{{ $json['Personalised Email'] }}with the empty operator. - In Generate AI Email, keep the model as
gpt-4.1and the long-form prompt in Messages for cold outreach generation. - Generate AI Email should connect to Update Sheet Entry to write back the generated email.
- Credential Required: Connect your OpenAI credentials in Generate AI Email (credentials are not configured in the workflow).
- Leave No-Op Placeholder connected to the false path from Check Email Empty as a safe sink when no AI generation is needed.
Personalised Email, the condition in Check Email Empty will never match and AI generation won’t run.Step 6: Test and Activate Your Workflow
Run a full manual test to validate data flow, then activate for production use.
- Click Execute Workflow on Manual Launch Trigger to run the pipeline end-to-end.
- Verify Upsert Lead Row adds or updates rows with company/person fields populated.
- Confirm Check Email Empty routes only empty rows to Generate AI Email, and Update Sheet Entry writes to
Personalised Email. - Once outputs look correct, toggle the workflow to Active for production use.
Watch Out For
- Apify and Crunchbase authentication can be finicky because it relies on a valid cookie and the right search URL. If the scrape returns empty, check the Apify actor run logs and confirm your Crunchbase session cookie is still valid.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- OpenAI drafts will feel generic if you don’t tailor the prompt to your offer and voice. Update the prompt early, because editing hundreds of “almost right” emails later is a slow kind of pain.
Common Questions
About an hour if you already have Apify, Apollo, and your Google Sheet ready.
Yes, but you’ll want someone comfortable with API keys and spreadsheet setup. No coding is required, though small changes (like column names) do matter.
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 OpenAI API usage and whatever Apify/Apollo charge for your volume.
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.
You can swap the Crunchbase target by updating the Apify “Run an Actor” node’s search.url, and you can tighten your buyer persona by editing the Apollo “Lookup Key Contacts” request (seniorities and title keywords). Common tweaks include changing industries, limiting by funding stage, and rewriting the OpenAI prompt to match your offer and call-to-action. If your sheet has different tabs, update the Google Sheets document ID and sheet names in the upsert and update nodes.
Usually it’s expired Crunchbase cookies or an Apify actor configuration that no longer matches the page. Re-run the Apify actor inside Apify first, confirm it produces dataset entries, then update the cookie and search URL in n8n. Also check your Apify token permissions and rate limits if you’re pulling larger batches.
It scales mostly with your Apify and Apollo limits, plus how many leads you choose to pull per run.
For this use case, n8n is a better fit more often than not because the flow isn’t just “A to B.” You’re scraping, enriching, splitting contacts into batches, merging records, then conditionally generating AI content and writing it back to the exact row. That branching and data handling gets expensive or awkward in many no-code tools. n8n also gives you a self-hosting route, which matters if you’re running outbound at high volume and want predictable costs. Zapier or Make can still be fine for a simpler version (say, enrichment only). Talk to an automation expert if you want a quick recommendation based on your stack.
Once this is running, your lead list stops being a project and starts being an asset. The workflow does the repetitive parts so you can spend your time on targeting, offers, and replies.
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.