HubSpot + Google Sheets: enrich buying groups fast
New deal comes in. Everyone’s excited. Then, two weeks later, you realize you’ve been selling to one champion while the real decision-makers never even got a first email. That’s how buying groups quietly kill pipeline.
This is the kind of mess RevOps gets blamed for, but Sales managers and founders feel it too. With HubSpot buying groups automation, you stop guessing who matters and start building complete stakeholder maps the moment a deal appears.
This workflow pulls your buying-group rules from Google Sheets, finds matching people at the company, enriches their details, writes them into HubSpot, and emails your team a clean summary with links. You’ll see what it does, what you need, and how it fits into a real sales motion.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: HubSpot + Google Sheets: enrich buying groups fast
flowchart LR
subgraph sg0["HubSpot Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Search People in Companies"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare JSON Payload Enrichm.."]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Surfe check enrichement status"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is enrichment complete ?", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Wait 3 secondes", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract list of peoples from.."]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter: phone AND email", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>HubSpot: Create or Update"]
n8@{ icon: "mdi:message-outline", form: "rounded", label: "Gmail", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>prepare JSON PAYLAOD for Per.."]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>HubSpot Trigger"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>GET deal associated companie.."]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>extract companyDomains"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Surfe Bulk Enrichments API"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>HubSpot get deal"]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>HubSpot Get Company"]
n19@{ icon: "mdi:database", form: "rounded", label: "Google Sheets READ CRITERIAS", pos: "b", h: 48 }
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>extract deal info"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>prepare email content"]
n14 --> n10
n15 --> n21
n11 --> n12
n11 --> n17
n4 --> n2
n17 --> n20
n20 --> n15
n18 --> n19
n18 --> n13
n21 --> n8
n13 --> n14
n6 --> n7
n3 --> n5
n3 --> n4
n7 --> n15
n0 --> n1
n16 --> n2
n19 --> n14
n2 --> n3
n10 --> n0
n1 --> n16
n12 --> n18
n5 --> n6
end
subgraph sg1["When clicking ‘Execute workflow’ Flow"]
direction LR
n9@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n11,n9 trigger
class n3,n6 decision
class n19 database
class n0,n2,n12,n16 api
class n1,n5,n10,n13,n20,n21 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n5,n7,n10,n11,n12,n13,n14,n15,n16,n17,n18,n20,n21 customIcon
The Problem: Deals Open Without the Full Buying Group
In HubSpot, a deal can look “real” with just one contact attached. That’s the trap. Reps move fast, log the first call, and push the deal forward, but nobody has time to hunt down the VP, the budget owner, the security reviewer, and the day-to-day users across departments. So the deal stalls at procurement, or disappears when an unseen stakeholder vetoes it. Worse, the CRM stays incomplete, which means forecasting and handoffs become a guessing game. Honestly, it’s exhausting doing “detective work” for every opportunity.
The friction compounds. Here’s where it breaks down most often:
- Reps rely on memory and LinkedIn tabs, so buying group discovery happens inconsistently across the team.
- Criteria like department, seniority, and country live in someone’s head instead of a shared, editable system.
- Contact enrichment gets skipped because it’s a separate task, which means follow-ups go out with missing phone numbers or no verified email.
- By the time you realize key stakeholders are missing, the deal has already lost momentum.
The Solution: Auto-Discover and Enrich Stakeholders on Deal Creation
This workflow starts the moment a new HubSpot deal is created. It looks up the company (or companies) associated with that deal, extracts the company domain, and combines it with buying group rules you maintain in Google Sheets. Those rules can include departments, seniorities, ISO country codes, and job title keywords. With the domain plus your criteria, the workflow searches for matching people through Surfe’s People Search API, submits a bulk enrichment job, then checks progress until results are ready. Once the data is back, it filters out unusable records (so you don’t pollute HubSpot with empty contacts), upserts the good contacts into HubSpot, and emails your team a tidy summary table with direct HubSpot links.
The workflow begins with the HubSpot deal trigger and pulls the company context. Then it reads and cleans your criteria in Google Sheets, searches and enriches contacts through Surfe, and finally updates HubSpot plus sends a Gmail notification your team can act on immediately.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team opens 10 new HubSpot deals a week. Manually, a rep might spend about 30 minutes per deal searching LinkedIn, finding likely stakeholders, and copying details into HubSpot, which is roughly 5 hours weekly (and that’s on a “good” week). With this workflow, the rep does nothing beyond creating the deal; enrichment runs in the background, typically taking a few minutes plus waiting for the bulk job to complete. The result is an inbox-ready table of stakeholders with direct HubSpot links, and you just got most of that 5 hours back.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HubSpot to trigger deals and upsert contacts.
- Google Sheets to store buying group criteria rules.
- Surfe API key (get it from your Surfe dashboard).
- Gmail to send the stakeholder summary email.
Skill level: Intermediate. You’ll connect credentials, paste a Google Sheet URL, and confirm HubSpot permissions.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new HubSpot deal is created. The HubSpot deal trigger kicks off the automation, then pulls the deal record so the workflow has the right company context.
Company details and your rules get combined. The workflow fetches associated companies, extracts the company domain, and reads your “Your Buying Group Criterias” tab in Google Sheets. Departments, seniorities, countries, and job title keywords are cleaned up so the search payload is consistent.
Surfe finds people, then enriches them. n8n submits a people search request, builds a bulk enrichment payload, and waits/polls until the enrichment job is done. If Surfe isn’t ready yet, the workflow pauses briefly and checks again.
HubSpot gets updated and your team gets notified. Only contacts with at least one usable email or phone number are upserted into HubSpot. Then Gmail sends a summary with a one-glance table and direct links, so reps can take action without digging.
You can easily modify the Google Sheets criteria to target different roles or regions based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the HubSpot Deal Trigger
Set the workflow to start when a new HubSpot deal is created and branch into company lookup and deal retrieval.
- Add and open HubSpot Deal Trigger.
- Set the event to deal.creation (already configured in eventsUi).
- Credential Required: Connect your hubspotDeveloperApi credentials.
- Confirm parallel flow: HubSpot Deal Trigger outputs to both Fetch Deal Companies and Retrieve Deal Record in parallel.
⚠️ Common Pitfall: If the HubSpot app is not subscribed to “Deal creation” events, the trigger won’t fire.
Step 2: Connect Google Sheets for Buying Group Criteria
Pull buying group criteria from a Google Sheet to guide the people search.
- Open Read Criteria Sheet.
- Set Document to
https://docs.google.com/spreadsheets/d/[YOUR_ID]. - Set Sheet Name to
gid=0and confirm the cached nameYour Buying Group Criterias. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
⚠️ Common Pitfall: If the sheet has empty columns for departments, job titles, seniorities, or countries, your search payload may be too broad.
Step 3: Set Up Company and Deal Data Retrieval
Retrieve the associated company and deal details, then merge company domains with criteria.
- Open Fetch Deal Companies and verify the URL is
=https://api.hubapi.com/crm/v3/objects/deals/{{ $json.dealId }}/associations/companies. - Credential Required: Connect your hubspotOAuth2Api credentials in Fetch Deal Companies.
- Open Retrieve Company Record and ensure Company ID is
={{ $json.results[0].id }}. - Credential Required: Connect your hubspotAppToken credentials in Retrieve Company Record.
- Open Retrieve Deal Record and confirm Deal ID is
={{ $json.dealId }}. - Credential Required: Connect your hubspotAppToken credentials in Retrieve Deal Record.
- Keep the parallel branch from Retrieve Company Record to both Read Criteria Sheet and Extract Company Domains (runs simultaneously).
Step 4: Build the Enrichment Search and Payload
Merge criteria and domains, then generate and submit the Surfe search and enrichment payloads.
- Ensure Read Criteria Sheet and Extract Company Domains feed into Combine Criteria Streams.
- Open Compose People Search Payload and keep the code that deduplicates departments, jobTitles, seniorities, countries, and domains.
- Open Find People at Firms and set URL to
https://api.surfe.com/v2/people/searchwith MethodPOST. - Set JSON Body to
={{ $json }}in Find People at Firms. - Credential Required: Connect your httpBearerAuth credentials in Find People at Firms.
- Open Build Enrichment Payload and keep the include options for email, mobile, and jobHistory.
- Open Submit Bulk Enrichment and set URL to
https://api.surfe.com/v2/people/enrichwith JSON Body={{ $json }}. - Credential Required: Connect your httpBearerAuth credentials in Submit Bulk Enrichment.
Tip: If Surfe returns no results, check that Compose People Search Payload receives both the criteria and companyDomains arrays.
Step 5: Configure Enrichment Status Loop and Contact Filtering
Poll Surfe for enrichment completion, parse the list, and filter for contacts with email or phone.
- Open Check Enrichment Progress and set URL to
=https://api.surfe.com/v2/people/enrich/{{ $json.enrichmentID }}. - Credential Required: Connect your httpBearerAuth credentials in Check Enrichment Progress.
- In Enrichment Done?, keep the condition Left Value
={{ $json.status }}equalsCOMPLETED. - Ensure the false branch goes to Pause 3 Seconds, and the success branch goes to Parse Enriched People List.
- Open Pause 3 Seconds and set Amount to
3. - Verify Filter Phone or Email checks
={{ $json.phone }}OR={{ $json.email }}with notEmpty operators.
⚠️ Common Pitfall: If Parse Enriched People List outputs empty fields, the filter will block all contacts.
Step 6: Configure HubSpot Upsert and Email Summary
Push enriched contacts into HubSpot, merge with deal details, and send a summary email.
- Open HubSpot Upsert Contact and set Email to
={{ $json.email }}. - Map additional fields in HubSpot Upsert Contact (e.g., Job Title to
={{ $json.jobTitle }}, Company Name to={{ $json.companyName }}). - Credential Required: Connect your hubspotAppToken credentials in HubSpot Upsert Contact.
- Ensure HubSpot Upsert Contact and Parse Deal Details merge in Combine Deal and Contacts.
- Open Compose Email Summary to confirm the subject is
New Enriched Contacts Added to Your HubSpot Deal. - Open Send Gmail Notification and set Send To to
[YOUR_EMAIL], Subject to={{ $json.subject }}, and Message to={{ $json.message }}. - Credential Required: Connect your gmailOAuth2 credentials in Send Gmail Notification.
Tip: Keep Send Gmail Notification set to execute once to avoid multiple emails per workflow run.
Step 7: Test and Activate Your Workflow
Run a manual test, confirm contacts are enriched and written to HubSpot, then activate the workflow.
- Click Execute Workflow and trigger a test deal creation in HubSpot.
- Verify the polling loop: Submit Bulk Enrichment → Check Enrichment Progress → Enrichment Done? → Parse Enriched People List.
- Check that HubSpot Upsert Contact creates or updates contacts for records that pass Filter Phone or Email.
- Confirm you receive the email from Send Gmail Notification with the HTML table summary.
- Toggle the workflow to Active to run automatically on new deals.
Common Gotchas
- HubSpot credentials can fail because scopes aren’t right for contacts or the trigger app is tied to the wrong account. Check your HubSpot Private App scopes and the n8n credential selection on the HubSpot nodes first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Surfe API calls can hit limits or return partial data if your criteria are too broad. Tighten job title keywords in Google Sheets, and confirm your Surfe key is valid in the HTTP Request nodes.
Frequently Asked Questions
About 45 minutes once your HubSpot, Google Sheets, Surfe, and Gmail accounts are ready.
No. You’ll mostly connect credentials and paste your Google Sheet URL. There are a few code nodes in the template, but you don’t need to edit them to get value.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Surfe API costs based on your search and enrichment usage.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s mostly a Google Sheets change. Update countries (ISO Alpha-2 codes), job title keywords, departments, or seniorities in the “Your Buying Group Criterias” tab, and the workflow will pick it up on the next deal. If you want different rules per pipeline or deal stage, you can adjust the HubSpot trigger logic and the criteria parsing code nodes to branch by pipeline, stage, or deal amount.
Usually it’s a permissions issue or a credential mismatch. Confirm the HubSpot Private App token has contacts read/write scopes, and that the HubSpot Trigger node is connected to the correct developer/public app credential. Also check that the deal actually has an associated company; without a company domain, the people search will return nothing and it can look like HubSpot is the problem.
Surfe People Search is limited to 200 people per run in this workflow, and n8n throughput depends on your plan or server.
Often, yes, because this flow needs polling, filtering, merging streams, and bulk upserts, and those get clunky (and pricey) in simpler automation tools. n8n handles branching and code-based transformations cleanly, which matters when your criteria sheet evolves and you don’t want to rebuild the whole thing. Another advantage is self-hosting, so you can run higher volume without paying per tiny step. That said, Zapier or Make can be fine if you only need a lightweight alert and a single enrichment call. Talk to an automation expert if you want help picking the right approach.
Once this is running, every new deal starts with a fuller map of who matters. Your CRM stays cleaner, and your reps spend their time on outreach instead of contact scavenger hunts.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.