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

How to Import Contacts from Google Sheets to HubSpot with N8n

Automatically create or update HubSpot contacts whenever a new row is added to your Google Sheets spreadsheet.

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

Best for

Teams that need custom data cleaning or transformation before importing contacts from spreadsheets.

Not ideal for

Users who want the fastest setup with minimal configuration and don't need data transformation.

Sync type

polling

Use case type

import

Real-World Example

πŸ’‘

A 25-person B2B marketing agency uses this to import leads from event sign-up sheets into HubSpot. Before automation, their marketing coordinator manually copied 50-100 contacts weekly from Google Forms responses, taking 2 hours and introducing typos. Now the workflow runs automatically and uses N8n's code nodes to standardize company names and split full names into first/last fields.

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.

Google account with access to the contact spreadsheet
HubSpot account with API access (Marketing Hub Starter or higher)
N8n instance running (cloud or self-hosted)
Contact spreadsheet with email column and consistent headers
HubSpot private app created with Contacts read/write permissions

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email Addressemail
5 optional fieldsβ–Έ show
First Namefirstname
Last Namelastname
Company Namecompany
Phone Numberphone
Job Titlejobtitle

Step-by-Step Setup

1

Workflows > New > Add Node > Google Sheets

Create new workflow and add Google Sheets trigger

Start a fresh workflow in N8n and configure it to monitor your contact spreadsheet. The Google Sheets trigger will poll for new rows every few minutes.

  1. 1Click the '+' button to create a new workflow
  2. 2Click 'Add node' then search for 'Google Sheets'
  3. 3Select 'Google Sheets Trigger' from the results
  4. 4Choose 'On Row Added' as the trigger event
βœ“ What you should see: You should see a Google Sheets node with 'On Row Added' selected in the operation dropdown.
n8n
+
click +
search apps
Google Sheets
GO
Google Sheets
Create new workflow and add …
Google Sheets
GO
module added
2

Node Settings > Credentials > Create New

Connect your Google account

Authenticate with Google to give N8n access to your spreadsheets. This creates a reusable credential for future workflows.

  1. 1Click 'Create New' next to the Credential field
  2. 2Select 'Google Sheets OAuth2 API' from the dropdown
  3. 3Click 'Connect my account' and sign in to Google
  4. 4Authorize N8n to access your Google Sheets
  5. 5Click 'Save' to store the credential
βœ“ What you should see: The credential dropdown should show your Google account email with a green checkmark.
⚠
Common mistake β€” Make sure you're signed into the Google account that owns your contact spreadsheet β€” switching accounts later requires recreating the credential.
n8n settings
Connection
Choose a connection…Add
click Add
Google Sheets
Log in to authorize
Authorize n8n
popup window
βœ“
Connected
green checkmark
3

Google Sheets Node > Parameters

Select your contact spreadsheet and worksheet

Point the trigger to your specific contact sheet. N8n needs to know exactly which spreadsheet and tab to monitor for new rows.

  1. 1In the 'Document' dropdown, select your contact spreadsheet
  2. 2Choose the correct worksheet tab from the 'Sheet' dropdown
  3. 3Set 'Trigger On' to 'Row Added'
  4. 4Leave 'Poll Times' at the default unless you need faster checking
βœ“ What you should see: The node should show your spreadsheet name and worksheet tab, with 'Row Added' selected as the trigger type.
⚠
Common mistake β€” Don't select a sheet with existing data β€” the trigger will fire for every existing row on first run.
4

Node > Execute > Fetch Test Event

Test the Google Sheets trigger

Add a test row to verify N8n can read your spreadsheet structure. This also shows you the exact field names for mapping to HubSpot.

  1. 1Add a sample contact row to your Google Sheet
  2. 2Return to N8n and click 'Execute Node' on the Google Sheets trigger
  3. 3Click 'Fetch Test Event' to pull the sample data
  4. 4Review the output to see your column names and data format
βœ“ What you should see: The execution panel should display your test row data with field names matching your Google Sheets column headers.
n8n
β–Ά Run once
executed
βœ“
Google Sheets
βœ“
HubSpot
HubSpot
πŸ”” notification
received
5

Add Node > HubSpot > Contact > Create or Update

Add HubSpot node for contact creation

Connect the HubSpot node to create new contacts from your spreadsheet data. Configure it to handle both new contacts and updates to existing ones.

  1. 1Click the '+' button to add a new node after Google Sheets
  2. 2Search for 'HubSpot' and select it
  3. 3Set 'Resource' to 'Contact'
  4. 4Set 'Operation' to 'Create or Update'
  5. 5This operation will update existing contacts or create new ones
βœ“ What you should see: You should see a HubSpot node connected to Google Sheets with 'Contact' and 'Create or Update' selected.
⚠
Common mistake β€” Use 'Create or Update' not 'Create' β€” pure creation will fail if the email already exists in HubSpot.
6

HubSpot Node > Credentials > Create New

Connect your HubSpot account

Authenticate with HubSpot using your API key or OAuth. The API key method is simpler for most users.

  1. 1Click 'Create New' next to the HubSpot Credential field
  2. 2Select 'HubSpot API Key' from the dropdown
  3. 3Go to HubSpot > Settings > Integrations > Private Apps
  4. 4Copy your API key and paste it into N8n
  5. 5Click 'Save' to store the credential
βœ“ What you should see: The credential field should show 'HubSpot API Key' with a green connection indicator.
⚠
Common mistake β€” Your HubSpot API key needs 'Contacts' read and write permissions β€” check this in your HubSpot private app settings.
7

HubSpot Node > Properties > Email

