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.
![image.png]()
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
- Click Save and Continue
![image.png]()
🔑 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
![image.png]()
✅ 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
![image.png]()
4.1.3 📧 Gmail OAuth2 API
- Go to n8n → Credentials
- Create new credentials:
- 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
![image.png]()
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
![image.png]()
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
![image.png]()
![image.png]()
![image.png]()
✅ 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
![image.png]()
![image.png]()
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
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
![image.png]()
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.