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

How to Enrich Salesforce Accounts from Google Sheets with N8n

Automatically update Salesforce account records when enrichment data is added to a Google Sheets spreadsheet.

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 validation and complex field transformations when enriching Salesforce accounts.

Not ideal for

Simple field copying workflows where Zapier's pre-built templates work fine out of the box.

Sync type

polling

Use case type

sync

Real-World Example

💡

A 25-person B2B SaaS company uses ZoomInfo to research prospects, then exports enrichment data to a Google Sheet with company size, tech stack, and funding info. Before automation, sales ops manually copied this data into 40-50 Salesforce accounts weekly, taking 3 hours and introducing typos. Now the workflow updates accounts within 5 minutes of adding enrichment data to the sheet.

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.

Google Sheets with account identifiers and enrichment data columns
Salesforce org with Account object write permissions
N8n instance (cloud or self-hosted) with Google Sheets and Salesforce nodes
Account matching field that exists in both systems (ID, domain, or name)
List of Salesforce API field names for your enrichment data

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Account IDId
6 optional fields▸ show
Annual RevenueAnnualRevenue
Employee CountNumberOfEmployees
IndustryIndustry
WebsiteWebsite
Company DescriptionDescription
Technologies UsedTech_Stack__c

Step-by-Step Setup

1

Workflows > New Workflow

Create new N8n workflow

Start with a blank workflow canvas. This will house your trigger, data processing, and Salesforce update nodes.

  1. 1Click 'New Workflow' from the N8n dashboard
  2. 2Rename the workflow to 'Account Enrichment Sync'
  3. 3Save the empty workflow
What you should see: Empty workflow canvas with a single 'Start' node visible.
2

Nodes > Trigger > Google Sheets

Add Google Sheets trigger

Set up polling to detect new rows in your enrichment spreadsheet. This will check every 5 minutes for changes.

  1. 1Click the + button next to the Start node
  2. 2Search for 'Google Sheets' in the node selector
  3. 3Select 'On Row Added' trigger
  4. 4Choose your enrichment spreadsheet from the dropdown
What you should see: Google Sheets trigger node showing your spreadsheet name and detected column headers.
Common mistake — Don't use 'On Row Updated' trigger - it fires on every cell edit and will spam your workflow
n8n
+
click +
search apps
Google Sheets
GO
Google Sheets
Add Google Sheets trigger
Google Sheets
GO
module added
3

Node Settings > Credentials > Google Sheets

Connect Google Sheets credentials

Authenticate with your Google account to access spreadsheet data. N8n needs read permissions on your enrichment sheet.

  1. 1Click 'Create New Credential' in the Google Sheets node
  2. 2Select 'OAuth2' authentication method
  3. 3Click 'Connect my account' and authorize N8n
  4. 4Test the connection with 'Test Step'
What you should see: Green 'Connected' status and sample row data displayed in the node output.
Common mistake — Grant access to all Google Sheets, not just the specific file - you might add more enrichment sources later
4

Nodes > Flow > IF

Add data filter node

Filter out incomplete rows and test data. Only process rows that have both account identifier and enrichment data populated.

  1. 1Add an 'IF' node after Google Sheets
  2. 2Set condition to 'account_id' field 'is not empty'
  3. 3Add second condition 'AND' for enrichment fields not empty
  4. 4Connect the 'true' output to continue the workflow
What you should see: IF node showing two conditions with green 'true' and red 'false' output paths.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Google Sheets
GO
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Salesforce
SA
notified
5

Nodes > Sales > Salesforce

Add Salesforce node for account lookup

Find the existing Salesforce account record using your identifier field. This prevents creating duplicates.

  1. 1Add a 'Salesforce' node after the IF node
  2. 2Select 'Get All' operation
  3. 3Choose 'Account' as the resource
  4. 4Set filter to match your account identifier field
What you should see: Salesforce node configured to search accounts with your matching criteria visible.
Common mistake — Use exact field matching - 'contains' queries are slow and may hit API limits on large databases
6

Node Settings > Credentials > Salesforce

Connect Salesforce credentials

Set up OAuth connection to your Salesforce org. N8n needs read/write access to Account records.

  1. 1Click 'Create New Credential' in the Salesforce node
  2. 2Enter your Salesforce instance URL (e.g., yourorg.salesforce.com)
  3. 3Complete OAuth flow and authorize N8n
  4. 4Test connection with sample account lookup
What you should see: Successful connection showing sample account data from your Salesforce org.
Common mistake — Use a dedicated integration user account - personal accounts may lose access when passwords change
7

Nodes > Flow > IF

Add account existence check

Verify the account was found before attempting updates. This prevents errors when account IDs don't match.

  1. 1Add another 'IF' node after Salesforce lookup
  2. 2Set condition to check if Salesforce returned results
  3. 3Use expression '{{ $json.length > 0 }}' for the condition
  4. 4Connect 'true' path to continue, 'false' to error handling
What you should see: Second IF node showing the existence check condition and two output paths.
Common mistake — Don't skip this check - updating non-existent records will fail the entire workflow execution
8

Nodes > Data > Set

Add field mapping node

Transform Google Sheets data to match Salesforce field formats. Handle data type conversions and field naming differences.

  1. 1Add a 'Set' node after the account existence check
  2. 2Map each enrichment field to corresponding Salesforce API name
  3. 3Add the account ID from the lookup result
  4. 4Include only fields that have data in the sheet row
What you should see: Set node showing mapped fields with Salesforce API names and transformed data values.
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

