

How to Import leads from spreadsheets with Pipedream
Automatically create or update Salesforce leads when new rows are added to Google Sheets.
Steps and UI details are based on platform versions at time of writing β check each platform for the latest interface.
Best for
Sales teams that collect leads in shared spreadsheets and need instant CRM updates without manual data entry.
Not ideal for
Teams that need two-way sync or are processing 500+ leads per day - consider bulk import tools instead.
Sync type
real-timeUse case type
importReal-World Example
A 12-person B2B marketing agency collects leads from trade shows and webinars in a shared Google Sheet. Before automation, someone manually copied 20-30 leads into Salesforce every Monday, often missing hot prospects for days. Now leads appear in Salesforce within 30 seconds of being added to the sheet.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 | ||
| Last Name | LastName | |
| Company | Company | |
7 optional fieldsβΈ show
| First Name | FirstName |
Email | |
| Phone | Phone |
| Lead Source | LeadSource |
| Title | Title |
| Industry | Industry |
| Status | Status |
Step-by-Step Setup
Pipedream > Workflows > New > Select Trigger > Google Sheets
Create new Pipedream workflow
Navigate to pipedream.com and click 'Create Workflow' in the top right. You'll land on a blank workflow canvas. Click 'Select Trigger' at the top of the workflow builder. Choose 'Google Sheets' from the app directory and select 'New Row Added' as your trigger event.
- 1Click 'Create Workflow' button
- 2Click 'Select Trigger' at the top
- 3Search for 'Google Sheets' in the app list
- 4Select 'New Row Added (Instant)' trigger
Google Sheets Step > Account > Connect Account
Connect Google Sheets account
Click 'Connect Account' and sign in with your Google account. Grant Pipedream permission to read your sheets. After connecting, you'll see a dropdown to select your spreadsheet. Choose the sheet where leads are added. Set the worksheet tab if your sheet has multiple tabs.
- 1Click 'Connect Account' button
- 2Sign in with Google credentials
- 3Grant read permissions to Pipedream
- 4Select your lead spreadsheet from dropdown
- 5Choose the correct worksheet tab
Google Sheets Step > Test
Test Google Sheets trigger
Click 'Test' to verify the connection works. If your sheet has existing data, Pipedream will show the most recent row. If the sheet is empty, add a test row with sample lead data first. You should see all column headers as available fields for the next step.
- 1Click 'Test' button in the trigger step
- 2Review the sample data returned
- 3Verify all expected columns appear
- 4Note the field names for mapping
Workflow > + Add Step > Salesforce > Create Record
Add Salesforce step
Click the + button below your trigger to add a new step. Search for 'Salesforce' and select it. Choose 'Create Record' as your action. This will create new lead records in Salesforce when the workflow runs. You'll see Salesforce connection options appear in the step configuration.
- 1Click the + button below Google Sheets step
- 2Search for 'Salesforce' in the app directory
- 3Select 'Salesforce' from results
- 4Choose 'Create Record' action
- 5Set Object Type to 'Lead'
Salesforce Step > Account > Connect Account
Connect Salesforce account
Click 'Connect Account' in the Salesforce step. Sign in with your Salesforce credentials through the OAuth popup. Grant Pipedream the necessary permissions to create and modify leads. After connecting, you'll see your Salesforce org name displayed in the account section.
- 1Click 'Connect Account' button
- 2Sign in through Salesforce OAuth popup
- 3Grant required permissions
- 4Verify connection shows your org name
Salesforce Step > Object Type > Field Mapping
Map required lead fields
Set Object Type to 'Lead' if not already selected. Map the required Salesforce fields using data from your Google Sheets trigger. LastName and Company are required - map these to the appropriate sheet columns. Click in each field and select the corresponding value from the Google Sheets step data.
- 1Confirm Object Type is set to 'Lead'
- 2Map LastName to your name column from sheets
- 3Map Company to your company column
- 4Add Email mapping if available
- 5Set LeadSource to identify sheet imports
Salesforce Step > Add Field
Add optional field mappings
Map additional fields like FirstName, Email, Phone, Title, and Industry to provide complete lead data. Click 'Add Field' to map more properties. Reference the Google Sheets column names you noted earlier. Set Status to 'Open - Not Contacted' for new leads from sheets.
- 1Click 'Add Field' to expand field options
- 2Map FirstName to first name sheet column
- 3Map Email and Phone if available
- 4Set Status to 'Open - Not Contacted'
- 5Add any custom fields your team uses
Workflow > + Add Step > Code (Node.js)
Add duplicate prevention step
Click + to add another step between Google Sheets and Salesforce. Add a 'Code' step to check for existing leads by email. This prevents duplicate leads when the same person appears multiple times. Paste the duplicate checking code that queries Salesforce first before creating new records.
- 1Click + button above the Salesforce step
- 2Select 'Code' from the step options
- 3Choose 'Run Node.js code'
- 4Paste duplicate prevention code
- 5Update Salesforce step to use conditional logic
Workflow > Test Workflow
Test complete workflow
Click 'Test' on the entire workflow to verify each step works correctly. Add a new row to your Google Sheet with test data. Watch the workflow execute in real-time. Check your Salesforce leads to confirm the record was created with correct field mappings.
- 1Click 'Test Workflow' button at the top
- 2Add a test row to your Google Sheet
- 3Watch each step execute in the workflow
- 4Check Salesforce for the new lead record
- 5Verify all mapped fields populated correctly
Workflow > Deploy
Deploy workflow
Click 'Deploy' to activate your workflow for live processing. The workflow will now automatically process new sheet rows in real-time. You'll see the deployment status change to 'Active' with a green indicator. New Google Sheets rows will trigger the workflow within 15-30 seconds.
- 1Click 'Deploy' button in the top right
- 2Confirm deployment in the popup
- 3Wait for 'Active' status to appear
- 4Test with a real lead entry
Add this Node.js code in a code step before your Salesforce action to prevent duplicate leads and normalize data formats. Paste this in the code editor that appears when you add a Code step.
JavaScript β Code Stepimport { axios } from "@pipedream/platform"βΈ Show code
import { axios } from "@pipedream/platform"
export default defineComponent({
async run({ steps, $ }) {... expand to see full code
import { axios } from "@pipedream/platform"
export default defineComponent({
async run({ steps, $ }) {
const { email, first_name, last_name, company } = steps.trigger.event
// Normalize and validate data
const normalizedEmail = email ? email.trim().toLowerCase() : null
const cleanPhone = steps.trigger.event.phone ? steps.trigger.event.phone.replace(/[^\d+\-\(\)\s]/g, '') : null
// Check for existing leads by email
let existingLead = null
if (normalizedEmail) {
try {
const searchResponse = await axios($, {
url: `https://${steps.salesforce_auth.$auth.instance_url}/services/data/v58.0/query`,
headers: {
"Authorization": `Bearer ${steps.salesforce_auth.$auth.oauth_access_token}`,
"Content-Type": "application/json"
},
params: {
q: `SELECT Id, Email, Company FROM Lead WHERE Email = '${normalizedEmail}' LIMIT 1`
}
})
existingLead = searchResponse.records[0]
} catch (error) {
console.log('Search error:', error.message)
}
}
// Return processed data
return {
shouldCreate: !existingLead,
existingLeadId: existingLead?.Id,
processedData: {
FirstName: first_name?.trim(),
LastName: last_name?.trim() || 'Unknown',
Email: normalizedEmail,
Company: company?.trim(),
Phone: cleanPhone,
Title: steps.trigger.event.title?.trim(),
LeadSource: 'Spreadsheet Import',
Status: 'Open - Not Contacted'
}
}
}
})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 Pipedream for this if you need instant lead processing and your team works with code. The Node.js steps let you handle data validation, duplicate prevention, and complex field mapping that basic connectors can't touch. You get webhook-speed triggers and detailed execution logs. Skip Pipedream if you're processing 1000+ leads per day - Salesforce Data Loader handles bulk imports better.
Costs stay predictable at $0 for 100 credits per day. Each lead import uses roughly 2-3 credits (trigger + Salesforce action + optional code step). At 50 leads per day you'll hit the free tier limit. Paid plans start at $19/month for 1000 credits daily. Zapier charges per task with no free overage, making Pipedream cheaper for steady volume.
Zapier handles this workflow with zero setup complexity and built-in duplicate detection via Formatter steps. Make offers visual error handling and better bulk processing through iterator modules. n8n provides similar Node.js flexibility but requires self-hosting for production reliability. Power Automate integrates naturally if you're already in Microsoft's ecosystem. Pipedream wins on webhook speed and debugging tools - you see exactly what data flows through each step.
You'll hit Salesforce API limits around 200-300 leads per hour depending on your org's allocation. Google Sheets sometimes sends duplicate webhook notifications for the same row if multiple people edit simultaneously. Required field validation happens at runtime, so incomplete sheet rows will fail the workflow after it starts processing. Plan for data cleanup and retry logic from day one.
Ideas for what to build next
- βAdd lead assignment rules β Create logic to assign leads to specific sales reps based on company size, industry, or geographic territory using Salesforce assignment rules.
- βSet up error notification β Configure Pipedream to send Slack or email alerts when leads fail to create, helping you catch data issues quickly.
- βBuild reverse sync for lead status β Create a second workflow that updates your Google Sheet when lead status changes in Salesforce, keeping both systems synchronized.
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