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

How to Sync Salesforce and Google Sheets Contacts with N8n

Bi-directional contact sync that updates Salesforce when Sheets rows change and vice versa, running every 5 minutes.

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

Best for

Teams with technical resources who need custom sync logic and conflict resolution

Not ideal for

Non-technical teams who want simple drag-and-drop contact syncing

Sync type

polling

Use case type

sync

Real-World Example

šŸ’”

A 25-person B2B software company runs this to keep their sales team's Google Sheets contact database in sync with Salesforce. The marketing team updates lead scores in Sheets daily, while sales reps modify contact details directly in Salesforce during calls. Before automation, they manually exported/imported CSV files twice per week and constantly worked with stale contact data.

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.

Salesforce admin access to create Connected Apps and API user
Google Sheets with contact data already formatted in columns
N8n instance running (cloud or self-hosted)
Salesforce Contact object permissions for your integration user
Unique identifier field to match contacts between systems

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
First NameFirstName
Last NameLastName
Email AddressEmail
Salesforce IDId
Last Modified DateLastModifiedDate
3 optional fieldsā–ø show
Company NameAccount.Name
Phone NumberPhone
Lead SourceLeadSource

Step-by-Step Setup

1

Workflows > Add workflow

Create new N8n workflow

Start a fresh workflow in N8n and configure it for bi-directional sync. This workflow will need two separate branches - one for each sync direction.

  1. 1Click 'Add workflow' from the N8n dashboard
  2. 2Name it 'Salesforce-Sheets Contact Sync'
  3. 3Click 'Save' to create the workflow
āœ“ What you should see: Empty workflow canvas with the workflow name visible in the top bar
2

Node Library > Triggers > Salesforce

Add Salesforce trigger for Contact updates

Set up the Salesforce trigger to fire when contacts are modified. This catches updates made directly in Salesforce.

  1. 1Click the '+' button to add first node
  2. 2Search for 'Salesforce Trigger'
  3. 3Select 'On Updated Record'
  4. 4Choose 'Contact' as the object type
  5. 5Set polling interval to 5 minutes
āœ“ What you should see: Salesforce trigger node showing 'Contact' object and 5-minute polling interval
⚠
Common mistake — Don't use 'On Created or Updated' - it fires twice for new records and breaks the sync logic
n8n
+
click +
search apps
Google Sheets
GO
Google Sheets
Add Salesforce trigger for C…
Google Sheets
GO
module added
3

Credentials > Salesforce > OAuth2

Connect Salesforce credentials

Authenticate with your Salesforce org using OAuth2. N8n needs read/write access to Contact records.

  1. 1Click 'Create New' under Credentials
  2. 2Select 'OAuth2' authentication method
  3. 3Paste your Salesforce Connected App Consumer Key
  4. 4Paste Consumer Secret and authorize
  5. 5Test the connection
āœ“ What you should see: Green 'Connection Successful' message with your Salesforce org name displayed
⚠
Common mistake — Your Connected App must have 'api' and 'refresh_token' scopes or the connection fails
4

Node Library > Apps > Google Sheets

Add Google Sheets node for Salesforce updates

Connect the node that will update your Google Sheets when Salesforce contacts change. This completes the first sync direction.

  1. 1Add new node after Salesforce trigger
  2. 2Select 'Google Sheets'
  3. 3Choose 'Update' operation
  4. 4Select your target spreadsheet
  5. 5Map Contact fields to sheet columns
āœ“ What you should see: Google Sheets node configured with your spreadsheet and field mappings visible
5

Node Library > Triggers > Google Sheets

Set up Google Sheets webhook trigger

Add a second trigger for when Google Sheets rows change. This requires a separate execution branch for the reverse sync direction.

  1. 1Click 'Add Trigger' to create second branch
  2. 2Select 'Google Sheets Trigger'
  3. 3Choose 'On Row Updated' event
  4. 4Select the same spreadsheet from step 4
  5. 5Configure which columns to monitor for changes
āœ“ What you should see: Second trigger node showing your spreadsheet name and monitored columns
⚠
Common mistake — Google Sheets triggers only work on sheets with fewer than 10,000 rows due to API limitations
6

Node Library > Apps > Salesforce

Add Salesforce update node

Complete the reverse sync by adding a Salesforce node that updates contacts when Google Sheets changes. This creates true bi-directional sync.

  1. 1Add new node after Google Sheets trigger
  2. 2Select 'Salesforce'
  3. 3Choose 'Update' operation
  4. 4Select 'Contact' as object type
  5. 5Map sheet columns back to Salesforce fields
āœ“ What you should see: Salesforce update node with field mappings from Sheets to Contact object
⚠
Common mistake — Map the Salesforce ID field correctly or updates will create duplicate records instead
7

Node Library > Logic > If

Add duplicate prevention logic

Prevent infinite loops where updates trigger counter-updates. Use a filter to check if the change originated from the sync itself.

  1. 1Add 'If' node before each update operation
  2. 2Set condition to check LastModifiedBy field
  3. 3Filter out changes made by your integration user
  4. 4Connect 'true' path to update nodes
āœ“ What you should see: If nodes showing conditions that exclude integration user changes
⚠
Common mistake — Without loop prevention, each update triggers the other direction and creates an infinite sync cycle
8

Google Sheets Node > Parameters > Field Mapping

Configure field mappings

