

How to Export HubSpot Contacts to Sheets with Pipedream
Automatically export HubSpot contacts matching specific criteria to a Google Sheet on a schedule.
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 need regular contact reports or backups without manual exports
Not ideal for
Real-time syncing needs — use webhook-based workflows instead for instant updates
Sync type
scheduledUse case type
reportingReal-World Example
A 25-person B2B company runs this daily at 9 AM to export all contacts modified in the last 24 hours to a shared Google Sheet. Before automation, their marketing coordinator spent 30 minutes each morning doing manual exports and often forgot weekends.
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 | ||
| First Name | firstname | |
| Last Name | lastname | |
email | ||
5 optional fields▸ show
| Company | company |
| Phone | phone |
| Lifecycle Stage | lifecyclestage |
| Last Modified | lastmodifieddate |
| Lead Source | hs_analytics_source |
Step-by-Step Setup
Pipedream Dashboard > New > Workflow
Create New Workflow
Log into pipedream.com and click the blue 'New' button in the top navigation. Select 'Workflow' from the dropdown. You'll land on the workflow builder with an empty trigger step. Name your workflow something descriptive like 'HubSpot Contacts Export'.
- 1Click 'New' in the top navigation bar
- 2Select 'Workflow' from the dropdown menu
- 3Click the pencil icon to rename your workflow
- 4Type 'HubSpot Contacts Export' as the name
Workflow Builder > Trigger Step > Schedule
Set Up Schedule Trigger
Click on the trigger step and select 'Schedule' from the built-in apps section. Choose 'Cron' for the event type. Set your cron expression — use '0 9 * * *' for daily at 9 AM UTC. Click 'Create Source' to activate the trigger.
- 1Click on the trigger step box
- 2Search for 'Schedule' in the app selector
- 3Select 'Cron' as the event type
- 4Enter '0 9 * * *' in the cron expression field
- 5Click 'Create Source'
Workflow Builder > Add Step > HubSpot
Add HubSpot Connection
Click the '+' button below your trigger to add a new step. Search for 'HubSpot' and select it. Choose the 'Get All Contacts' action from the list. Click 'Connect Account' and authorize Pipedream to access your HubSpot data using OAuth.
- 1Click the blue '+' button below the trigger
- 2Search for 'HubSpot' in the app list
- 3Select 'Get All Contacts' action
- 4Click 'Connect Account'
- 5Complete OAuth authorization in the popup
HubSpot Step > Configuration
Configure Contact Filters
In the HubSpot step configuration, set up your filtering criteria. Use the 'Properties' field to specify which contact properties you want to retrieve. Add filters like 'lastmodifieddate' is after yesterday to get recent contacts only. Set a reasonable limit like 100 contacts per run to avoid timeouts.
- 1Scroll to the 'Properties' field
- 2Add properties: firstname,lastname,email,company,phone,lifecyclestage
- 3Click 'Add Filter' under Filters section
- 4Set 'lastmodifieddate' > 'yesterday'
- 5Set Limit to 100
HubSpot Step > Test
Test HubSpot Connection
Click the 'Test' button at the bottom of the HubSpot step to run a test query. Pipedream will fetch contacts matching your criteria and display the results in the step output. Review the data structure to understand how contact properties are formatted.
- 1Click the 'Test' button
- 2Wait for the test to complete
- 3Click 'View Test Event Data'
- 4Expand the results to see contact objects
Workflow Builder > Add Step > Google Sheets
Add Google Sheets Connection
Add another step below HubSpot and select Google Sheets. Choose the 'Add Multiple Rows' action since you'll be writing multiple contacts at once. Connect your Google account through OAuth authorization. This action is more efficient than adding rows one by one.
- 1Click '+' below the HubSpot step
- 2Search for and select 'Google Sheets'
- 3Choose 'Add Multiple Rows' action
- 4Click 'Connect Account'
- 5Complete Google OAuth authorization
Google Sheets Step > Configuration
Select Target Spreadsheet
In the Google Sheets configuration, select your target spreadsheet from the dropdown. If you don't have one yet, create a new Google Sheet with headers like 'First Name', 'Last Name', 'Email', 'Company', 'Phone', 'Lifecycle Stage'. Choose the correct worksheet name — usually 'Sheet1' by default.
- 1Click the 'Spreadsheet' dropdown
- 2Select your target spreadsheet
- 3Choose the worksheet (usually 'Sheet1')
- 4Verify the spreadsheet has proper column headers
Workflow Builder > Add Step > Code
Add Data Transformation Code
Before mapping to sheets, add a code step to transform HubSpot contact data into the format Google Sheets expects. Click '+' between HubSpot and Google Sheets steps, then select 'Code'. This step will convert the contact objects into an array of row arrays that Google Sheets can consume.
- 1Click '+' between HubSpot and Google Sheets
- 2Select 'Run Node.js Code'
- 3Delete the default code in the editor
- 4Paste the transformation code
This Node.js code transforms HubSpot contact objects into Google Sheets row format and handles null values gracefully. Paste it into the code step between HubSpot and Google Sheets.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
const contacts = steps.hubspot.contacts || [];... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const contacts = steps.hubspot.contacts || [];
// Transform contacts into rows for Google Sheets
const transformedRows = contacts.map(contact => {
const props = contact.properties;
return [
props.firstname?.value || '',
props.lastname?.value || '',
props.email?.value || '',
props.company?.value || '',
props.phone?.value || '',
// Convert lifecycle stage to readable format
props.lifecyclestage?.value?.replace(/([A-Z])/g, ' $1').trim() || '',
// Format date nicely
props.lastmodifieddate?.value ?
new Date(props.lastmodifieddate.value).toLocaleDateString() : '',
props.hs_analytics_source?.value || ''
];
});
// Filter out contacts with no email (invalid records)
const validRows = transformedRows.filter(row => row[2] !== '');
console.log(`Processed ${contacts.length} contacts, ${validRows.length} valid`);
return { transformedRows: validRows };
}
});Google Sheets Step > Rows Configuration
Configure Sheet Row Mapping
In the Google Sheets step, set the 'Rows' field to reference your code step output. Use the expression editor to select the transformed data array from your code step. This tells Google Sheets exactly which data to write and in what format.
- 1Click in the 'Rows' input field
- 2Click 'Use expression' toggle
- 3Select your code step from the dropdown
- 4Reference the 'transformedRows' property
- 5Click 'Save' to confirm the mapping
Workflow Builder > Test
Test Complete Workflow
Run a full test of your workflow by clicking 'Test' at the top right of the workflow builder. This will execute all steps in sequence — schedule trigger fires, HubSpot fetches contacts, code transforms data, and Google Sheets adds rows. Check your spreadsheet to verify the data appears correctly.
- 1Click 'Test' button at top right
- 2Wait for all steps to complete
- 3Check each step for green success indicators
- 4Open your Google Sheet to verify data
- 5Click 'Deploy' to activate the workflow
Scaling Beyond 500+ contacts per export+ Records
If your volume exceeds 500+ contacts per export records, apply these adjustments.
Implement pagination
Loop through HubSpot results using the 'after' parameter. Process contacts in batches of 100 to avoid memory issues.
Use batch sheet operations
Write all rows at once with 'Add Multiple Rows' instead of individual row adds. This reduces API calls and speeds up execution.
Add retry logic
HubSpot and Google APIs can timeout with large datasets. Add try/catch blocks and exponential backoff for failed requests.
Consider memory limits
Pipedream workflows have memory constraints. For 1000+ contacts, process in smaller chunks or use external storage temporarily.
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 custom data transformations that other platforms can't handle easily. The Node.js code steps let you clean up messy HubSpot property formats, handle null values gracefully, and transform lifecycle stages into readable text. Pipedream also handles HubSpot's pagination automatically if you code it right. Skip this for simple field mapping — Zapier is faster to set up.
This workflow costs about 1 credit per execution on Pipedream's free tier (5,000 credits/month). Running daily costs 30 credits monthly, leaving plenty of room for other workflows. At 50+ contacts per export, you'll hit API rate limits before credit limits. Zapier costs $20/month for the same volume, making Pipedream significantly cheaper.
Zapier wins on setup speed — their HubSpot integration has better property selection UI and pre-built formatters. Make handles larger datasets better with built-in pagination controls. n8n offers the same coding flexibility as Pipedream but requires self-hosting. Power Automate struggles with HubSpot's nested property structure. Pipedream hits the sweet spot of coding power with managed infrastructure.
You'll discover HubSpot returns properties as nested objects (contact.properties.firstname.value) which breaks most no-code tools. Google Sheets throws cryptic errors when you pass null values instead of empty strings. HubSpot's lastmodifieddate includes timezone info that can exclude contacts modified late in the day. Plan for these data format quirks upfront.
Ideas for what to build next
- →Add conditional formatting — Use Google Sheets rules to highlight new MQLs or high-value contacts based on lifecycle stage.
- →Create summary dashboard — Build a separate sheet with pivot tables showing contact counts by source, stage, and company.
- →Add Slack notifications — Send a daily summary message to your sales channel with the count of new/updated contacts exported.
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