Intermediate~20 min setupProductivity & CRMVerified April 2026
Google Sheets logo
Salesforce logo

How to Import Google Sheets Leads into Salesforce with N8n

Auto-create or update Salesforce leads when new rows are added to a Google Sheet with N8n's self-hosted workflow builder.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Teams that need custom data transformation and already run N8n infrastructure.

Not ideal for

Teams wanting zero-maintenance automation or lacking technical resources for setup.

Sync type

polling

Use case type

import

Real-World Example

💡

A 25-person B2B software company uses this to import leads from their conference signup spreadsheet into Salesforce every 15 minutes. Before automation, their sales team manually copy-pasted 50-100 leads after each event, taking 2+ hours and often missing leads or creating duplicates. Now leads flow automatically with proper deduplication and data validation.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Admin access to Salesforce org with API enabled
Google Sheets document with lead data and consistent column headers
N8n instance running (self-hosted or N8n Cloud)
Timestamp column in your spreadsheet to track when rows were added
Understanding of your Salesforce Lead field requirements and validation rules

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Last NameLastName
EmailEmail
CompanyCompany
4 optional fields▸ show
First NameFirstName
PhonePhone
Lead SourceLeadSource
IndustryIndustry

Step-by-Step Setup

1

Workflows > New Workflow

Create New Workflow

Start a fresh workflow in N8n to handle the Google Sheets to Salesforce sync. You'll build this as a polling workflow that checks for new rows every 15 minutes.

  1. 1Click 'New Workflow' from the N8n dashboard
  2. 2Name your workflow 'Google Sheets Lead Import'
  3. 3Click 'Save' to create the empty workflow canvas
What you should see: You should see a blank workflow canvas with a single 'Start' node ready for configuration.
2

Node Library > Trigger Nodes > Schedule Trigger

Add Google Sheets Trigger

Connect to your lead spreadsheet and configure N8n to poll for new rows. Set this up as a schedule trigger since Google Sheets doesn't support real-time webhooks.

  1. 1Click the '+' button next to the Start node
  2. 2Search for 'Schedule Trigger' and select it
  3. 3Set interval to 'Every 15 Minutes'
  4. 4Toggle 'Trigger at startup' to ON
What you should see: The Schedule Trigger node shows a 15-minute interval setting and is connected to your Start node.
Common mistake — Don't set intervals under 5 minutes — Google Sheets API has rate limits and you'll hit quotas fast.
n8n
+
click +
search apps
Google Sheets
GO
Google Sheets
Add Google Sheets Trigger
Google Sheets
GO
module added
3

Node Library > Google > Google Sheets

Configure Google Sheets Connection

Add the Google Sheets node to read your lead data. You'll need to authenticate with Google and specify which spreadsheet contains your leads.

  1. 1Click '+' after the Schedule Trigger node
  2. 2Search for 'Google Sheets' and select it
  3. 3Click 'Create New Credential' for Google Sheets API
  4. 4Follow OAuth flow to authenticate with your Google account
  5. 5Select 'Read' operation and choose your spreadsheet
What you should see: Google Sheets node shows 'Connected' status with your spreadsheet name visible in the dropdown.
Common mistake — Make sure the Google account you authenticate with has edit access to the target spreadsheet.
4

Node Library > Data > Set, Filter

Set Up Row Detection Logic

Configure the workflow to only process new rows since the last run. N8n doesn't track this automatically, so you'll use a simple timestamp comparison.

  1. 1In Google Sheets node, set Range to 'A:Z' to capture all columns
  2. 2Set 'Return All' to get complete dataset
  3. 3Add 'Set' node after Google Sheets
  4. 4Create a variable 'last_run_time' with value '{{ $now.minus({minutes: 15}) }}'
  5. 5Add 'Filter' node to compare timestamps
What you should see: Filter node is connected and shows a timestamp comparison expression in the condition field.
Common mistake — Without timestamp filtering, you'll process all rows on every run and create duplicate Salesforce records.
5

