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

How to Import contacts from spreadsheets with Pipedream

Automatically create or update HubSpot contacts whenever a new row is added to your Google Sheet.

Steps and UI details are based on platform versions at time of writing β€” check each platform for the latest interface.

Best for

Teams that regularly add leads to spreadsheets and need them in HubSpot within seconds

Not ideal for

One-time imports or bulk uploads over 1000 records (use HubSpot's native CSV importer instead)

Sync type

real-time

Use case type

import

Real-World Example

πŸ’‘

A 12-person marketing agency uses this to import leads from webinar registration sheets. Their VA adds 15-20 new leads per day to a Google Sheet, and each contact appears in HubSpot within 30 seconds. Before automation, they copied data manually twice per week and lost hot leads for days.

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 access to Google Sheets and permission to create webhooks
HubSpot account with contacts write permissions and API access enabled
Pipedream account with available workflow executions in your plan
Google Sheet formatted with column headers in the first row

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email Addressemail
7 optional fieldsβ–Έ show
First Namefirstname
Last Namelastname
Company Namecompany
Phone Numberphone
Job Titlejobtitle
Lead Sourcehs_lead_source
Lifecycle Stagelifecyclestage

Step-by-Step Setup

1

Dashboard > New > Workflow

Create new workflow in Pipedream

Log into pipedream.com and click the green 'New' button in the top right corner. Select 'Workflow' from the dropdown menu. You'll see the workflow builder with an empty trigger step. This is where you'll configure Google Sheets to watch for new rows.

  1. 1Click the green 'New' button in top right
  2. 2Select 'Workflow' from the dropdown
  3. 3Click on the empty trigger step in the builder
βœ“ What you should see: You should see an empty workflow with one trigger step ready to configure.
2

Workflow Builder > Trigger Step > Select App

Configure Google Sheets trigger

Click 'Select App' in the trigger step and search for 'Google Sheets'. Choose the 'New Row Added' trigger type. This creates an instant webhook that fires whenever someone adds a row to your spreadsheet. You'll need to connect your Google account if this is your first time.

  1. 1Click 'Select App' in the trigger configuration
  2. 2Search for and select 'Google Sheets'
  3. 3Choose 'New Row Added' from the trigger list
  4. 4Click 'Connect Account' to authorize Google Sheets access
βœ“ What you should see: You should see Google Sheets connected with a green checkmark and trigger options visible.
⚠
Common mistake β€” The trigger only fires for new rows added after setup - existing rows won't trigger the workflow.
Pipedream
+
click +
search apps
Google Sheets
GO
Google Sheets
Configure Google Sheets trig…
Google Sheets
GO
module added
3

Trigger Configuration > Spreadsheet Selection

Select your spreadsheet and worksheet

Choose the specific Google Sheet containing your contact data from the dropdown. Then select the worksheet tab where new rows will be added. The trigger will monitor this exact sheet and tab combination. Make sure your first row contains column headers like 'Email', 'First Name', 'Last Name', and 'Company'.

  1. 1Select your spreadsheet from the 'Spreadsheet' dropdown
  2. 2Choose the correct worksheet tab from 'Worksheet' dropdown
  3. 3Verify the column headers appear in the preview
  4. 4Click 'Save and Continue' to confirm settings
βœ“ What you should see: You should see a preview of your sheet's column headers and sample data below the configuration.
⚠
Common mistake β€” Column headers must be in row 1 - the trigger reads headers from the first row only.
4

Trigger Step > Test Trigger

Test the Google Sheets trigger

Add a test row to your Google Sheet with sample contact data. Within 30 seconds, return to Pipedream and click 'Test Trigger' to see if the webhook captured your new row. You should see all column data from your test row displayed in JSON format.

  1. 1Open your Google Sheet in a new tab
  2. 2Add a new row with test contact data
  3. 3Return to Pipedream and click 'Test Trigger'
  4. 4Verify your test data appears in the trigger output
βœ“ What you should see: You should see your test row data formatted as JSON with each column as a separate property.
⚠
Common mistake β€” If no data appears after 2 minutes, check that you added the row to the correct worksheet tab.
Pipedream
β–Ά Deploy & test
executed
βœ“
Google Sheets
βœ“
HubSpot
HubSpot
πŸ”” notification
received
5

Workflow Builder > + Add Step > HubSpot

Add HubSpot action step

Click the '+' button below your trigger step to add a new action. Search for 'HubSpot' and select it from the app list. Choose 'Create or Update Contact' as your action type. This action will check for existing contacts by email before creating duplicates.

  1. 1Click the '+' button below the trigger step
  2. 2Search for and select 'HubSpot' from the apps list
  3. 3Choose 'Create or Update Contact' action
  4. 4Click 'Connect Account' to authorize HubSpot access
βœ“ What you should see: You should see HubSpot connected with a green checkmark and contact field options visible.
⚠
Common mistake β€” 'Create or Update Contact' prevents duplicates - 'Create Contact' will fail if the email already exists.
6

HubSpot Step > Field Mapping

Map contact fields from spreadsheet data

Configure the HubSpot contact fields using data from your Google Sheets trigger. Click in each field and select the corresponding column from your spreadsheet. Email is required and used for duplicate detection. Map first name, last name, company, and phone number at minimum.

  1. 1Click in the 'Email' field and select your email column
  2. 2Map 'First Name' to your first name column
  3. 3Map 'Last Name' to your last name column
  4. 4Map 'Company' to your company column
  5. 5Add any additional custom fields your team uses
βœ“ What you should see: You should see each HubSpot field populated with the corresponding column reference from your spreadsheet.
⚠
Common mistake β€” HubSpot requires a valid email format - invalid emails will cause the workflow to fail.
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

HubSpot Step > Additional Properties

Configure contact properties and lead source

Set the 'Lead Source' field to identify contacts imported from your spreadsheet. Use a value like 'Spreadsheet Import' or 'Manual Entry' for tracking. You can also set the contact owner, lifecycle stage, or any custom properties your team needs for proper lead routing.

  1. 1Scroll down to 'Lead Source' and enter 'Spreadsheet Import'
  2. 2Set 'Lifecycle Stage' to 'Lead' or your preferred stage
  3. 3Assign a 'HubSpot Owner' if needed for lead routing
  4. 4Configure any custom properties your team requires
βœ“ What you should see: You should see additional contact properties configured with static values or mapped spreadsheet columns.
⚠
Common mistake β€” HubSpot Owner must be a valid user ID number, not an email address or name.
8

Workflow Builder > + Add Step > Code

Add duplicate detection logic

Add a Node.js code step between the trigger and HubSpot action to check for required fields and clean data. This prevents workflow failures from empty emails or malformed phone numbers. The code validates email format and standardizes phone number formatting before sending to HubSpot.

  1. 1Click '+' between trigger and HubSpot steps
  2. 2Select 'Code' from the step types
  3. 3Choose 'Run Node.js code'
  4. 4Paste the validation code in the editor
βœ“ What you should see: You should see a code step that outputs cleaned contact data with validation checks.
⚠
Common mistake β€” Place this code step BEFORE the HubSpot action - order matters in Pipedream workflows.
9

Workflow Builder > Test > Deploy

Test the complete workflow

Add another test row to your Google Sheet with different contact data. The workflow should trigger automatically and create a new contact in HubSpot within 60 seconds. Check your HubSpot contacts list to verify the import worked correctly with all mapped fields populated.

  1. 1Add a new test row to your Google Sheet
  2. 2Wait 60 seconds for the workflow to process
  3. 3Check the workflow execution logs in Pipedream
  4. 4Verify the new contact appears in your HubSpot contacts
βœ“ What you should see: You should see a successful execution in Pipedream logs and a new contact in HubSpot with all fields populated.
⚠
Common mistake β€” Failed executions will show in red with error details - check these before going live.
10

Workflow Builder > Deploy

Deploy workflow for production use

Click the 'Deploy' button to activate your workflow for live use. The workflow will now automatically import every new row added to your spreadsheet. Share the Google Sheet with team members who need to add contacts, and train them on the required column format.

  1. 1Click the green 'Deploy' button in the top right
  2. 2Confirm deployment in the popup dialog
  3. 3Share your Google Sheet with relevant team members
  4. 4Document the required column format for your team
βœ“ What you should see: You should see 'Deployed' status with a green indicator, and the workflow will process new rows automatically.
⚠
Common mistake β€” Deployed workflows consume credits for every execution - monitor usage in your Pipedream dashboard.

This Node.js code validates email addresses and cleans phone numbers before sending to HubSpot. Paste it in a code step between your trigger and HubSpot action to prevent workflow failures.

JavaScript β€” Code Stepexport default defineComponent({
β–Έ Show code
export default defineComponent({
  async run({ steps, $ }) {
    const rowData = steps.trigger.event;

... expand to see full code

export default defineComponent({
  async run({ steps, $ }) {
    const rowData = steps.trigger.event;
    
    // Validate required email field
    const email = rowData.Email?.trim();
    if (!email || !email.includes('@')) {
      $.flow.exit('Skipping row - invalid or missing email address');
    }
    
    // Clean and validate email format
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      $.flow.exit('Skipping row - email format invalid');
    }
    
    // Clean phone number - remove all non-digits
    let phone = rowData.Phone || '';
    phone = phone.replace(/\D/g, '');
    
    // Format phone for HubSpot (US numbers)
    if (phone.length === 10) {
      phone = `+1${phone}`;
    } else if (phone.length === 11 && phone.startsWith('1')) {
      phone = `+${phone}`;
    }
    
    // Return cleaned data
    return {
      email: email.toLowerCase(),
      firstname: rowData['First Name']?.trim() || '',
      lastname: rowData['Last Name']?.trim() || '',
      company: rowData.Company?.trim() || '',
      phone: phone,
      jobtitle: rowData['Job Title']?.trim() || '',
      hs_lead_source: 'Spreadsheet Import',
      lifecyclestage: 'lead'
    };
  }
});

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 your team adds contacts throughout the day and needs them in HubSpot immediately. The instant webhook triggers and Node.js code steps make data validation bulletproof. You get real-time imports with custom logic for cleaning phone numbers and validating emails. Skip Pipedream if you're doing bulk one-time imports over 500 contacts - HubSpot's native CSV importer is faster and cheaper for large batches.

Cost

Real costs: each contact import consumes 1 execution credit. At 200 contacts per month, you'll use 200 credits ($10 on the Basic plan). Zapier charges $20/month for the same volume. Make costs $9/month but their Google Sheets trigger polls every 15 minutes instead of instant webhooks. Pipedream wins on both speed and cost for this volume.

Tradeoffs

Make handles duplicate contact scenarios better with built-in email validation filters. Zapier's field mapping interface is cleaner for non-technical users. n8n gives you more complex data transformation options if you need to split names or reformat addresses. Power Automate integrates better if you're already using Microsoft 365. But Pipedream's instant webhooks and code flexibility make it the best choice when speed matters and you need custom validation logic.

You'll hit three issues: Google Sheets sometimes fails to register the webhook if your sheet has complex formulas in the header row. HubSpot's API randomly returns 429 rate limit errors during peak hours, failing your imports. Phone number formatting breaks if people enter international numbers with country codes - you'll need regex cleaning in your code step to handle +44, +33, and other formats consistently.

Ideas for what to build next

  • β†’
    Add contact enrichment β€” Connect Clearbit or ZoomInfo to automatically add company data and social profiles to imported contacts.
  • β†’
    Set up lead scoring automation β€” Create HubSpot workflows to automatically score and route leads based on job title, company size, or other imported data.
  • β†’
    Build reverse sync for updates β€” Create a second workflow that updates your Google Sheet when contact data changes in HubSpot for two-way synchronization.

Related guides

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