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

How to Export HubSpot Contacts to Google Sheets with N8n

Automatically export HubSpot contacts matching specific criteria to a Google Sheet on a scheduled basis.

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

Best for

Teams needing custom data transformation or complex filtering when exporting HubSpot contacts to sheets.

Not ideal for

Simple daily exports without custom logic where Zapier's straightforward interface works better.

Sync type

scheduled

Use case type

export

Real-World Example

💡

A 25-person B2B marketing agency uses this to export qualified leads to Google Sheets for their monthly client reports. Before automation, they manually exported contacts and spent 2 hours reformatting data and filtering by lead source. Now the sheet updates automatically every morning with properly formatted contact data, custom property values, and calculated fields showing lead quality scores.

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 n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. 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 account with API access enabled
Google Sheets with target spreadsheet created
N8n instance running (cloud or self-hosted)
Admin permissions in both HubSpot and Google workspace

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email Addressproperties.email.value
First Nameproperties.firstname.value
Last Nameproperties.lastname.value
3 optional fields▸ show
Company Nameproperties.company.value
Lead Statusproperties.hs_lead_status.value
Created Dateproperties.createdate.value

Step-by-Step Setup

1

Editor > + > Triggers > Schedule Trigger

Create New Workflow

Start a new N8n workflow and add a Schedule trigger. This will run your export at regular intervals without manual intervention.

  1. 1Click the '+' button in the top-left corner
  2. 2Select 'Schedule Trigger' from the trigger node list
  3. 3Set the interval to your desired frequency (daily, weekly, etc.)
What you should see: You should see a schedule trigger node with timing options displayed.
2

Schedule Trigger > Parameters

Configure Schedule Settings

Set your export frequency and timing. Most teams run this daily at night to avoid API rate limits during business hours.

  1. 1Select 'Days' from the Mode dropdown
  2. 2Set 'Hour' to a non-business time like 2 AM
  3. 3Choose which days to run the export
What you should see: The schedule should show your selected timing with next execution time preview.
Common mistake — Don't schedule during business hours if you have heavy HubSpot usage - you might hit API limits.
3

Editor > + > Regular Nodes > HubSpot

Add HubSpot Node

Connect to HubSpot to fetch your contacts. You'll need to authenticate and configure the contact search parameters.

  1. 1Click the '+' icon after the Schedule trigger
  2. 2Search for and select 'HubSpot'
  3. 3Choose 'Contact' as the resource
  4. 4Set operation to 'Get Many'
What you should see: HubSpot node appears with resource and operation fields populated.
4

HubSpot Node > Credential

Authenticate HubSpot Connection

Create your HubSpot API connection using either OAuth2 or API key. OAuth2 is more secure for production workflows.

  1. 1Click 'Create New Credential' in the credential dropdown
  2. 2Choose 'HubSpot OAuth2 API' for production or 'HubSpot API Key' for testing
  3. 3Follow the authentication flow to connect your account
What you should see: Green 'Connected' indicator should appear next to the credential field.
Common mistake — API keys expire and lack granular permissions - use OAuth2 for production workflows.
5

HubSpot Node > Additional Fields > Filters

Configure Contact Filters

Set up filters to export only the contacts you need. Use HubSpot's filter criteria to narrow down your export.

  1. 1Scroll to 'Additional Fields' section
  2. 2Toggle 'Filters' to enabled
  3. 3Click 'Add Filter' and select your criteria (e.g. lifecycle stage, lead status)
  4. 4Set the comparison operator and value
What you should see: Filter section shows your configured criteria with property names and values.
Common mistake — Test filters with a small limit first - broad filters can return thousands of contacts and timeout.
Google Sheets
GO
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
HubSpot
HU
notified
6

HubSpot Node > Additional Fields > Properties to Return

Select Contact Properties

Choose which contact fields to export. Only select properties you actually need to keep the payload small and fast.

  1. 1Toggle 'Properties to Return' to enabled
  2. 2Add essential properties like email, firstname, lastname, company
  3. 3Include any custom properties you need in your sheet
What you should see: Properties list shows your selected field names that will be returned.
Common mistake — Don't select all properties - HubSpot has 100+ default fields and will slow your workflow significantly.
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

Editor > + > Data Transformation > Code

Add Data Transformation

Transform the HubSpot data structure for Google Sheets compatibility. This formats dates and flattens nested objects.

  1. 1Add a 'Code' node after HubSpot
  2. 2Select 'JavaScript' as the language
  3. 3Paste transformation code to format the contact data
What you should see: Code node shows JavaScript editor with your transformation logic.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.

Drop this into an n8n Code node.