Nodes > Sales > Salesforce

Add Salesforce update node

Update the account record with enriched data. This writes the transformed data back to your CRM.

  1. 1Add a second 'Salesforce' node after the Set node
  2. 2Select 'Update' operation
  3. 3Choose 'Account' as the resource
  4. 4Set 'Id' field to the account ID from lookup results
What you should see: Salesforce update node configured with account ID and ready to receive field mappings.
Common mistake — Map fields by API name, not label - 'Annual Revenue' is 'AnnualRevenue' in the API
10

Workflow > Settings > Error Handling

Configure error handling

Set up proper error handling for failed API calls and data validation issues. This prevents workflow crashes on bad data.

  1. 1Click workflow settings in the top menu
  2. 2Set 'On Error' to 'Stop Workflow'
  3. 3Enable 'Save Data On Error' option
  4. 4Add error notification webhook (optional)
What you should see: Workflow settings showing error handling configuration and data retention options.
Common mistake — Don't use 'Continue On Fail' for Salesforce nodes - partial updates can corrupt your data
11

Workflow > Execute Workflow

Test with sample data

Run the workflow manually with test data to verify field mappings and error handling work correctly.

  1. 1Add a test row to your Google Sheets with real account data
  2. 2Click 'Execute Workflow' button
  3. 3Check each node output for correct data transformation
  4. 4Verify the account updated in Salesforce with new enrichment data
What you should see: All nodes showing green success status and the Salesforce account displaying updated enrichment fields.
Common mistake — Test with a non-critical account first - data errors can overwrite important account information
n8n
▶ Run once
executed
Google Sheets
Salesforce
Salesforce
🔔 notification
received
12

Workflow > Activate

Activate automated polling

Enable the workflow to run automatically every 5 minutes. This starts continuous monitoring of your enrichment spreadsheet.

  1. 1Click the 'Inactive' toggle in the top toolbar
  2. 2Confirm activation in the popup dialog
  3. 3Check 'Executions' tab to see polling started
  4. 4Monitor first few automated runs for errors
What you should see: Workflow status shows 'Active' and executions list shows regular polling attempts every 5 minutes.
Common mistake — The default polling interval is often 15 minutes. If you need faster delivery, check whether your plan supports shorter intervals before assuming it's a bug.

Drop this into an n8n Code node.

JavaScript — Code Node// Clean and validate enrichment data before Salesforce update
▸ Show code
// Clean and validate enrichment data before Salesforce update
const cleanData = {
  AnnualRevenue: $json.revenue ? parseInt($json.revenue.replace(/[^0-9]/g, '')) : null,

... expand to see full code

// Clean and validate enrichment data before Salesforce update
const cleanData = {
  AnnualRevenue: $json.revenue ? parseInt($json.revenue.replace(/[^0-9]/g, '')) : null,
  NumberOfEmployees: $json.employees && $json.employees !== 'Unknown' ? parseInt($json.employees) : null,
  Industry: $json.industry === 'Software' ? 'Technology' : $json.industry // Map to SF picklist
};

return [{ json: cleanData }];

Scaling Beyond 100+ accounts per day+ Records

If your volume exceeds 100+ accounts per day records, apply these adjustments.

1

Batch account lookups

Use N8n's HTTP Request node with Salesforce REST API to query multiple accounts in single calls. This reduces API consumption from 2 calls per account to 1 call per 200 accounts.

2

Reduce polling frequency

Change Google Sheets trigger from 5 minutes to 15-30 minutes. Add a timestamp column to process only recently updated rows instead of scanning the entire sheet.

3

Split workflows by priority

Create separate workflows for critical vs nice-to-have enrichment fields. Run high-priority data every 15 minutes and supplementary data once daily to manage API limits.

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 transformations or have complex matching logic between systems. The code nodes let you handle edge cases that break simple automation tools. You can batch process hundreds of enrichment records without hitting execution limits. Skip N8n if you just need basic field copying - Zapier handles simple Google Sheets to Salesforce updates faster and with less setup.

Cost

This workflow costs 2-3 executions per enriched account (lookup + update + error handling). At 200 accounts/month, that's 500-600 executions total. N8n cloud's Starter plan gives you 5,000 executions for $20/month, so you're well under the limit. Zapier would charge $30/month for the same volume on their Team plan. Make costs $25/month but counts each Salesforce API call separately, making it more expensive for lookup-heavy workflows.

Tradeoffs

Zapier wins on setup speed - their Google Sheets trigger fires faster and the Salesforce integration auto-maps common fields. Make handles large datasets better with built-in pagination and bulk operations. But N8n gives you full control over data transformation and error handling. The code nodes let you clean messy enrichment data, validate formats, and implement retry logic that other platforms can't match.

Google Sheets API sometimes lags on new row detection, especially with multiple concurrent users editing. Your trigger might miss rows added in quick succession. Salesforce field validation will kill the entire workflow if one field fails - set up individual field updates wrapped in try-catch logic. Watch your API governor limits if processing historical data - bulk loading 1000+ accounts will burn through daily limits fast.

Ideas for what to build next

  • Add lead enrichment workflowCreate a parallel workflow to enrich Lead records using the same Google Sheets data source and field mapping logic.
  • Set up enrichment data validationAdd Google Sheets data validation rules and N8n error notifications to catch bad data before it reaches Salesforce.
  • Create enrichment audit trailBuild a workflow that logs all enrichment activities to a separate Google Sheet for compliance and troubleshooting.

Related guides

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