

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-timeUse case type
importReal-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.
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 | ||
| Email Address | email | |
7 optional fieldsβΈ show
| First Name | firstname |
| Last Name | lastname |
| Company Name | company |
| Phone Number | phone |
| Job Title | jobtitle |
| Lead Source | hs_lead_source |
| Lifecycle Stage | lifecyclestage |
Step-by-Step Setup
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.
- 1Click the green 'New' button in top right
- 2Select 'Workflow' from the dropdown
- 3Click on the empty trigger step in the builder
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.
- 1Click 'Select App' in the trigger configuration
- 2Search for and select 'Google Sheets'
- 3Choose 'New Row Added' from the trigger list
- 4Click 'Connect Account' to authorize Google Sheets access
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'.
- 1Select your spreadsheet from the 'Spreadsheet' dropdown
- 2Choose the correct worksheet tab from 'Worksheet' dropdown
- 3Verify the column headers appear in the preview
- 4Click 'Save and Continue' to confirm settings
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.
- 1Open your Google Sheet in a new tab
- 2Add a new row with test contact data
- 3Return to Pipedream and click 'Test Trigger'
- 4Verify your test data appears in the trigger output
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.
- 1Click the '+' button below the trigger step
- 2Search for and select 'HubSpot' from the apps list
- 3Choose 'Create or Update Contact' action
- 4Click 'Connect Account' to authorize HubSpot access
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.
- 1Click in the 'Email' field and select your email column
- 2Map 'First Name' to your first name column
- 3Map 'Last Name' to your last name column
- 4Map 'Company' to your company column
- 5Add any additional custom fields your team uses
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.
- 1Scroll down to 'Lead Source' and enter 'Spreadsheet Import'
- 2Set 'Lifecycle Stage' to 'Lead' or your preferred stage
- 3Assign a 'HubSpot Owner' if needed for lead routing
- 4Configure any custom properties your team requires
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.
- 1Click '+' between trigger and HubSpot steps
- 2Select 'Code' from the step types
- 3Choose 'Run Node.js code'
- 4Paste the validation code in the editor
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.
- 1Add a new test row to your Google Sheet
- 2Wait 60 seconds for the workflow to process
- 3Check the workflow execution logs in Pipedream
- 4Verify the new contact appears in your HubSpot contacts
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.
- 1Click the green 'Deploy' button in the top right
- 2Confirm deployment in the popup dialog
- 3Share your Google Sheet with relevant team members
- 4Document the required column format for your team
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
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.
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.
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
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