JavaScript — Code Node// Transform HubSpot nested properties to flat structure
▸ Show code
// Transform HubSpot nested properties to flat structure
const contacts = items.map(item => ({
  email: item.json.properties?.email?.value || '',

... expand to see full code

// Transform HubSpot nested properties to flat structure
const contacts = items.map(item => ({
  email: item.json.properties?.email?.value || '',
  firstname: item.json.properties?.firstname?.value || '',
  lastname: item.json.properties?.lastname?.value || '',
  company: item.json.properties?.company?.value || '',
  created_date: item.json.properties?.createdate?.value?.split('T')[0] || ''
}));

return contacts.map(contact => ({ json: contact }));
8

Editor > + > Productivity > Google Sheets

Add Google Sheets Node

Configure the Google Sheets connection to write your contact data. You'll specify the spreadsheet and how to handle existing data.

  1. 1Click '+' after the Code node
  2. 2Search for and select 'Google Sheets'
  3. 3Set operation to 'Update' or 'Append'
  4. 4Choose your target spreadsheet from the dropdown
What you should see: Google Sheets node displays with operation and spreadsheet selection fields.
Common mistake — Choose 'Update' to replace data or 'Append' to add rows - 'Update' will overwrite your entire sheet.
9

Google Sheets Node > Credential

Authenticate Google Sheets

Connect your Google account to access spreadsheets. The OAuth flow will request permissions for Google Sheets access.

  1. 1Click 'Create New Credential' for Google Sheets
  2. 2Select 'Google OAuth2 API'
  3. 3Complete the Google authentication flow
  4. 4Grant permissions for Google Sheets access
What you should see: Credential shows green connected status and your Google account email.
10

Google Sheets Node > Parameters

Configure Sheet Mapping

Map HubSpot contact properties to Google Sheet columns. Set up column headers and data mapping for each field you want to export.

  1. 1Select your target sheet from the 'Range' dropdown
  2. 2Toggle 'Column Headers' if your first row contains headers
  3. 3Map each HubSpot property to the corresponding sheet column
  4. 4Set 'Value Input Mode' to 'Mapping'
What you should see: Field mapping section shows HubSpot properties matched to sheet columns.
Common mistake — Column order must match your sheet exactly - test with a sample contact first.
11

Toolbar > Execute Workflow

Test the Workflow

Run a test execution to verify data flows correctly from HubSpot to your sheet. Check that filters work and data formats correctly.

  1. 1Click 'Execute Workflow' in the top toolbar
  2. 2Monitor execution progress in each node
  3. 3Verify test data appears correctly in your Google Sheet
  4. 4Check that contact properties mapped to the right columns
What you should see: All nodes show green checkmarks and your sheet contains the exported contact data.
Common mistake — Test executions pull real data - use a test sheet to avoid overwriting production data.
n8n
▶ Run once
executed
Google Sheets
HubSpot
HubSpot
🔔 notification
received
12

Workflow > Active Toggle

Activate Scheduled Export

Enable the workflow to run automatically on your configured schedule. Monitor the first few runs to ensure reliability.

  1. 1Click the toggle switch in the top-right to 'Active'
  2. 2Verify the schedule shows correct next execution time
  3. 3Check execution history after the first scheduled run
What you should see: Workflow status shows 'Active' and next execution timestamp is displayed.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.

Scaling Beyond 1000+ contacts per export+ Records

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

1

Implement Batch Processing

Split large exports into batches of 200-300 contacts each. Use the HubSpot 'limit' parameter and 'after' pagination token to process contacts in chunks instead of pulling everything at once.

2

Add Rate Limit Handling

Insert Wait nodes between API calls and implement exponential backoff. HubSpot's rate limits tighten with high volume, so build in delays of 2-3 seconds between batches to stay under the threshold.

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 N8n for this if you need custom data transformation or have complex filtering requirements. The Code nodes let you reshape HubSpot's nested property structure exactly how you want it. You also get unlimited executions on the self-hosted version, which matters when exporting large contact lists. Skip N8n if you just want a simple daily export with no custom logic - Zapier's HubSpot integration is more straightforward for basic use cases.

Cost

This workflow uses roughly 3-5 executions per run depending on your contact volume and transformation complexity. At one export per day, that's 100-150 executions monthly. The N8n cloud starter plan at $20/month covers 2,500 executions, so you're well within limits. Make would charge $9/month for the same volume, and Zapier's $20 plan handles it easily. N8n costs the same as Zapier but gives you way more execution headroom.

Tradeoffs

Make handles batch operations better - their HubSpot module automatically paginates through large contact lists without custom code. Zapier's interface is cleaner for non-technical users and has better error messaging when things break. But N8n wins on flexibility - you can transform the HubSpot data structure, add custom validation, and handle edge cases that would require multiple steps in other platforms.

You'll hit HubSpot's 100 requests per 10-second rate limit if you export more than 1000 contacts at once. Google Sheets truncates cell values at 50,000 characters, so long text fields get cut off. The HubSpot API returns properties as nested objects like properties.email.value, not flat fields - your transformation code needs to handle this structure or you'll get empty columns.

Ideas for what to build next

  • Add Slack Notifications for New ContactsSend a Slack message when the export finds new contacts that weren't in the previous run, helping sales teams react quickly to new leads.
  • Create Deal Pipeline ExportBuild a companion workflow that exports HubSpot deals to a separate sheet, then use Google Sheets formulas to connect contact and deal data for complete reporting.
  • Implement Data Validation ChecksAdd nodes that validate exported data for missing emails or invalid formats, then send alerts when data quality issues are detected in the export.

Related guides

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