Automate Contact Enrichment with Surfe, Google Sheets & HubSpot

Go to Workflow
132 views
Built by go-surfe go-surfe
Created on June 05, 2026

Description

This template enables fully automated lead enrichment using Surfe’s bulk API. Simply drop a Google Spreadsheet into your Google Drive, and n8n will handle everything — from reading the leads, enriching them in batches, filtering valid data, and pushing results to HubSpot.

1. ❓ What Problem Does This Solve?

Manually enriching contact lists is tedious, error-prone, and doesn’t scale. Whether you’re importing leads from events, marketing forms, or partners, this workflow ensures each record is enriched and synced to your CRM — hands-free.

2. 🧰 Prerequisites

To use this template, you’ll need:

A self-hosted or cloud instance of n8n
A Surfe API Key
A Google Drive and Sheets account (with OAuth or service account)
A HubSpot account with access to create/update contacts (via OAuth or Private App Token)
The workflow JSON file (included with this tutorial)

3. 📌 Input File Format

To run the automation, you must upload a Google Spreadsheet to a specific folder in your Drive.

The spreadsheet must contain the following columns:

first name (required)
last name (required)
Either company name or company domain (at least one is required)
linkedin url (optional)

🛑 Important: Any row missing first name, last name, and both company name and company domain will be ignored automatically by the workflow.

Each row represents a person to enrich.
We recommend including the linkedin url if available, but it's not mandatory.

4. ⚙️ Setup Instructions

4.1 🔐 Create Your Credentials in n8n

4.1.1 📁 Google Drive

To connect Google Drive and Google Sheets in your workflow, you need to authorize n8n via Google OAuth 2.0 using a Client ID and Client Secret from the Google Cloud Console.

📋 Step 1: Create a Google Cloud Project

Visit Google Cloud Console
Create a new project or select an existing one
Navigate to APIs & Services → OAuth consent screen

⚙️ Step 2: Configure the OAuth Consent Screen

Enter the following:
App name (e.g. n8n Integration)
User support email
Choose Audience Type:
Internal if you’re using a Google Workspace account
External if using a personal Gmail account
Under Contact information
email address
Click Save and Continue

🔑 Step 3: Create OAuth Client Credentials

Go to APIs & Services → Credentials
Click + Create Credentials → OAuth Client ID
Select Web application as the application type
Name it (e.g. n8n Google Drive Access)
In Authorized redirect URIs, paste this:

https://oauth.n8n.cloud/oauth2/callback

(Or your self-hosted n8n redirect URI)

Click Create
Copy the Client ID and Client Secret

✅ Step 4: Finish Setup in n8n

In n8n, go to Credentials → Create New → Google Drive / Google Sheets
Choose OAuth2
Paste your:
Client ID
Client Secret
Redirect URL (should match Google Console)
Click Sign in with Google
Authorize access and save the credential



✅ Your Google Drive is now ready to use in workflows.

4.1.2 📊 Google Sheets OAuth2 API

Go to n8n → Credentials
Create new credentials:
Type: Google Sheets OAuth2 API
Here a pop-up will open where you can login to your Google account from where you will read the Google Sheets

When it’s done you should see this on n8n

4.1.3 📧 Gmail OAuth2 API

Go to n8n → Credentials
Create new credentials:
Type: Gmail OAuth2 API
A pop-up window will appear where you can log in with your Google account that is linked to Gmail
Make sure you grant email send permissions when prompted

4.1.4 🚀 Surfe API

In your Surfe dashboard → Use Surfe Api → copy your API key
Go to n8n → Credentials → Create Credential
Choose Credential Type: Bearer Auth
Name it something like SURFE API Key
Paste your API key into the Bearer Token
Save

4.1.5 🎯 HubSpot

🔓 Private App Token

Go to HubSpot → Settings → Integrations → Private Apps
Create an app with scopes:
crm.objects.contacts.read
crm.objects.contacts.write
crm.schemas.contacts.read
Save the App token
Go to n8n → Credentials → Create Credential → HubSpot App Token
Paste your App Token

✅ You are now all set for the credentials

4.2 📥 Import and Configure the N8N Workflow

Import the provided JSON workflow into N8N
Create a New Blank Workflow
click the … on the top left
Import from File

4.2.1 🔗 Link Nodes to Your Credentials

In the workflow, link your newly created credentials to each node of this list :

Google Drive Node -> Credentials to connect with → Google Drive Account
Google Sheets -> Credentials to connect with → Google Sheets Account
Gmail Node Credentials to connect with → Gmail account
Hubspot Node →Credentials to connect with → Gmail account
Surfe HTTP nodes:
Authentication → Generic Credential Type
Generic Auth Type → Bearer Auth
Bearer Auth → Select the credentials you created before






Surfe HTTP nodes

Surfe HTTP nodes

HubSpot node → Credentials to connect with → select your HubSpot credentials in the list

4.2.2 🔧 Additional Setup for the Google Drive Trigger Node

5. 🔄 How This N8N Workflow Works

A new Google Sheet containing a linkedin_url column is added to a specific folder in Google Drive
n8n detects the new file automatically via the Google Drive Trigger
All rows are read and batched in groups of 500 to comply with Surfe’s API limits
Each batch is sent to Surfe’s Bulk Enrichment API
n8n polls Surfe until the enrichment job is complete
It extracts the enriched contact data from Surfe’s response
Only contacts with both email and phone number are kept
These validated leads are pushed to HubSpot
Finally, a Gmail notification is sent to confirm the job is complete

6. 🧩 Use Cases

Post-event contact enrichment** – After a trade show, upload a list of LinkedIn profile URLs from badge scans or lead capture forms
Outbound LinkedIn campaign follow-ups** – Gather LinkedIn URLs from manual outreach and enrich them into usable CRM leads
CRM data enhancement** – Use LinkedIn URLs to fill in missing contact info for existing or imported contacts
List building from LinkedIn exports** – Upload a list of LinkedIn profiles (e.g. from Sales Navigator) and turn them into fully enriched contacts in HubSpot

7. 🛠 Customization Ideas

🔁 Add retry logic for failed Surfe enrichment jobs
📤 Log enriched contacts into a Google Sheet or Airtable
🔍 Add pre-check logic to avoid creating duplicates in HubSpot
📊 Extend the flow to generate a basic summary report of enriched vs rejected contacts

8. ✅ Summary

This workflow turns a basic Google Sheet of LinkedIn URLs into fully enriched, CRM-ready contacts — automatically synced with HubSpot.

Just upload your file.

Let Surfe do the rest.

Nodes Used (5)

Code
n8n-nodes-base.code
Gmail
n8n-nodes-base.gmail
Google Sheets
n8n-nodes-base.googleSheets
HTTP Request
n8n-nodes-base.httpRequest
HubSpot
n8n-nodes-base.hubspot