HubSpot duplicate contacts automatisch opschonen
3 workflows, 1 Google Sheet, klaar. Zo clean je dubbele contacts in HubSpot zonder handmatig werk.
HubSpot duplicate contacts automatisch opschonen
Je hebt 5 records voor dezelfde persoon, en sales belt 3x hetzelfde bedrijf.
Awkward, en niet professioneel.
Stop met handmatig mergen en automatiseer het proces.
Het probleem
Scenario 1: jan.jansen@bedrijf.nl submit form → Contact aangemaakt
Scenario 2: Sales import CSV met j.jansen@bedrijf.nl → Nieuw contact
Scenario 3: Jan klikt email, nieuwe cookie → Nog een contact
Resultaat: 3 Jan Jansens, en niemand weet welke de echte is.
Waarom duplicates ontstaan
HubSpot matcht op email, maar dat gaat vaak mis:
Verschillende email formats:
Dit is allemaal dezelfde persoon, maar HubSpot ziet 3 aparte contacts.
Domain aliases:
Dit is dezelfde inbox, maar HubSpot ziet 2 aparte contacts.
Typos in imports:
Cookie tracking duplicates:
- Unknown visitor submit form
- HubSpot maakt contact zonder email
- Later: zelfde persoon submit met email
- Result: 2 contacts
De HubSpot oplossing
Stap 1: Activeer duplicate management
Settings → Data Management → Duplicates
Enable:
- ✓ Automatic duplicate detection for contacts
- ✓ Merge contacts based on email
- ✓ Keep most recently updated contact as primary
Rules:
IF Email is exactly the same (case-insensitive)
THEN Flag as potential duplicate
HubSpot detecteert nu duplicates automatisch.
Maar: merget niet automatisch. Je moet nog handmatig.
Stap 2: Workflow voor auto-merge
Settings → Workflows → Create workflow
Name: “Auto-merge duplicate contacts”
Trigger: Contact created
Enrollment settings:
- Re-enrollment: Ja (elke keer als contact wordt geüpdatet)
Actions:
Action 1: Check for duplicates
IF Contact > Duplicate contact exists = Yes
AND Contact > Is merged = No
AND Contact > Create date is less than 24 hours ago
THEN Continue to next action
ELSE
Stop workflow
Action 2: Merge logic
HubSpot heeft geen native “merge” workflow actie. Maar je kunt:
Optie A: Use Operations Hub (Pro+)
Action: Use merge contacts API
Merge this contact INTO oldest contact with same email
Keep: All properties from newest record
Keep: All activities from both records
Optie B: Flag for manual review
Action: Create task
Title: Duplicate contact - merge needed
Description: Contact {{contact.email}} has duplicate. Review and merge.
Assigned to: Data operations owner
Due date: 1 day
Priority: High
Optie C: Use Insycle integration (recommended)
- Insycle heeft native HubSpot duplicate merge
- Meer control over merge logic
- Kan automatisch mergen op criteria
Stap 3: Prevent duplicates from forms
Problem: Form submit met bestaand email → soms toch duplicate
Solution: Form submission workflow
Settings → Workflows → Create workflow
Name: “Form: Check for existing contact”
Trigger: Form submission (any form)
Actions:
IF Contact with email {{email}} exists
THEN
- Update existing contact (don't create new)
- Append form data to existing properties
- Add note: "Re-submitted form on {{current_date}}"
ELSE
- Create contact (default behavior)
HubSpot doet dit meestal automatisch. Maar bij API imports of integrations kan het misgaan.
Explicit check:
Action: If/then branch
Branch 1: Email already exists in database
→ Update contact property "form_resubmit_count" +1
→ Send internal notification: "Known contact re-engaged"
Branch 2: Email is new
→ Set property "first_form_submit" = form name
→ Continue normal flow
Stap 4: Import validatie
Problem: CSV imports zijn #1 bron van duplicates
Solution: Pre-import workflow
Before je import doet:
-
Export existing contacts: Download all emails from HubSpot
-
VLOOKUP in Excel/Sheets:
=VLOOKUP(A2, ExistingContacts!A:A, 1, FALSE)
Als match → don’t import, update instead.
- Split import file:
- File 1: New contacts (no match)
- File 2: Updates (matched emails)
Import File 1: Create contacts
Import File 2: Update existing contacts (match on email)
In HubSpot import:
- Column mapping: Email → Email (for matching)
- Update existing records: YES
- Create new if not found: NO (for update file)
Stap 5: Deduplication workflow voor bestaande data
Settings → Workflows → Create workflow
Name: “Weekly duplicate cleanup”
Trigger: Contact last modified date is within last 7 days
Actions:
IF Duplicate contact exists = Yes
AND This contact is NOT the primary record
THEN
- Create task for data team: "Merge duplicate: {{contact.email}}"
- Add to list: "Duplicates to merge"
- Send daily digest email to ops team
Daily digest email:
Subject: Daily duplicate report - {{count_in_list}} contacts to merge
Body:
{{count_in_list}} duplicate contacts detected this week.
View list: [Link to "Duplicates to merge" list]
Common duplicates:
- {{top_5_duplicate_emails}}
Merge in bulk: [Instructions]
Stap 6: Bulk merge in HubSpot
Contacts → Lists → Create list
Name: “Duplicates to merge”
Filters:
- Duplicate contact exists = Yes
- Is merged = No
Actions on list:
-
Review duplicates: Click on each contact → “View duplicates”
-
Merge in bulk:
- Select all duplicates (max 100 at a time)
- Actions → Merge contacts
- Choose primary record (usually: most recent activity)
- Merge
Merge logic:
- Primary: Contact with most properties filled
- Keep: All activities from both records
- Keep: All deal associations
- Merge: Lists, workflows, sequences
Stap 7: Advanced - Domain-based duplicate detection
Problem: jan@bedrijf.nl en info@bedrijf.nl = different people, same company
But sometimes: sales@bedrijf.nl submit form 2x with different names → duplicate
Solution: Company-level deduplication
Workflow: “Check for company duplicates”
Trigger: Contact created with company
IF Company > Domain = {{known_domain}}
AND Contact > Job title is similar to existing contact
AND Contact > First name is similar (Levenshtein distance < 3)
THEN Flag as potential duplicate
Example:
Contact 1: Jan Jansen, VP Sales, jan@bedrijf.nl
Contact 2: J. Jansen, VP of Sales, j.jansen@bedrijf.nl
Likely same person → flag for review
Prevention workflows
Workflow 1: Normalize email format
Problem: JAN.JANSEN@BEDRIJF.NL vs jan.jansen@bedrijf.nl
Solution: Auto-lowercase
Trigger: Contact created or email changed
Action:
- Set property "email" = LOWERCASE({{contact.email}})
- Set property "email_domain" = DOMAIN({{contact.email}})
HubSpot’s email property is case-insensitive, but explicit normalization helps.
Workflow 2: Detect role-based emails
Problem: info@, contact@, sales@ = not real persons
Solution: Flag generic emails
Trigger: Contact created
IF Email starts with: info@, contact@, admin@, sales@, support@, hello@
THEN
- Set property "email_type" = "Generic"
- Set lifecycle stage = "Other"
- Do NOT assign to sales
- Add note: "Generic email - find decision maker"
ELSE
- Set property "email_type" = "Personal"
- Continue normal flow
Workflow 3: Cookie-based duplicate prevention
Problem: Unknown visitor becomes contact later → duplicate
Solution: Associate activities to email when known
Trigger: Form submission with known email
Action:
- Search for contacts with same cookie/session ID
- IF found AND email is unknown
THEN Merge with this contact (email known)
- ELSE Create new contact
HubSpot does this automatically in most cases. But explicit workflow helps catch edge cases.
Monitoring & reporting
Dashboard widget 1: Duplicate count
Metric: Count of contacts where “Duplicate exists” = Yes
Goal: <5% of total contacts
If >10% → serious data quality issue.
Dashboard widget 2: Weekly new duplicates
Metric: Contacts with duplicates created this week
Breakdown: By source (Form, Import, Integration, Manual)
Identify root cause:
- High duplicates from imports → improve import process
- High duplicates from forms → check form-to-contact workflow
- High duplicates from API → check integration settings
Dashboard widget 3: Merge velocity
Metric: Contacts merged this week
Target: Merge rate > New duplicate rate
If duplicates growing faster than merging → you’re losing the battle.
Tools voor bulk deduplication
Insycle
- Native HubSpot integration
- Auto-merge based on rules
- Bulk operations (1000s at once)
- Cost: ~$50/month
Setup in Insycle:
- Connect HubSpot
- Create template: “Merge contacts by email”
- Rules:
- Match on: Email (exact)
- Primary: Most recently modified
- Keep all: Activities, deals, notes
- Schedule: Run daily at 2 AM
Dedupely
- HubSpot marketplace app
- Visual duplicate detection
- Smart merge suggestions
- Cost: ~$30/month
HubSpot Operations Hub
- Native duplicate merge API
- Workflow actions for merge
- Cost: Included in Ops Hub Pro ($800/month)
Only worth it if: You’re already using Ops Hub for other automations.
Klaar
Je hebt nu:
- Duplicate detection workflows
- Auto-merge logic (or flagging for manual review)
- Prevention workflows for forms/imports
- Monitoring dashboard
Duplicates reduced by 80%+ in first month.
Volgende stap:
- Run bulk merge on existing duplicates (one-time cleanup)
- Activate prevention workflows
- Monitor weekly duplicate count
- Adjust merge rules based on false positives
Sales belt nu dezelfde persoon 1x. Niet 3x.