

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
pollingUse case type
syncReal-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.
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
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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| First Name | FirstName | |
| Last Name | LastName | |
| Email Address | Email | |
| Salesforce ID | Id | |
| Last Modified Date | LastModifiedDate | |
3 optional fieldsāø show
| Company Name | Account.Name |
| Phone Number | Phone |
| Lead Source | LeadSource |
Step-by-Step Setup
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.
- 1Click 'Add workflow' from the N8n dashboard
- 2Name it 'Salesforce-Sheets Contact Sync'
- 3Click 'Save' to create the workflow
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.
- 1Click the '+' button to add first node
- 2Search for 'Salesforce Trigger'
- 3Select 'On Updated Record'
- 4Choose 'Contact' as the object type
- 5Set polling interval to 5 minutes
Credentials > Salesforce > OAuth2
Connect Salesforce credentials
Authenticate with your Salesforce org using OAuth2. N8n needs read/write access to Contact records.
- 1Click 'Create New' under Credentials
- 2Select 'OAuth2' authentication method
- 3Paste your Salesforce Connected App Consumer Key
- 4Paste Consumer Secret and authorize
- 5Test the connection
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.
- 1Add new node after Salesforce trigger
- 2Select 'Google Sheets'
- 3Choose 'Update' operation
- 4Select your target spreadsheet
- 5Map Contact fields to sheet columns
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.
- 1Click 'Add Trigger' to create second branch
- 2Select 'Google Sheets Trigger'
- 3Choose 'On Row Updated' event
- 4Select the same spreadsheet from step 4
- 5Configure which columns to monitor for changes
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.
- 1Add new node after Google Sheets trigger
- 2Select 'Salesforce'
- 3Choose 'Update' operation
- 4Select 'Contact' as object type
- 5Map sheet columns back to Salesforce fields
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.
- 1Add 'If' node before each update operation
- 2Set condition to check LastModifiedBy field
- 3Filter out changes made by your integration user
- 4Connect 'true' path to update nodes
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.
- 1Open the Google Sheets update node
- 2Map Salesforce Contact.FirstName to Sheet column A
- 3Map Contact.LastName to column B
- 4Map Contact.Email to column C
- 5Add any custom fields your team tracks
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.
- 1Click workflow settings gear icon
- 2Enable 'Continue on Fail' for both update nodes
- 3Add 'Set' node after each update to log success
- 4Connect error paths to notification node
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.
- 1Create a test contact in Salesforce
- 2Click 'Execute Workflow' to trigger manually
- 3Verify the contact appears in Google Sheets
- 4Update the sheet row and confirm Salesforce reflects the change
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.
- 1Click the toggle to activate workflow
- 2Set up email notifications for failed executions
- 3Monitor the execution log for first 24 hours
- 4Document any field mapping adjustments needed
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.
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.
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%.
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
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.
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.
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
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup