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

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-time

Use case type

import

Real-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.

/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 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.

Google account with edit access to the lead spreadsheet
Salesforce account with Create permissions on Lead objects
Google Sheet with column headers in the first row
Consistent data format in your sheet columns (no mixed data types)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Last NameLastName
CompanyCompany
7 optional fieldsβ–Έ show
First NameFirstName
EmailEmail
PhonePhone
Lead SourceLeadSource
TitleTitle
IndustryIndustry
StatusStatus

Step-by-Step Setup

1

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.

  1. 1Click 'Create Workflow' button
  2. 2Click 'Select Trigger' at the top
  3. 3Search for 'Google Sheets' in the app list
  4. 4Select 'New Row Added (Instant)' trigger
βœ“ What you should see: You should see a Google Sheets trigger step added to your workflow with configuration options visible.
2

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.

  1. 1Click 'Connect Account' button
  2. 2Sign in with Google credentials
  3. 3Grant read permissions to Pipedream
  4. 4Select your lead spreadsheet from dropdown
  5. 5Choose the correct worksheet tab
βœ“ What you should see: Your Google account shows as connected with a green checkmark, and your spreadsheet appears in the configuration.
⚠
Common mistake β€” Make sure your sheet has headers in row 1 - Pipedream uses these as field names for mapping.
Pipedream settings
Connection
Choose a connection…Add
click Add
Google Sheets
Log in to authorize
Authorize Pipedream
popup window
βœ“
Connected
green checkmark
3

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.

  1. 1Click 'Test' button in the trigger step
  2. 2Review the sample data returned
  3. 3Verify all expected columns appear
  4. 4Note the field names for mapping
βœ“ What you should see: Test data shows with all your sheet columns visible, formatted as key-value pairs.
⚠
Common mistake β€” If columns contain special characters or spaces, Pipedream converts them to snake_case (e.g., 'First Name' becomes 'first_name').
Pipedream
β–Ά Deploy & test
executed
βœ“
Google Sheets
βœ“
Salesforce
Salesforce
πŸ”” notification
received
4

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.

  1. 1Click the + button below Google Sheets step
  2. 2Search for 'Salesforce' in the app directory
  3. 3Select 'Salesforce' from results
  4. 4Choose 'Create Record' action
  5. 5Set Object Type to 'Lead'
βœ“ What you should see: A Salesforce step appears with Object Type set to 'Lead' and field mapping options visible.
5

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.

  1. 1Click 'Connect Account' button
  2. 2Sign in through Salesforce OAuth popup
  3. 3Grant required permissions
  4. 4Verify connection shows your org name
βœ“ What you should see: Salesforce account shows as connected with your organization name visible.
⚠
Common mistake β€” Your Salesforce user needs 'Create' permission on Lead objects - check with your admin if connection fails.
6

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.

  1. 1Confirm Object Type is set to 'Lead'
  2. 2Map LastName to your name column from sheets
  3. 3Map Company to your company column
  4. 4Add Email mapping if available
  5. 5Set LeadSource to identify sheet imports
βœ“ What you should see: Required fields show mapped with dynamic references to Google Sheets columns (like {{steps.trigger.event.last_name}}).
⚠
Common mistake β€” Salesforce requires LastName and Company fields - the workflow will fail without these mappings.
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
7

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.

  1. 1Click 'Add Field' to expand field options
  2. 2Map FirstName to first name sheet column
  3. 3Map Email and Phone if available
  4. 4Set Status to 'Open - Not Contacted'
  5. 5Add any custom fields your team uses
βœ“ What you should see: Multiple fields show mapped with your Google Sheets column references populated.
8

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.

  1. 1Click + button above the Salesforce step
  2. 2Select 'Code' from the step options
  3. 3Choose 'Run Node.js code'
  4. 4Paste duplicate prevention code
  5. 5Update Salesforce step to use conditional logic
βœ“ What you should see: A Node.js code step appears between your trigger and Salesforce action with the duplicate check logic.
⚠
Common mistake β€” Position this code step before Salesforce creation - order matters in Pipedream workflows.
9

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.

  1. 1Click 'Test Workflow' button at the top
  2. 2Add a test row to your Google Sheet
  3. 3Watch each step execute in the workflow
  4. 4Check Salesforce for the new lead record
  5. 5Verify all mapped fields populated correctly
βœ“ What you should see: All steps show green checkmarks and a new lead appears in Salesforce with data from your test sheet row.
10

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.

  1. 1Click 'Deploy' button in the top right
  2. 2Confirm deployment in the popup
  3. 3Wait for 'Active' status to appear
  4. 4Test with a real lead entry
βœ“ What you should see: Workflow shows 'Active' status and new sheet rows automatically create Salesforce leads.
⚠
Common mistake β€” Monitor the first few executions closely - field mapping errors only appear when real data flows through.

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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

Was this guide helpful?
← Google Sheets + Salesforce overviewPipedream profile β†’