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

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

scheduled

Use case type

reporting

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

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

HubSpot admin access or Marketing Hub Starter+ plan for API access
Google account with edit permissions to the target spreadsheet
Target Google Sheet created with proper column headers
HubSpot contacts with the properties you want to export

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
First Namefirstname
Last Namelastname
Emailemail
5 optional fields▸ show
Companycompany
Phonephone
Lifecycle Stagelifecyclestage
Last Modifiedlastmodifieddate
Lead Sourcehs_analytics_source

Step-by-Step Setup

1

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

  1. 1Click 'New' in the top navigation bar
  2. 2Select 'Workflow' from the dropdown menu
  3. 3Click the pencil icon to rename your workflow
  4. 4Type 'HubSpot Contacts Export' as the name
What you should see: You should see an empty workflow with one trigger step labeled 'trigger' at the top.
2

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.

  1. 1Click on the trigger step box
  2. 2Search for 'Schedule' in the app selector
  3. 3Select 'Cron' as the event type
  4. 4Enter '0 9 * * *' in the cron expression field
  5. 5Click 'Create Source'
What you should see: The trigger shows 'Schedule - Cron' with your timing expression and a green 'Active' status.
Common mistake — Pipedream uses UTC time for cron schedules — convert your local time zone to avoid confusion.
Pipedream
+
click +
search apps
Google Sheets
GO
Google Sheets
Set Up Schedule Trigger
Google Sheets
GO
module added
3

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.

  1. 1Click the blue '+' button below the trigger
  2. 2Search for 'HubSpot' in the app list
  3. 3Select 'Get All Contacts' action
  4. 4Click 'Connect Account'
  5. 5Complete OAuth authorization in the popup
What you should see: You should see 'Connected Account' with your HubSpot portal name displayed.
Common mistake — Make sure you have admin permissions in HubSpot — read-only users can't complete the OAuth flow.
4

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.

  1. 1Scroll to the 'Properties' field
  2. 2Add properties: firstname,lastname,email,company,phone,lifecyclestage
  3. 3Click 'Add Filter' under Filters section
  4. 4Set 'lastmodifieddate' > 'yesterday'
  5. 5Set Limit to 100
What you should see: The configuration shows your selected properties and filter conditions with no validation errors.
Common mistake — HubSpot's API returns max 100 contacts per call — use pagination in code for larger datasets.
Google Sheets
GO
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
HubSpot
HU
notified
5

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.

  1. 1Click the 'Test' button
  2. 2Wait for the test to complete
  3. 3Click 'View Test Event Data'
  4. 4Expand the results to see contact objects
What you should see: You should see an array of contact objects with the properties you specified in the step output.
Common mistake — If you get zero results, your date filter might be too restrictive — try 'lastmodifieddate' > 'last week' instead.
Pipedream
▶ Deploy & test
executed
Google Sheets
HubSpot
HubSpot
🔔 notification
received
6

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.

  1. 1Click '+' below the HubSpot step
  2. 2Search for and select 'Google Sheets'
  3. 3Choose 'Add Multiple Rows' action
  4. 4Click 'Connect Account'
  5. 5Complete Google OAuth authorization
What you should see: Google Sheets step shows 'Connected Account' with your Google email address.
7

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.

  1. 1Click the 'Spreadsheet' dropdown
  2. 2Select your target spreadsheet
  3. 3Choose the worksheet (usually 'Sheet1')
  4. 4Verify the spreadsheet has proper column headers
What you should see: The configuration shows your selected spreadsheet and worksheet with no connection errors.
Common mistake — Make sure your sheet headers exactly match what you'll map in the next step — case sensitive.
8

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.

  1. 1Click '+' between HubSpot and Google Sheets
  2. 2Select 'Run Node.js Code'
  3. 3Delete the default code in the editor
  4. 4Paste the transformation code
What you should see: You should see a code step positioned between HubSpot and Google Sheets in your workflow.
Common mistake — Make sure to reference the correct step name in your code — it might be 'steps.hubspot' or 'steps.hubspot_1'.

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 };
  }
});
9

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.

  1. 1Click in the 'Rows' input field
  2. 2Click 'Use expression' toggle
  3. 3Select your code step from the dropdown
  4. 4Reference the 'transformedRows' property
  5. 5Click 'Save' to confirm the mapping
What you should see: The Rows field shows something like 'steps.code.$return_value.transformedRows' with a green checkmark.
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
10

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.

  1. 1Click 'Test' button at top right
  2. 2Wait for all steps to complete
  3. 3Check each step for green success indicators
  4. 4Open your Google Sheet to verify data
  5. 5Click 'Deploy' to activate the workflow
What you should see: All steps show green checkmarks and your Google Sheet contains the exported contact data.
Common mistake — If the test fails, check that your sheet headers match exactly — 'First Name' vs 'firstname' will cause errors.

Scaling Beyond 500+ contacts per export+ Records

If your volume exceeds 500+ contacts per export records, apply these adjustments.

1

Implement pagination

Loop through HubSpot results using the 'after' parameter. Process contacts in batches of 100 to avoid memory issues.

2

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.

3

Add retry logic

HubSpot and Google APIs can timeout with large datasets. Add try/catch blocks and exponential backoff for failed requests.

4

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 formattingUse Google Sheets rules to highlight new MQLs or high-value contacts based on lifecycle stage.
  • Create summary dashboardBuild a separate sheet with pivot tables showing contact counts by source, stage, and company.
  • Add Slack notificationsSend a daily summary message to your sales channel with the count of new/updated contacts exported.

Related guides

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