Node Library > Logic > Function, IF

Add Data Validation

Clean and validate the lead data before sending to Salesforce. Check for required fields like email and company name to avoid API errors.

  1. 1Add 'Function' node after the Filter
  2. 2Write validation logic to check for empty email fields
  3. 3Add 'IF' node to branch valid vs invalid records
  4. 4Route invalid records to a separate 'Set' node for logging
What you should see: IF node shows two output paths — one for valid records continuing to Salesforce, one for invalid records going to error handling.
Common mistake — Salesforce requires email format validation — test with malformed emails to ensure your regex catches them.
6

Node Library > CRM > Salesforce

Connect Salesforce Credentials

Set up authentication to your Salesforce org. N8n supports both username/password and OAuth flows, but OAuth is more secure for production.

  1. 1Add 'Salesforce' node on the valid records path
  2. 2Click 'Create New Credential' for Salesforce
  3. 3Choose 'OAuth2' authentication method
  4. 4Enter your Salesforce domain (e.g., https://yourorg.salesforce.com)
  5. 5Complete OAuth authorization flow
What you should see: Salesforce node shows 'Connected' with your org name displayed in the credential dropdown.
7

Salesforce Node > Parameters

Configure Lead Creation

Set the Salesforce node to create leads and handle potential duplicates. Use upsert operation to update existing leads based on email address.

  1. 1Set Operation to 'Upsert'
  2. 2Set Object to 'Lead'
  3. 3Choose 'Email' as the External ID field
  4. 4Enable 'Return All' to get created record IDs
What you should see: Salesforce node shows Upsert operation with Lead object selected and Email as the matching field.
Common mistake — Don't use 'Create' operation — it will fail on duplicate emails and break your workflow.
8

Salesforce Node > Fields

Map Lead Fields

Connect your Google Sheets columns to Salesforce Lead fields. Map the essential fields first, then add custom fields as needed.

  1. 1Click 'Add Field' in the Salesforce node
  2. 2Map 'Email' field to your sheets email column
  3. 3Add mappings for FirstName, LastName, Company
  4. 4Map 'LeadSource' to a static value like 'Web Form'
  5. 5Add any custom fields your org requires
What you should see: Field mapping section shows 5-8 mapped fields with expressions pulling data from the Google Sheets node output.
Common mistake — Check Salesforce field requirements in Setup — some orgs require fields like 'Industry' that aren't obvious.
Google Sheets fields
Column A
Column B
Email
Status
Notes
available as variables:
1.props.Column A
1.props.Column B
1.props.Email
1.props.Status
1.props.Notes
9

Node Settings > Error Handling

Add Error Handling

Configure what happens when Salesforce API calls fail. Set up retry logic and error logging so you don't lose lead data.

  1. 1Click the Salesforce node settings gear icon
  2. 2Set 'On Error' to 'Continue Next Item'
  3. 3Add 'HTTP Request' node connected to error output
  4. 4Configure error webhook or email notification
  5. 5Add 'Set' node to log failed records
What you should see: Error path shows nodes that will capture and log any Salesforce API failures without stopping the workflow.
Common mistake — Default error handling stops the entire workflow — you'll lose all remaining leads in the batch if one fails.
10

Workflow Canvas > Execute Workflow

Test with Sample Data

Run the workflow manually with a few test rows to verify field mapping and error handling. Check both success and failure scenarios.

  1. 1Add 2-3 test rows to your Google Sheet
  2. 2Click 'Execute Workflow' button
  3. 3Check execution log for any errors
  4. 4Verify test leads appear in Salesforce
  5. 5Test with an invalid email to trigger error path
What you should see: Execution log shows successful completion with green checkmarks on all nodes, and test leads are visible in Salesforce.
n8n
▶ Run once
executed
Google Sheets
Salesforce
Salesforce
🔔 notification
received
11

Workflow Settings > Active

Enable Production Monitoring

Set up logging and monitoring for the live workflow. Configure alerts for failures and track import volume over time.

  1. 1Add 'Set' node at workflow end to log success metrics
  2. 2Configure webhook to your monitoring system
  3. 3Set workflow to 'Active' status
  4. 4Add workflow to a monitoring folder
  5. 5Test the 15-minute schedule fires correctly
What you should see: Workflow shows 'Active' status and appears in your monitoring dashboard with execution history.
Common mistake — Monitor execution times — if Google Sheets processing takes over 10 minutes, you'll have overlapping runs.

Drop this into an n8n Code node.

JavaScript — Code Node// Clean company names from email domains when company field is empty
▸ Show code
// Clean company names from email domains when company field is empty
if (!items[0].json.Company && items[0].json.Email) {
  const domain = items[0].json.Email.split('@')[1];

... expand to see full code

// Clean company names from email domains when company field is empty
if (!items[0].json.Company && items[0].json.Email) {
  const domain = items[0].json.Email.split('@')[1];
  items[0].json.Company = domain.split('.')[0].replace(/^\w/, c => c.toUpperCase());
}
return items;

Scaling Beyond 100+ leads per import+ Records

If your volume exceeds 100+ leads per import records, apply these adjustments.

1

Add Batch Processing

Use SplitInBatches node to process leads in groups of 50. Google Sheets API paginates at 100 records and Salesforce performs better with smaller batches.

2

Increase Polling Interval

Move from 15-minute to 30+ minute intervals to avoid API quota issues. Most lead import scenarios don't need real-time processing anyway.

3

Implement Queue System

Add a Redis queue between Google Sheets and Salesforce to handle processing spikes. This prevents workflow timeouts during large imports.

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use N8n for this if you need custom data transformation logic or you're already running N8n for other workflows. The code nodes let you clean messy spreadsheet data before it hits Salesforce — something Zapier struggles with. Plus you control the hosting and data never leaves your infrastructure. Skip N8n if you want zero maintenance — Make handles Google Sheets polling better and Zapier's Salesforce connector has more built-in deduplication.

Cost

This workflow uses about 4 executions per run (trigger, sheets read, filter, salesforce write). At 100 new leads per month with 15-minute polling, that's roughly 3,000 executions monthly. N8n Cloud starts at $20/month for 5,000 executions. The same volume costs $30/month on Zapier's Team plan and $29/month on Make's Core plan. N8n wins on price, especially if you're self-hosting.

Tradeoffs

Make handles Google Sheets better — it tracks new rows automatically without timestamp gymnastics. Zapier's Salesforce app includes smart duplicate detection and field validation that catches errors before API calls. But N8n's code nodes let you build complex data cleaning that the other platforms can't match. If your spreadsheet data is clean and consistent, stick with Make. If you need to parse company names from email domains or merge duplicate columns, N8n is worth the setup complexity.

Google Sheets API paginates at 100 rows, so imports over that size need the SplitInBatches node or you'll miss data. Salesforce has a 200 API calls per hour limit on some orgs — check your limits in Setup before going live. The OAuth tokens expire every 2 hours by default, but N8n handles refresh automatically. Your biggest headache will be mapping custom Salesforce fields that don't match your sheet headers — build a lookup table in the Function node rather than hardcoding field mappings.

Ideas for what to build next

  • Add Lead Assignment RulesCreate workflow branches to assign leads to specific sales reps based on company size, industry, or geographic location pulled from the spreadsheet.
  • Set Up Slack NotificationsAdd a Slack node to notify your sales channel when high-value leads (based on company size or other criteria) are imported from the spreadsheet.
  • Create Import Summary ReportsBuild a daily digest that emails your team the count of imported leads, any errors encountered, and duplicate leads updated in the past 24 hours.

Related guides

Was this guide helpful?
Google Sheets + Salesforce overviewn8n profile →