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

How to Import Event Leads from Google Sheets to HubSpot with Pipedream

Automatically sync new event leads from Google Sheets to HubSpot contacts with event tagging.

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

Best for

Teams who collect leads at events and need them tagged and imported to HubSpot within 15 minutes.

Not ideal for

High-frequency imports over 1000 leads per event - use HubSpot's CSV import instead.

Sync type

scheduled

Use case type

import

Real-World Example

💡

A 25-person B2B marketing team collects 150 leads at a trade show, pastes them into their Event Leads sheet, and needs them in HubSpot with 'Trade Show 2024' tags within 15 minutes. Before automation, someone manually imported CSV files which took 45 minutes and often missed the event source tag.

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 event leads spreadsheet
HubSpot account with contact creation and editing permissions
Sheet formatted with headers in row 1 and consistent column structure
Email column present in sheet data - required for HubSpot contact creation

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email Addressemail
First Namefirstname
Last Namelastname
5 optional fields▸ show
Companycompany
Phone Numberphone
Job Titlejobtitle
Lead Sourcehs_lead_status
Event Notesnotes_last_contacted

Step-by-Step Setup

1

Pipedream > Workflows > New

Create new Pipedream workflow

Go to pipedream.com and click New Workflow. You'll see a blank canvas with a trigger section at the top. This is where you'll configure the Google Sheets monitoring. Pipedream will check your sheet every 15 minutes by default.

  1. 1Click the blue New Workflow button
  2. 2Select 'Build your own' from the options
  3. 3Name your workflow 'Event Lead Import'
  4. 4Click Create Workflow
What you should see: You should see a new workflow with an empty trigger step ready for configuration.
2

Trigger > Select App > Google Sheets

Add Google Sheets trigger

Click the trigger step and search for Google Sheets. Select 'New Row Added' as your trigger type. This will monitor your specific sheet for new rows and fire the workflow when leads are pasted. You'll need to authenticate with your Google account that has access to the sheet.

  1. 1Click 'Select an app' in the trigger
  2. 2Search for 'Google Sheets' and select it
  3. 3Choose 'New Row Added' trigger
  4. 4Connect your Google account
What you should see: You should see Google Sheets connected with a green checkmark and trigger configured.
Common mistake — The trigger only detects new rows, not edits to existing rows - paste leads in fresh rows only.
Pipedream
+
click +
search apps
Google Sheets
GO
Google Sheets
Add Google Sheets trigger
Google Sheets
GO
module added
3

Trigger Configuration > Spreadsheet Settings

Configure sheet and range

Select your Event Leads spreadsheet from the dropdown. Choose the specific worksheet tab where you paste leads. Set the range to include all columns you need - typically A:H for name, email, company, phone, title, notes, and source. Leave the header row option enabled if row 1 contains column names.

  1. 1Select your spreadsheet from the Spreadsheet dropdown
  2. 2Choose the correct worksheet tab
  3. 3Set Range to 'A:H' or your column range
  4. 4Enable 'Worksheet contains headers'
What you should see: You should see your sheet columns listed as available data fields in the test section.
4

Trigger > Test

Test the Google Sheets trigger

Add a test row to your sheet with sample lead data. Come back to Pipedream and click Test Trigger. Pipedream will fetch the new row and show you the data structure. You need this data to map fields in the next step.

  1. 1Add a sample lead row to your Google Sheet
  2. 2Click 'Test trigger' in Pipedream
  3. 3Wait for the data to appear
  4. 4Review the field names and values
What you should see: You should see your test row data displayed with field names matching your sheet headers.
Common mistake — If no data appears, check that your test row was added after the last workflow run timestamp.
Pipedream
▶ Deploy & test
executed
Google Sheets
HubSpot
HubSpot
🔔 notification
received
5

Steps > Add Step > HubSpot

Add HubSpot step

Click the + button below your trigger to add a new step. Search for HubSpot and select 'Create Contact' action. This will create a new contact record for each lead row. You'll authenticate with HubSpot using an account that has contact creation permissions.

  1. 1Click the + button to add a step
  2. 2Search for 'HubSpot' and select it
  3. 3Choose 'Create Contact' action
  4. 4Connect your HubSpot account
What you should see: You should see HubSpot connected with contact creation fields ready for mapping.
Common mistake — Your HubSpot user needs 'Edit contacts and companies' permission or the step will fail.
6

HubSpot Step > Field Mapping

Map contact fields

Map your Google Sheets columns to HubSpot contact properties. Click each HubSpot field and select the corresponding data from your trigger. Email is required - HubSpot will reject records without it. Map firstname, lastname, company, phone, and jobtitle at minimum for useful contact records.

  1. 1Click the Email field and select your email column
  2. 2Map firstname to your first name column
  3. 3Map lastname to your last name column
  4. 4Map company and phone fields
  5. 5Set jobtitle if you collect titles
What you should see: You should see blue data pills from your trigger mapped to each HubSpot field.
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

Add event source tag

Scroll down to find the 'hs_lead_status' or custom tag fields in the HubSpot step. Set a fixed value like 'Event Lead - Trade Show 2024' so you can filter these contacts later. You can also map a dynamic tag if your sheet includes a source column with different event names.

  1. 1Scroll to additional properties section
  2. 2Find 'Lead Status' or tag fields
  3. 3Enter your event name as a fixed value
  4. 4Or map to a source column from your sheet
What you should see: You should see the tag value configured either as fixed text or mapped to sheet data.
Common mistake — Custom properties must already exist in HubSpot - create them first if needed.
8

Steps > Add Step > Code

Add duplicate prevention

