

How to Sync Contacts Between Salesforce and Google Sheets with Make
Bi-directional automation that updates Google Sheets when Salesforce contacts change, and updates Salesforce when Sheet rows are modified.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Teams needing real-time bi-directional contact sync with custom field transformations and error handling.
Not ideal for
Simple one-way data imports or teams without technical resources to configure loop prevention filters.
Sync type
pollingUse case type
syncReal-World Example
A 25-person B2B agency uses this to keep their Google Sheet prospect tracker in sync with Salesforce contacts. Sales reps update phone numbers and notes in Sheets during calls, while the marketing team manages email addresses and lead status in Salesforce. Before automation, they manually copied changes twice daily and frequently overwrote each other's updates, losing prospect notes and contact details.
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 Make
Copy the pre-built Make blueprint and paste it straight into Make. 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 | ||
| Salesforce Contact ID | Id | |
| Email Address | Email | |
| First Name | FirstName | |
| Last Name | LastName | |
2 optional fields▸ show
| Phone Number | Phone |
| Company Name | Account.Name |
Step-by-Step Setup
Dashboard > Create Scenario > Add Module
Create New Scenario
Start a new Make scenario to house both sync directions. You'll build two separate flows in the same scenario to handle updates from each platform.
- 1Click 'Create a new scenario' from the Make dashboard
- 2Click the large + button in the center of the canvas
- 3Type 'Salesforce' in the app search box
- 4Select 'Salesforce' from the results
Salesforce Module > Configuration Panel
Configure Salesforce Contact Trigger
Set up the trigger to fire when any contact record changes in Salesforce. This handles one direction of the sync - Salesforce to Sheets.
- 1Select 'Watch Records' from the Salesforce trigger list
- 2Click 'Create a connection' and enter your Salesforce credentials
- 3Set Object Type to 'Contact'
- 4Choose 'Updated' from the Watch for dropdown
- 5Set Max number of records to 10
Canvas > Add Module > Google Sheets > Update a Row
Add Google Sheets Update Module
Configure the action that updates your Google Sheet when Salesforce contacts change. This completes the first sync direction.
- 1Click the + button to the right of the Salesforce module
- 2Search for and select 'Google Sheets'
- 3Choose 'Update a Row' from the actions list
- 4Connect your Google account when prompted
- 5Select your target spreadsheet and worksheet
Google Sheets Module > Field Mapping Panel
Map Salesforce to Sheets Fields
Configure which Salesforce contact fields update which columns in your Google Sheet. Use the row identifier to match records correctly.
- 1Set Row number field to map to your ID column (usually column A)
- 2Click in the Email field and select 'Email' from Salesforce data
- 3Map 'FirstName' to your First Name column
- 4Map 'LastName' to your Last Name column
- 5Map 'Phone' to your Phone column
Canvas > New Branch > Google Sheets > Watch Rows
Add Second Branch for Sheets to Salesforce
Create the reverse sync direction by adding a Google Sheets trigger. This starts the second automation flow in the same scenario.
- 1Click the + button in an empty area of the canvas
- 2Select 'Google Sheets' from the app list
- 3Choose 'Watch Rows' from the trigger options
- 4Select the same spreadsheet and worksheet
- 5Set Table contains headers to 'Yes'
Second Branch > Add Module > Salesforce > Update Record
Add Salesforce Update Module
Configure the action that updates Salesforce contacts when Google Sheets rows change. This completes the bi-directional sync setup.
- 1Click the + button after the Google Sheets Watch module
- 2Select 'Salesforce' from the apps
- 3Choose 'Update a Record' from the actions
- 4Set Record Type to 'Contact'
- 5Use the same Salesforce connection from step 2
Salesforce Update Module > Field Mapping
Map Sheets to Salesforce Fields
Configure the field mapping for updates flowing from Google Sheets back to Salesforce. Use the ID field to identify which contact to update.
- 1Set Record ID to map to your Salesforce ID column from Sheets
- 2Map the Email column to Salesforce 'Email' field
- 3Map First Name column to 'FirstName'
- 4Map Last Name column to 'LastName'
- 5Map Phone column to 'Phone'
Connection Line > Right Click > Set up Filter
Add Loop Prevention Filters
Prevent infinite sync loops by adding filters that detect when changes originate from Make itself. Without these, updates will bounce back and forth continuously.
- 1Right-click the line between Salesforce trigger and Sheets update
- 2Select 'Set up a filter'
- 3Name it 'Not from Make' and set condition 'LastModifiedBy Name' not equal to your Make user
- 4Repeat for the Sheets→Salesforce flow with appropriate Sheet metadata
Module Settings > Error Handling Tab
Configure Error Handling
Set up error handling to manage API failures and rate limits gracefully. This prevents the entire sync from breaking when individual records fail.
- 1Click on each action module (not triggers)
- 2Click the wrench icon in the module header
- 3Set 'Error handling' to 'Break'
- 4Enable 'Store incomplete executions'
- 5Set retry attempts to 3
Bottom Bar > Run Once > Execution History
Test Both Sync Directions
Run controlled tests to verify both directions work correctly before enabling the full automation. Test with non-critical data first.
- 1Click 'Run once' at the bottom of the screen
- 2Update a test contact in Salesforce and verify the Sheet updates
- 3Modify the same row in Sheets and confirm Salesforce reflects the change
- 4Check the execution log for any errors or warnings
- 5Verify no duplicate updates occurred
Bottom Bar > Schedule Settings > Scenario Toggle
Schedule and Activate
Enable the scenario to run automatically and set appropriate scheduling intervals. Balance sync speed with API rate limits and operation usage.
- 1Click the clock icon at the bottom left
- 2Set interval to 'Every 5 minutes' for near real-time sync
- 3Toggle the scenario ON using the switch at bottom left
- 4Click 'Save' to preserve all configurations
- 5Monitor the first few automatic runs in the execution history
Drop this into a Make custom function.
JavaScript — Custom Function{{if(contains("LastModifiedBy.Name"; "[email protected]"); "skip"; "process")}}▸ Show code
{{if(contains("LastModifiedBy.Name"; "[email protected]"); "skip"; "process")}}
// Use this filter formula to skip updates made by data import tools, preventing sync conflicts during bulk operations... expand to see full code
{{if(contains("LastModifiedBy.Name"; "[email protected]"); "skip"; "process")}}
// Use this filter formula to skip updates made by data import tools, preventing sync conflicts during bulk operationsScaling Beyond 500+ contact updates/day+ Records
If your volume exceeds 500+ contact updates/day records, apply these adjustments.
Implement Batching
Use Make's aggregator modules to group multiple contact updates into single API calls. This reduces operation usage by 60-70% and helps avoid rate limits on both platforms.
Stagger Sync Directions
Run Salesforce-to-Sheets sync every 5 minutes and Sheets-to-Salesforce every 15 minutes. This prevents API conflicts and reduces the chance of hitting concurrent request limits.
Add Conditional Processing
Only sync contacts modified in the last 24 hours using date filters. This prevents unnecessary API calls for unchanged records and dramatically reduces operation consumption.
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 Make for this if you need true bi-directional sync with custom field transformations and complex filtering. Make's visual builder makes it easy to see both sync directions in one scenario, and its error handling prevents cascading failures when APIs hiccup. Skip Make if you just need simple one-way imports - Zapier's contact management triggers are more reliable for basic Salesforce-to-Sheets workflows.
This workflow burns 4 operations per sync cycle - 2 for triggers, 2 for updates. At 200 contact changes per month, that's 800 operations total. Make's Core plan ($9/month, 10k operations) handles this easily with room to spare. Zapier would cost $20/month for their Starter plan to get the same Salesforce features. N8n is free but requires hosting, which adds $20+ monthly for reliable uptime.
Zapier handles Salesforce field mapping better - their interface auto-suggests contact fields and validates picklist values during setup. N8n's Salesforce node supports bulk operations natively, so it's faster for syncing 100+ contacts at once. But Make's router system lets you build complex conditional logic - like syncing VIP contacts immediately but batching regular contacts every hour - without needing separate scenarios.
Google Sheets API rate limits hit hard at 300 requests per minute, which means 5-minute polling intervals minimum for reliable sync. Salesforce's API sometimes returns stale data for 30-60 seconds after updates, causing sync delays that look like failures. The biggest gotcha: Salesforce contact merging breaks your ID mapping completely - when contacts merge, your Sheet references orphaned IDs that no longer exist.
Ideas for what to build next
- →Add Slack Notifications for VIP Updates — Create a filter for high-value contacts and send team notifications when their information changes in either system.
- →Build Automated Lead Scoring Sync — Sync calculated lead scores from Sheets back to a custom Salesforce field to trigger automated follow-up sequences.
- →Create Audit Trail in Airtable — Log every sync operation with timestamps and field changes to maintain a complete audit trail for compliance and debugging.
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