n8n + n8n: Auto-Enrich HubSpot Contacts via Hunter.io Daily

Your HubSpot CRM is only as useful as the data inside it. If you're running outbound sequences, sales ops, or account-based campaigns and half your contacts are missing a phone number, job title, or c

n8n + n8n: Auto-Enrich HubSpot Contacts via Hunter.io Daily

Your HubSpot CRM is only as useful as the data inside it. If you're running outbound sequences, sales ops, or account-based campaigns and half your contacts are missing a phone number, job title, or company name — you're burning pipeline on dead ends. The fix isn't a manual enrichment sprint every quarter. It's an automated nightly workflow that finds the gaps and fills them while you sleep.

This article walks through exactly how to build that system using n8n and Hunter.io, triggered every night at 4am. No third-party enrichment services with bloated pricing. No manual exports. Just a workflow that runs silently and keeps your CRM clean.

The Problem: Incomplete Contacts Kill Pipeline Efficiency

CRMs accumulate incomplete records faster than teams can fix them. Contacts come in from form fills without phone numbers, from LinkedIn imports without job titles, from conference lists without company details. Sales reps work around the gaps by guessing or skipping — both of which cost revenue.

The typical workaround is a quarterly enrichment project: export contacts, run through a tool, re-import. This works once. By the time you do it again, six more months of bad data have stacked up. The other workaround is paying for a native HubSpot enrichment add-on, which runs $50–$200/month depending on your tier — for something that should cost almost nothing to automate.

Hunter.io already has the data you need. It indexes professional email addresses, job titles, company domains, and phone numbers across millions of companies. Their API has a generous free tier and affordable paid plans. The only missing piece is the automation layer connecting HubSpot to Hunter.io on a schedule — and that's exactly what this n8n template does.

The Solution: Nightly Enrichment on Autopilot

The workflow runs every night at 4am. It queries HubSpot for contacts that are missing at least one of three fields — company, phone, or job title. For each of those contacts, it calls the Hunter.io People Finder API using the contact's email address. If Hunter.io returns enrichment data, the workflow maps it back to the correct HubSpot fields and updates the contact record. If it finds nothing, the contact is skipped cleanly without any error noise.

The result: every morning, your team opens HubSpot to a CRM that's incrementally more complete than it was the night before. No human effort required after the initial setup.

The workflow is designed to be conservative — it only overwrites fields that are genuinely empty. If a contact already has a job title, Hunter.io's data doesn't replace it. This avoids the common enrichment problem of overwriting verified data with stale or incorrect API responses.

Step-by-Step: How the n8n Workflow Is Built

Here's the architecture of the workflow, node by node, so you understand what's happening and can customize it for your setup.

Node 1 — Schedule Trigger. Uses n8n's built-in Schedule Trigger node. Set the cron expression to 0 4 * * * to fire every day at 4am. You can adjust this to any time that avoids peak usage hours for your HubSpot instance.

Node 2 — HubSpot: Search Contacts with Missing Fields. Uses the HubSpot node with the Search operation on the Contacts object. The filter logic targets contacts where any of the three target properties is empty. In HubSpot's filter syntax, you'll use the NOT_HAS_PROPERTY operator for each of company, phone, and jobtitle, combined with an OR condition. Set a reasonable page limit — 100 contacts per run is a safe starting point that respects both HubSpot's rate limits and Hunter.io's API quotas.

Node 3 — Split in Batches. Add an Split In Batches node set to batch size 1. This ensures each contact is processed individually through the rest of the workflow, preventing a single API failure from killing the entire run.

Node 4 — Hunter.io: Email Finder / People Enrichment. Uses the HTTP Request node to call the Hunter.io API. The endpoint is https://api.hunter.io/v2/email-finder or https://api.hunter.io/v2/people/find depending on whether you're enriching from email or domain. Pass the contact's email address from the previous HubSpot response as a query parameter. Add your Hunter.io API key as a query parameter named api_key — or store it in n8n credentials for cleaner security. The response returns a data object containing position, company, phone_number, and related fields.

Node 5 — IF: Check if Enrichment Data Exists. Add an IF node to check whether Hunter.io returned usable data. The condition checks if {{ $json.data }} exists and is not null. Contacts where Hunter.io returned no results are routed to a No Operation node — they're skipped silently and will be retried in the next nightly run.

