Google Sheets to Instantly, cleaner leads uploaded
Your lead sheet looks “fine” until you try to launch. Then you notice the mess: missing first names, weird casing, junk emails, and zero personalization. Suddenly your Instantly campaign is stalled, and you’re back to manual cleanup.
This Instantly lead automation hits growth marketers first because launches are deadline-driven. But agency owners running client outreach and founders doing scrappy cold email feel it too. The outcome is simple: cleaner leads get uploaded to Instantly with consistent names, basic email checks, and an AI-generated icebreaker you can drop into your sequence.
Below, you’ll see exactly what the workflow does, how the pieces fit together, and what you need to run it reliably week after week.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Google Sheets to Instantly, cleaner leads uploaded
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Append or update row in sheet", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Notify Master"]
n3@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "IBC V3", pos: "b", h: 48 }
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/>Add leads to instantly"]
n7@{ icon: "mdi:robot", form: "rounded", label: "Format Names", pos: "b", h: 48 }
n8@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If has all variables", pos: "b", h: 48 }
n3 --> n2
n5 --> n6
n7 --> n5
n4 --> n3
n4 --> n7
n0 --> n9
n9 --> n1
n6 --> n4
n1 --> n4
n8 --> n0
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 n8 trigger
class n5,n7 ai
class n9 decision
class n0,n1 database
class n6 api
classDef customIcon fill:none,stroke:none
class n2,n6 customIcon
Why This Matters: Dirty Leads Kill Cold Email Performance
Scraped lead lists are rarely “campaign-ready.” Names come in as ALL CAPS, “N/A,” or mashed into a single field. Emails look valid until they bounce, which can hurt deliverability and waste your sending capacity. And then there’s the personalization problem: you know you should add an opener, but writing even two lines per lead turns into a late-night copywriting marathon. The worst part is the context switching. You clean data, validate emails, draft openers, then upload, then double-check again because you don’t trust the sheet.
The friction compounds. Here’s where it breaks down.
- You end up reformatting names by hand because your sheet isn’t consistent from one scrape to the next.
- Bad or missing emails slip through, and you only discover them after a campaign starts bouncing.
- Personalized openers don’t happen at scale, so your sequence reads generic even when the lead data is rich.
- Uploading to Instantly becomes a stop-and-go process, which delays launches and makes results harder to compare.
What You’ll Build: A Clean-Then-Upload Lead Pipeline for Instantly
This workflow starts with a Google Sheet full of leads from your scraper or enrichment tool. When you run it, n8n pulls rows from the sheet and checks that the basics are present (first name, last name, summary, and email). Leads that don’t meet your minimum bar get flagged back in the sheet so you can fix them later instead of pushing junk into your campaign. For leads that pass, OpenAI standardizes the person’s name and generates a short, personalized icebreaker using the summary and any context your sheet includes (company details, job history, achievements). Finally, the workflow sends the cleaned lead to your selected Instantly campaign via the Instantly API, storing the icebreaker as a custom variable so it’s ready inside your sequence. After the batch finishes, you get a Telegram message confirming the sync.
The workflow starts in n8n with a manual launch, so you decide when a batch is ready. From there, it validates and prepares each record, generates the AI text, and uploads the lead into Instantly. The final touch is a completion alert, which means you’re not babysitting the run.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you load 100 scraped leads into a sheet each morning. Manually, you might spend about 1 minute per lead fixing names, another minute checking emails, and maybe 2 minutes writing any kind of opener, which is roughly 6 hours before you even upload. With this workflow, you kick off the run in a minute or two, then let n8n process the batch in the background while OpenAI generates icebreakers and Instantly receives the leads. You still review a few samples, but you’re not doing 100 tiny edits anymore.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your scraped/enriched lead rows.
- Instantly.ai to receive leads into a campaign.
- OpenAI API key (get it from the OpenAI API dashboard).
Skill level: Beginner. You’ll mostly connect accounts, paste API keys, and map a few fields.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
Manual launch from n8n. You click run when a batch in Google Sheets is ready, which keeps you in control and avoids accidental sends from half-finished data.
Google Sheets rows get pulled and checked. n8n retrieves the rows and uses an “if” check to confirm required fields exist (first name, last name, summary, email). If something is missing, the workflow updates the sheet record so you can spot the problem quickly.
Leads are processed in batches. The workflow loops through entries (split in batches), applies an output limit, then sends each valid record through OpenAI to normalize the name and write an icebreaker that matches your lead’s context.
Instantly gets the final lead payload. An HTTP request pushes the cleaned fields into your selected Instantly campaign, including the icebreaker stored as a custom variable. When the run completes, Telegram sends a simple “done” message.
You can easily modify the required fields check to be stricter (or looser) based on your list quality. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow is launched manually, which is ideal for controlled lead enrichment runs.
- Add the Manual Launch Start node as your trigger.
- Keep all default settings in Manual Launch Start (no parameters required).
- Optionally keep Flowpast Branding as a sticky note for documentation and team context.
Step 2: Connect Google Sheets
Retrieve and update lead data in Google Sheets to drive the rest of the automation.
- Open Retrieve Sheet Rows and set Document to
[YOUR_ID]and Sheet toSheet3. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Retrieve Sheet Rows. - Open Update Sheet Records and confirm Operation is set to
appendOrUpdate. - In Update Sheet Records, confirm Document is
[YOUR_ID]and Sheet isLaw firm test sheet. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Update Sheet Records.
firstName, lastName, summary, and email columns to pass validation.Step 3: Set Up Validation and Batching
Validate required fields, update records, and iterate through leads in batches.
- In Validate Required Fields, confirm the five conditions use the expressions
={{ $json.firstName }},={{ $json.lastName }},={{ $json.summary }}, and={{ $json.email }}, plus the regex^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$. - Confirm Validate Required Fields connects to Update Sheet Records on the “true” path.
- Configure Iterate Through Entries to process items with default settings (no batch size override is required).
- Note the execution flow: Update Sheet Records → Iterate Through Entries.
- Iterate Through Entries outputs to both Apply Output Limit and Normalize Person Names in parallel.
Step 4: Set Up AI Enrichment and Lead Delivery
Normalize names, generate icebreakers, and send leads to Instantly.
- In Normalize Person Names, confirm Model is
gpt-4o-miniand JSON Output is enabled. - Credential Required: Connect your
openAiApicredentials in Normalize Person Names. - In Generate Icebreaker Text, confirm Model is
chatgpt-4o-latestand JSON Output is enabled. - Verify the message variables reference upstream data, such as
{{ $json.message.content.firstName }}and{{ $('Update Sheet Records').item.json.summary }}. - Credential Required: Connect your
openAiApicredentials in Generate Icebreaker Text. - In Send Leads to Instantly, set URL to
https://api.instantly.ai/api/v2/leadsand Method toPOST. - Set Body to the JSON string with expressions, including
{{ $('Update Sheet Records').item.json.email }}and{{ $json.message.content.icebreaker }}. - Replace
[YOUR INSTANTLY CAMPAIGN ID HERE]in the body with your real Instantly campaign ID.
Step 5: Configure Completion Alert and Output Limiting
Limit output volume and send a Telegram notification when the workflow finishes.
- Keep Apply Output Limit connected after Iterate Through Entries to control final output volume.
- In Telegram Completion Alert, set Text to
Hello Master, Your n8n Instantly add leads From EMAIL SCRAPE Workflow is completed.. - Credential Required: Connect your
telegramApicredentials in Telegram Completion Alert. - Confirm the execution flow: Apply Output Limit → Telegram Completion Alert.
Step 6: Test and Activate Your Workflow
Run a manual test to confirm data flows from Sheets through AI enrichment and into Instantly, with a completion alert.
- Click Execute Workflow and use Manual Launch Start to run a test.
- Verify Retrieve Sheet Rows returns rows and that Validate Required Fields routes only valid entries.
- Confirm Normalize Person Names and Generate Icebreaker Text return JSON content for each lead.
- Check that Send Leads to Instantly returns a successful API response and that leads appear in your Instantly campaign.
- Ensure Telegram Completion Alert sends a completion message after the batch finishes.
- Once verified, toggle the workflow to Active for production use.
Troubleshooting Tips
- Google Sheets credentials can expire or lack edit access. If updates aren’t writing back, check the Google connection in n8n and confirm the spreadsheet is shared with the connected account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 30 minutes if your Google Sheets and Instantly accounts are ready.
No. You’ll connect credentials and map a few fields between Google Sheets, OpenAI, and Instantly.
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 costs, which are usually a few cents per lead depending on your prompt size.
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, and you probably should. You can change what “valid” means by editing the Validate Required Fields check, then adjust what gets cleaned in Normalize Person Names. Common customizations include generating different icebreaker styles (formal vs. casual), skipping OpenAI for certain lead sources, or mapping extra custom fields into Instantly so your sequence can branch by persona.
Usually it’s an expired or incorrect Instantly API key in the HTTP Request node. Double-check the campaign ID you’re pushing into, because a valid key can still fail if the endpoint payload doesn’t match that campaign’s expected fields. If you’re sending big batches, rate limits can also show up as intermittent failures, so try smaller batches via the Split in Batches node.
On a typical n8n Cloud plan you can run thousands of executions a month, and self-hosting removes the execution cap (your server becomes the limit). In practice, most teams process leads in batches of 50–500 so OpenAI and Instantly stay stable and you can QA a sample before sending.
Often, yes. n8n makes batch processing and branching logic easier, which matters here because you’re filtering leads, looping over rows, and generating AI text per record. It also gives you a self-host option when volume grows, so you’re not paying per tiny step. Zapier or Make can still be fine for a very small list, especially if you only want “new row → create lead” with no AI. But once you add validation, name normalization, and icebreakers, the workflow gets complex fast. Talk to an automation expert if you want a quick recommendation for your exact setup.
Clean lists and decent personalization shouldn’t require a full-time cleanup session. Set this up once, run it when your sheet is ready, and keep your Instantly campaigns moving.
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.