Google Sheets to Instantly, deduped leads every sync
Copying leads from a spreadsheet into Instantly is the kind of task that looks “quick” until it quietly eats your week. Duplicates sneak in. Someone imports the same list twice. Campaigns get messy, and you end up second-guessing what actually ran.
This Instantly lead sync automation hits marketing ops first, but agency owners and founders doing their own outbound feel it too. The outcome is simple: new leads move from Google Sheets into the right Instantly campaign automatically, and already-synced emails do not get added again.
Below you’ll see how the workflow works, what it automates, and what changes once your lead list has a real “source of truth” instead of a fragile import routine.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Instantly, deduped leads every sync
flowchart LR
subgraph sg0["Scheduled Automation Flow"]
direction LR
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Automation Trigger", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Fetch Table Rows", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Lead Records", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Generate Lead Entry", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Update Lead Status", pos: "b", h: 48 }
n5 --> n6
n7 --> n8
n8 --> n6
n6 --> n7
n4 --> n5
end
subgraph sg1["Manual Execution Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Execution Start", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet Rows", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch Iterator", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Modify Table Rows", pos: "b", h: 48 }
n3 --> n2
n2 --> n3
n1 --> n2
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 n4,n0 trigger
class n1 database
The Problem: Lead imports create duplicates and blind spots
Spreadsheets are great for collecting leads. They are terrible at proving what happened next. Once you start running outbound, you need to know which leads were synced, which campaign they went into, and which ones failed. Manual exports and Instantly imports break down fast because you’re relying on memory, file names like “leads-final-v3.csv”, and someone remembering to remove duplicates. Then your deliverability takes a hit because the same address gets hit twice, and you waste time untangling it instead of launching the next campaign.
It adds up fast. Here’s where it breaks down in real life.
- You end up re-importing the same email addresses because there’s no reliable “synced” status in your workflow.
- Every manual import is a new chance to map fields wrong, especially when the sheet columns shift over time.
- When an API or upload fails halfway through, you don’t know what made it in and what didn’t.
- Scaling from 50 to 1,000 leads turns into a rate-limit and timeout problem, not a growth problem.
The Solution: Google Sheets → n8n Data Table → Instantly, with status tracking
This workflow creates a clean, repeatable lead pipeline by introducing a simple middle layer: an n8n Data Table called “Leads.” First, you pull leads from Google Sheets and load them into that table in controlled batches, so big lists don’t time out. While loading, the workflow also saves helpful context like the contact’s job title into a “focusarea” field (handy later for personalization). Then, on a schedule, the workflow checks the Data Table for leads marked as new (“campaign = start”), sends them into your chosen Instantly campaign via API, and immediately updates each record to “added to instantly.” That status flip is the whole point. It’s how the automation prevents duplicates without you policing spreadsheets all day.
The workflow starts from either a manual run (great for testing) or an hourly schedule. Leads are processed in batches when coming from Sheets, then pushed to Instantly one-by-one for more reliable syncing and cleaner error handling. Finally, the Data Table becomes your audit trail so you can trust what’s in your campaign.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you add 100 new leads to a Google Sheet each week. Manually, you’ll usually export a CSV, import into Instantly, de-dupe, and spot-check fields, which is easily about 45 minutes to an hour per batch. With this workflow, you run the Sheet → Data Table sync once (it typically finishes in under a minute for 100 leads), then the scheduled sync pushes new records into Instantly at roughly one lead per second. You spend your time reviewing replies, not babysitting imports.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing and updating your lead list
- Instantly to run email campaigns and sequences
- Instantly API key (get it from Instantly Settings → API)
Skill level: Beginner. You’ll connect accounts, pick the right sheet/table, and paste your Instantly API key and campaign ID.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A manual or scheduled trigger starts the run. You can execute the workflow manually while testing, then rely on the schedule trigger (hourly by default) once you trust it.
Google Sheets rows are pulled and processed in batches. The workflow grabs rows from your sheet, then uses a batching loop (30 at a time) so a big list doesn’t overwhelm your instance or cause API timeouts.
Leads are stored and enriched in an n8n Data Table. Each lead is created or updated based on email, and the Title column is copied into a “focusarea” field so you have something useful for segmentation later.
Only “new” leads are sent to Instantly, then marked as synced. On each scheduled sync, the workflow fetches Data Table rows where the campaign status equals “start,” creates the lead in your chosen Instantly campaign, and flips the status to “added to instantly.”
You can easily modify the batch size to handle larger lists based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Set up the manual entry point so you can pull fresh lead data from Google Sheets on demand.
- Add or select Manual Execution Start as the trigger node.
- Connect Manual Execution Start to Retrieve Sheet Rows.
- Ensure the workflow is saved so the manual trigger can run.
Step 2: Connect Google Sheets
Configure the spreadsheet source where lead rows are stored.
- Open Retrieve Sheet Rows and select the spreadsheet Document ID to
instantly leads. - Set the Sheet Name to
apollo-contacts-export 9. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials. - Confirm Retrieve Sheet Rows outputs to Batch Iterator.
Step 3: Set Up Batch Processing and Data Table Updates
Process incoming rows in batches and update your n8n data table with lead fields.
- In Batch Iterator, set Batch Size to
30. - Open Modify Table Rows and set Operation to
update. - In Modify Table Rows, set the Data Table to
Leads. - Configure the filter to match by email: set keyName to
emailand keyValue to={{ $json.Email }}. - Map the focusarea field to
={{ $json.Title }}in the columns mapping. - Ensure Modify Table Rows loops back to Batch Iterator for continuous batching.
Step 4: Configure Scheduled Lead Processing and Instantly Sync
Schedule automated processing of “start” campaign leads and sync them to Instantly.
- Open Scheduled Automation Trigger and define the interval rule that fits your cadence.
- In Fetch Table Rows, set Operation to
getand filter by campaign equalsstart. - Confirm Fetch Table Rows connects to Iterate Lead Records.
- Open Generate Lead Entry and set Resource to
lead. - Set Email to
={{ $json.Email }}, First Name to={{ $json.Firstname }}, and Company Name to={{ $json.company }}. - In Generate Lead Entry additional fields, set Website to
={{ $json.Website }}and select Campaign asLaunchday 1. - Credential Required: Connect your
instantlyApicredentials in Generate Lead Entry. - Open Update Lead Status and set Operation to
updatewith the campaign column valueadded to instantly. - Set the Update Lead Status filter to match Email with
={{ $json.email }}. - Ensure the loop returns from Update Lead Status to Iterate Lead Records.
Email (sheet) and email (table). Make sure your data table columns match these exact keys.Step 5: Test and Activate Your Workflow
Run a manual test, verify updates, and then enable scheduled execution.
- Click Execute Workflow to run Manual Execution Start and confirm rows are pulled by Retrieve Sheet Rows.
- Verify that Modify Table Rows updates the
Leadsdata table with the mapped fields. - Manually trigger Scheduled Automation Trigger to confirm Fetch Table Rows returns only
campaign = startrecords. - Confirm Generate Lead Entry creates leads in Instantly and Update Lead Status marks them as
added to instantly. - Turn on the workflow with the Active toggle to enable scheduled processing.
Common Gotchas
- Google Sheets OAuth credentials can expire or lose permissions. If things break, check the Google Sheets credential in n8n’s Credentials screen and re-auth first.
- If you’re using batching and your n8n instance is underpowered, processing times vary. Bump down the batch size if the workflow starts timing out or failing mid-run.
- Instantly API calls will fail if your campaign ID is wrong or your API key changes. Double-check the Instantly node credentials and confirm the campaign ID in Instantly under Campaign settings.
Frequently Asked Questions
About 30 minutes if your sheet and Instantly campaign are ready.
No. You’ll connect Google Sheets and Instantly, then confirm your column mapping and campaign ID. The logic is already built into the workflow.
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 Instantly costs (your plan) and normal Google Sheets usage.
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 you’ll want to adjust the status field logic. Many teams add a second column like “campaign_id” (or “target_campaign”) in Google Sheets or the Data Table, then map that value into the Instantly “Create a lead” node. You can also duplicate the scheduled sync path per campaign if you prefer it to stay simple. The key is keeping the Data Table status meaningful so dedupe still works.
Usually it’s an invalid API key or the campaign ID is still set to the example value. Regenerate your Instantly API key if needed, paste it into the Instantly credential in n8n, then confirm the campaign ID inside your Instantly campaign settings. Also check that the lead email is valid, because one bad record can fail a single API call even when the workflow itself is fine.
A lot. The Google Sheets import runs in batches (30 by default), and the Instantly sync typically sends about 1 lead per second, so even 1,000 leads is manageable.
Often, yes, because this setup depends on a real status table to prevent duplicates, not just “I think I already sent that row.” n8n also makes it easier to batch, loop, and update records with your own logic without paying extra for every branch. Another big deal is self-hosting, which means you can run frequent syncs without watching task limits every day. Zapier or Make can still be fine for a lightweight two-step sync, especially if you never expect list size to grow. If you want help choosing, Talk to an automation expert.
Once your lead list has a real sync status, outbound stops feeling fragile. Set it up, run your campaigns, and let the workflow handle the repetitive parts.
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.