Node 6 — Set: Map Fields. For contacts where Hunter.io returned data, use a Set node to build the update payload. Map data.position to jobtitle, data.company to company, and data.phone_number to phone. Use expressions with fallbacks so that if Hunter.io returns a field as empty, the mapped value is also empty — this prevents accidentally writing blank strings to fields that were previously empty.

Node 7 — HubSpot: Update Contact. Uses the HubSpot node with the Update operation on Contacts. Pass the contact ID from the original HubSpot search result and the mapped fields from the Set node. Configure it to only update fields that contain values — the Additional Fields option in the node lets you selectively send only non-empty properties.

Node 8 — (Optional) Slack or Email Notification. Add a summary node at the end of each batch cycle. Log how many contacts were enriched, how many were skipped, and any errors. Send to a Slack channel or email if you want daily visibility without opening the workflow logs.

Benefits Beyond Just Cleaner Data

The immediate benefit is obvious: your CRM has better data. But the downstream effects are worth spelling out explicitly, especially if you're trying to make the case internally for building this.

Outbound sequences stop bouncing on missing fields. Email templates that pull {{contact.jobtitle}} or {{contact.company}} degrade badly when those fields are empty. Personalization tokens show up blank, subject lines fall apart, and open rates drop. Enriched contacts mean sequences run as designed.

Sales qualification improves automatically. Job title is one of the most reliable ICP signals. Contacts who previously had no title — and were therefore invisible to title-based lead scoring — now get scored correctly. Your SQLs get more accurate without anyone changing the scoring model.

List segmentation becomes more reliable. If you're running account-based plays segmented by company size or industry, incomplete company fields break those lists. Every contact enriched is one more contact properly included in the right segment.

Cost is minimal. Hunter.io's free plan includes 25 searches/month. Their Starter plan at $34/month gives 500 searches. For most teams with fewer than 500 new contacts per month, the economics are extremely favorable compared to any native CRM enrichment tool.

Common Pitfalls and How to Avoid Them

Rate limit collisions. HubSpot allows 100 requests per 10 seconds on most plans. Hunter.io enforces its own per-minute limits depending on your plan. Running a batch of 500 contacts without any delay between API calls will hit both. Add a Wait node between the Hunter.io call and the HubSpot update — 1 second is usually sufficient. For large batches, increase to 2–3 seconds to be safe.

Overwriting verified data. If you don't check whether a field already has a value before writing to it, you risk replacing accurate, manually verified data with Hunter.io's response — which may be outdated. The workflow is designed to only target contacts where fields are empty. Don't modify the HubSpot search filter to include contacts with existing data unless you've explicitly decided to run a full re-enrichment pass.

Hunter.io returning wrong matches. Hunter.io matches on email domain and name. For contacts with common names or shared email domains (like @gmail.com), it may return data from the wrong person. For B2B contacts with professional email addresses, accuracy is high. For B2C lists or contacts with personal emails, either skip enrichment or add a validation step that checks if the returned company domain matches the contact's email domain.

Credentials stored insecurely. Don't hardcode your Hunter.io API key directly in the HTTP Request node URL. Use n8n's built-in credential manager for generic API credentials and reference it via the Header Auth or Query Auth option in the HTTP Request node. This keeps keys out of workflow exports and logs.

Silent failures accumulating. If the workflow runs nightly but the HubSpot or Hunter.io connection breaks silently, you won't know until you manually check. Add an error workflow in n8n — go to Settings → Error Workflow — and configure it to send an alert if any execution fails. A Slack message with the error details is enough to catch issues within hours instead of days.

Not monitoring enrichment coverage over time. Track a simple metric: the percentage of active contacts with all three fields filled. Run a HubSpot report on this weekly. If coverage isn't improving, check whether Hunter.io is actually returning data or whether your search filter is misconfigured. The workflow runs silently by design — you still need one external check to confirm it's working as expected.

Auto-Enrich HubSpot Contacts via Hunter.io Daily
PRONTO PARA USAR

Ja construimos isso pra voce

Nao comece do zero. O Auto-Enrich HubSpot Contacts via Hunter.io Daily e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.

Instalar por $39 →