Add a Node.js code step before HubSpot to check for existing contacts. Pipedream's HubSpot integration doesn't prevent duplicates by default. Use the HubSpot API to search by email first, then only create if no match is found. This prevents duplicate contacts from repeat imports.

  1. 1Click + to add a step before HubSpot
  2. 2Select 'Code' and choose Node.js
  3. 3Paste the duplicate-check code
  4. 4Update the HubSpot step to use conditional logic
What you should see: You should see the code step configured with email checking logic.
Common mistake — Move this code step above the HubSpot step or duplicates will still be created.
9

Workflow > Test

Test the complete workflow

Add another test row to your sheet with different lead data. Click Test Workflow to run all steps. Check that the contact appears in HubSpot with correct field values and your event tag. Verify the duplicate check works by running the same data twice.

  1. 1Add a new test lead to your sheet
  2. 2Click 'Test workflow' button
  3. 3Review each step's output
  4. 4Check HubSpot for the new contact
  5. 5Test duplicate prevention with same email
What you should see: You should see a new HubSpot contact with mapped fields and event tag, no duplicate on second run.
10

Workflow > Deploy

Deploy and set schedule

Click Deploy to activate your workflow. The trigger will check for new sheet rows every 15 minutes by default. You can change this to every 5 minutes if you need faster imports, but it will use more credits. The workflow will now run automatically whenever new leads are pasted.

  1. 1Click the Deploy button in the top right
  2. 2Confirm the deployment
  3. 3Check the trigger schedule setting
  4. 4Adjust timing if needed
What you should see: You should see 'Deployed' status with the next scheduled check time displayed.
Common mistake — Faster polling intervals consume more credits - 5 minutes uses 3x more than 15 minutes.

Add this Node.js code step before the HubSpot step to prevent duplicate contacts and handle empty fields gracefully. Paste it in a new code step and adjust the email field reference to match your trigger data.

JavaScript — Code Stepimport axios from 'axios'
▸ Show code
import axios from 'axios'
export default defineComponent({
  async run({ steps, $ }) {

... expand to see full code

import axios from 'axios'

export default defineComponent({
  async run({ steps, $ }) {
    const email = steps.trigger.event.email
    const hubspotToken = process.env.HUBSPOT_TOKEN
    
    // Check for existing contact
    try {
      const searchResponse = await axios.get(
        `https://api.hubapi.com/contacts/v1/contact/email/${email}/profile`,
        { headers: { 'Authorization': `Bearer ${hubspotToken}` } }
      )
      
      if (searchResponse.status === 200) {
        console.log(`Contact ${email} already exists, skipping creation`)
        return { skip_creation: true, existing_contact: searchResponse.data }
      }
    } catch (error) {
      if (error.response?.status !== 404) {
        throw error
      }
    }
    
    // Clean and prepare contact data
    const contactData = {
      email: email,
      firstname: steps.trigger.event.first_name || '',
      lastname: steps.trigger.event.last_name || '',
      company: steps.trigger.event.company || 'Not provided',
      phone: steps.trigger.event.phone || null,
      jobtitle: steps.trigger.event.title || null,
      hs_lead_status: steps.trigger.event.source || 'Event Lead'
    }
    
    // Remove null values
    Object.keys(contactData).forEach(key => {
      if (contactData[key] === null || contactData[key] === '') {
        delete contactData[key]
      }
    })
    
    return { skip_creation: false, contact_data: contactData }
  }
})

Scaling Beyond 50+ leads per import batch+ Records

If your volume exceeds 50+ leads per import batch records, apply these adjustments.

1

Split large batches across multiple sheet rows

Import 25-50 leads at a time to avoid timeout issues. Pipedream handles each row individually, so large batches may hit execution time limits.

2

Monitor your HubSpot API usage

HubSpot allows 10,000 API calls per day. Each contact creation uses 1-2 calls, so factor this into your import frequency planning.

3

Consider CSV import for 200+ leads

HubSpot's native CSV import handles large volumes better than automation. Use Pipedream for smaller, frequent imports that need immediate processing.

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 event leads in HubSpot within 15 minutes of pasting them in a sheet. The Node.js code steps handle duplicate prevention better than Zapier's basic filters. The instant processing means your sales team can start calling leads while the event buzz is fresh. Skip Pipedream if you're importing 500+ leads per event - HubSpot's CSV import is faster for bulk loads.

Cost

This costs about 1 credit per lead processed. At 100 event leads monthly, you'll use 100 credits ($5/month on the basic plan). Zapier charges $20/month for the same volume. Make is cheaper at $9/month but their Google Sheets polling is less reliable. Pipedream wins on cost and code flexibility.

Tradeoffs

Zapier's HubSpot integration has better built-in duplicate handling but costs 4x more. Make's visual interface is cleaner but their error handling is weaker when sheet formatting changes. n8n offers similar coding power but requires self-hosting. Power Automate works well if you're already in Microsoft ecosystem but has no built-in duplicate prevention. Pipedream strikes the right balance between coding power and managed hosting.

You'll hit Google Sheets API limits if checking every 5 minutes with large sheets - stick to 15-minute intervals. HubSpot sometimes rejects contacts with invalid phone formats, so add validation in your code step. The biggest gotcha: if someone edits your sheet headers, the whole mapping breaks until you reconfigure the trigger.

Ideas for what to build next

  • Add lead scoring automationCreate a follow-up workflow that scores new event leads based on company size and job title for sales prioritization.
  • Set up sales notificationTrigger Slack alerts to your sales team when high-value event leads are imported based on company domain or title keywords.
  • Create event ROI trackingBuild a dashboard workflow that tracks conversion rates from event leads to customers for measuring event effectiveness.

Related guides

Was this guide helpful?
Google Sheets + HubSpot overviewPipedream profile →