Map specific contact fields between both systems. Focus on the fields your team actually uses to avoid syncing unnecessary data.

  1. 1Open the Google Sheets update node
  2. 2Map Salesforce Contact.FirstName to Sheet column A
  3. 3Map Contact.LastName to column B
  4. 4Map Contact.Email to column C
  5. 5Add any custom fields your team tracks
āœ“ What you should see: Field mapping table showing Salesforce fields paired with specific sheet columns
⚠
Common mistake — Don't sync Salesforce system fields like CreatedDate - they're read-only and cause sync errors
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

Workflow Settings > Error Handling

Add error handling

Configure what happens when syncs fail due to API limits, network issues, or data validation errors. This prevents silent failures.

  1. 1Click workflow settings gear icon
  2. 2Enable 'Continue on Fail' for both update nodes
  3. 3Add 'Set' node after each update to log success
  4. 4Connect error paths to notification node
āœ“ What you should see: Error handling paths visible with logging nodes connected
10

Workflow > Execute Workflow

Test with sample data

Run a controlled test with one contact record to verify both sync directions work correctly before enabling for all data.

  1. 1Create a test contact in Salesforce
  2. 2Click 'Execute Workflow' to trigger manually
  3. 3Verify the contact appears in Google Sheets
  4. 4Update the sheet row and confirm Salesforce reflects the change
āœ“ What you should see: Test contact successfully synced in both directions with all mapped fields correct
⚠
Common mistake — Test with a disposable contact record - don't use real customer data during testing
n8n
ā–¶ Run once
executed
āœ“
Google Sheets
āœ“
Salesforce
Salesforce
šŸ”” notification
received
11

Workflow > Activate

Enable workflow and monitor

Activate the workflow for production use and set up monitoring to catch sync issues early. Both triggers will now run automatically.

  1. 1Click the toggle to activate workflow
  2. 2Set up email notifications for failed executions
  3. 3Monitor the execution log for first 24 hours
  4. 4Document any field mapping adjustments needed
āœ“ What you should see: Active workflow with green status indicator and execution log showing successful runs
⚠
Common mistake — Check executions daily for the first week - sync conflicts often appear after users start making simultaneous changes

Drop this into an n8n Code node.

JavaScript — Code Node// Add this to a Code node for phone number standardization
ā–ø Show code
// Add this to a Code node for phone number standardization
const phone = items[0].json.Phone;
if (phone) {

... expand to see full code

// Add this to a Code node for phone number standardization
const phone = items[0].json.Phone;
if (phone) {
  // Remove all non-digits and format consistently
  const cleaned = phone.replace(/\D/g, '');
  items[0].json.Phone = cleaned.length === 10 ? cleaned : phone;
}
return items;

Scaling Beyond 500+ contact changes/day+ Records

If your volume exceeds 500+ contact changes/day records, apply these adjustments.

1

Batch operations

Group multiple contact updates into single Google Sheets API calls using N8n's batch processing node. This reduces execution count and avoids rate limits.

2

Increase polling intervals

Change Salesforce polling from 5 minutes to 15 minutes and rely more on Google Sheets webhooks for immediate updates. This cuts Salesforce API usage by 66%.

3

Add queue management

Use N8n's Redis integration to queue updates during peak hours and process them during off-peak times when API limits are less restrictive.

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 full control over sync logic and have someone who can handle code nodes. N8n lets you build complex deduplication rules and custom field transformations that Zapier can't match. You can also self-host it to avoid per-execution costs at high volume. Skip N8n if your team wants drag-and-drop simplicity - Make handles this workflow with better visual mapping and no code required.

Cost

This workflow burns roughly 4 executions per contact update (trigger + update + logging + error handling). At 200 contact changes per month, that's 800 executions total. N8n's cloud starter plan includes 5,000 executions for $20/month, so you're well under the limit. Make charges $9/month for 1,000 operations but counts each field mapping separately, so 200 contacts with 5 fields each costs $45/month. Zapier's $20 plan only covers 750 tasks, forcing you to the $50 tier. N8n wins on cost until you hit 25,000+ executions monthly.

Tradeoffs

Make beats N8n on visual field mapping - you can drag Salesforce fields directly onto Google Sheets columns without touching code. Zapier's formatter tools handle phone number cleaning and date formatting better than N8n's default functions. But N8n crushes both platforms on sync conflict resolution. You can write JavaScript to compare timestamps, merge field values, or route conflicts to a review queue. Make and Zapier just overwrite data or fail completely.

You'll discover that Salesforce's API returns different field formats than what Google Sheets expects. Phone numbers come as '(555) 123-4567' but Sheets stores them as '5551234567'. Use N8n's code node to standardize formats before syncing. Google Sheets also has a 100-cell-per-second write limit that kills high-volume syncs. Add batching logic to group updates or you'll hit constant rate limit errors after your first busy day.

Ideas for what to build next

  • →
    Add lead scoring sync — Sync custom lead score fields from your marketing automation platform to both Salesforce and Google Sheets using a third trigger branch.
  • →
    Set up sync monitoring dashboard — Create a Google Sheets dashboard that tracks daily sync volumes, error rates, and field-level sync success rates using N8n's logging data.
  • →
    Build contact deduplication workflow — Add logic to detect and merge duplicate contacts across both systems using email matching and fuzzy name matching algorithms.

Related guides

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