Map email field for deduplication

Configure the email field first since HubSpot uses it to identify duplicate contacts. This ensures updates work correctly.

  1. 1Scroll to the 'Email' field in the HubSpot node
  2. 2Click the expression editor (gears icon) next to Email
  3. 3Select your email column from the Google Sheets data
  4. 4The expression should look like {{ $json.Email }} or similar
βœ“ What you should see: The Email field should show an expression pulling from your Google Sheets email column.
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
8

HubSpot Node > Properties > Add Property

Map contact fields from spreadsheet

Connect your Google Sheets columns to HubSpot contact properties. Focus on the essential fields first, then add others as needed.

  1. 1Click 'Add Property' to map additional fields
  2. 2Select 'First Name' and map it to your first name column
  3. 3Add 'Last Name' and map to your last name column
  4. 4Add 'Company' if you have company data in your sheet
  5. 5Map any other relevant fields like phone, title, or custom properties
βœ“ What you should see: You should see multiple property mappings, each pulling data from different Google Sheets columns.
⚠
Common mistake β€” HubSpot property names are case-sensitive β€” use 'firstname' not 'First Name' for standard properties.
9

Workflow > Execute Workflow

Test the complete workflow

Run the full workflow to verify data flows correctly from Google Sheets to HubSpot. Check both the N8n execution and your HubSpot contacts.

  1. 1Click 'Execute Workflow' in the top toolbar
  2. 2Watch each node execute and check for any error messages
  3. 3Review the HubSpot node output to confirm success
  4. 4Check your HubSpot contacts list for the new/updated contact
βœ“ What you should see: Both nodes should show green checkmarks, and you should see a new or updated contact in HubSpot with the correct field values.
⚠
Common mistake β€” If you see a 429 error, HubSpot is rate limiting β€” add a 2-second delay between requests for bulk imports.
10

Workflow > Toggle Active > Settings

Activate the workflow

Turn on the workflow to start monitoring your Google Sheet for new contacts. Set a reasonable polling interval to balance responsiveness with API usage.

  1. 1Click the toggle switch next to 'Inactive' at the top
  2. 2The workflow status should change to 'Active'
  3. 3Click the workflow settings gear icon
  4. 4Set 'Timezone' to match your business hours
  5. 5Save the workflow with a descriptive name
βœ“ What you should see: The workflow should show 'Active' status with a green indicator, and begin polling your Google Sheet automatically.

Drop this into an n8n Code node.

JavaScript β€” Code Node// Clean phone numbers to match HubSpot format
β–Έ Show code
// Clean phone numbers to match HubSpot format
if ($json.phone) {
  const cleaned = $json.phone.replace(/[^\d]/g, '');

... expand to see full code

// Clean phone numbers to match HubSpot format
if ($json.phone) {
  const cleaned = $json.phone.replace(/[^\d]/g, '');
  $json.phone = cleaned.length === 10 ? `+1${cleaned}` : `+${cleaned}`;
}
return $json;

Scaling Beyond 100+ contacts/day+ Records

If your volume exceeds 100+ contacts/day records, apply these adjustments.

1

Add batch processing

Use Split in Batches node to process contacts in groups of 10-20. This prevents timeouts and makes error handling more manageable when large imports fail partway through.

2

Implement delay between requests

Add a Wait node set to 2-3 seconds between batches to stay under HubSpot's rate limits. Without delays, you'll hit 429 errors around contact 50-60 in bulk imports.

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 deduplication rules. N8n's code nodes let you clean messy spreadsheet data before it hits HubSpot β€” think splitting full names, formatting phone numbers, or mapping company domains to industries. The open-source version handles this workflow completely free. Skip N8n if you want the simplest possible setup β€” Zapier connects these apps in 3 clicks versus N8n's 10+ configuration steps.

Cost

This workflow uses 1 execution per new row. At 200 contacts/month, that's 200 executions total. N8n Cloud's Starter plan ($20/month) includes 5,000 executions, so you're well covered. Zapier's Professional plan ($49/month) handles the same volume but charges $0.30 per task over 2,000. Make's Core plan ($10/month) gives you 10,000 operations monthly. N8n Cloud costs twice as much as Make but half of Zapier's price.

Tradeoffs

Zapier wins on setup speed β€” their Google Sheets to HubSpot Zap configures in under 5 minutes with smart field suggestions. Make offers better error handling with automatic retry logic and clearer execution logs when contacts fail to import. But N8n gives you the most control over data transformation. You can write JavaScript to handle edge cases that break other platforms, like contacts with multiple email addresses or company names that need standardization.

Google Sheets API has a 5-minute delay before N8n sees new rows β€” don't expect instant imports. HubSpot's rate limit kicks in at 100 requests per 10 seconds, so bulk imports need throttling or they'll fail halfway through. Phone number formatting is tricky since HubSpot expects specific formats but spreadsheets rarely match β€” you'll need a code node to clean them. Watch for duplicate email detection issues when your sheet has multiple rows for the same person with different data.

Ideas for what to build next

  • β†’
    Add Slack notifications for new contacts β€” Connect a Slack node after HubSpot to notify your sales team when high-value contacts are imported based on company size or title.
  • β†’
    Create follow-up email sequences β€” Add contacts to specific HubSpot email workflows based on lead source or other spreadsheet data to trigger personalized nurture sequences.
  • β†’
    Set up contact scoring automation β€” Use additional HubSpot nodes to assign lead scores based on spreadsheet data like company size, industry, or job title for better sales prioritization.

Related guides

Was this guide helpful?
← Google Sheets + HubSpot overviewn8n profile β†’