TL;DR
- Clean in this order: duplicates → properties → lifecycle stages → associations → integrations → prevention.
- HubSpot automatically deduplicates contacts by email and companies by domain on all plans (HubSpot KB).
- The duplicates manager needs a Professional or Enterprise subscription (up to 10,000 pairs). Bulk management needs Data Hub Professional (30,000 pairs) or Enterprise (100,000) (HubSpot KB).
- Most "dirty data" is created by integrations and forms. Fix the source, or the mess comes back next month.
Why reports start lying
A pipeline report says revenue is up 20%, but half the deals are duplicates created by a sync. A lifecycle funnel shows hundreds of "Leads" who are long-time customers. A segment misses half your buyers because "Industry" has 14 spellings of "Manufacturing".
None of this is a reporting problem. It's a data problem. Fix it in a fixed order, because each step makes the next one easier.
Before you start
- Export a backup of contacts, companies and deals.
- Freeze changes to integrations and imports during the cleanup window.
- List every system that writes to HubSpot: forms, imports, Make/n8n scenarios, native integrations and custom code.
- Agree on owners. Who decides what "Industry" values are allowed? Who approves merges?
Step 1 — Duplicates
What HubSpot already does for you (all plans)
According to HubSpot's KB (source):
- Contacts are deduplicated by email address. Manual creation with an existing email is blocked; form submissions and imports with an existing email update the existing contact.
- Companies are deduplicated by company domain name.
- Record IDs can be used to deduplicate contacts, companies, deals, tickets, products, admin-activated objects and custom objects. For imports, include the Record ID or a custom property that requires unique values.
What you need a paid tier for
The duplicates manager (source):
- Professional or Enterprise: review and resolve individual duplicates, with up to 10,000 duplicate pairs shown.
- Data Hub Professional: bulk management, with up to 30,000 pairs. Data Hub Enterprise: up to 100,000 pairs.
- HubSpot compares records as they're created, and checks once daily if no records were created that day.
- By default, contacts are matched on first name, last name, email, IP country, phone, zip code and company name. Companies are matched on domain, name, country/region, phone and industry. You can also create custom rules.
- To use it you need Data quality tools access plus the right edit permissions, or Super Admin.
Checklist
- Review duplicate pairs, contacts first, then companies.
- Decide merge rules before merging (which record "wins").
- For deals and custom objects, find duplicates by the source system ID and merge or archive.
- Note which integration created each duplicate, because that's your prevention list.
Step 2 — Properties
Custom properties count against CRM data limits, which depend on your subscription (HubSpot KB — CRM data limits).
- Export the property list for contacts, companies and deals.
- Flag properties with no values or no recent updates. Ask the owner before you delete anything.
- Find near-duplicates ("Industry", "industry_2", "Company Industry").
- Convert free-text fields used for segmentation into dropdowns with controlled values.
- Standardise existing values (bulk edit or a re-import keyed on Record ID).
- Document each property: purpose, owner, which system writes to it.
Step 3 — Lifecycle stages
- Write a one-line definition of each stage your team uses.
- Check which forms set a lifecycle stage. HubSpot forms can update lifecycle stage on submission, but can't move a record backwards. A stage set on a form overrides the default lifecycle stage in your settings (HubSpot KB — forms).
- Find impossible combinations (for example, "Customer" with no closed-won deal) and fix them in a controlled list.
- Make sure only one mechanism moves each stage: a form, a workflow or an integration, never all three.
Step 4 — Associations
Unassociated records break reporting: deals without companies, contacts without companies, tickets without contacts.
- Build saved views for deals with no associated company and contacts with no company.
- Fix in bulk where a rule exists (for example, email domain → company domain).
- If you need to describe how records relate (billing contact, decision maker), consider association labels on Professional or Enterprise (HubSpot KB — CRM data limits).
- For API-driven fixes, use the associations API (HubSpot Developers).
Step 5 — Integrations (the usual culprit)
For each system that writes to HubSpot, check:
- Does it store the source system's ID in a unique property? Without one, every retry risks a duplicate.
- Does it create or upsert? HubSpot's batch upsert creates missing records and updates existing ones, keyed on a unique identifier property (HubSpot Developers).
- Which properties does it own? Two tools writing the same field means flip-flopping values.
- What happens on failure? Are errors logged and alerted, or silently dropped?
My rule for integrations: no sync goes live without a unique source ID property and an upsert-style write. It's the cheapest duplicate prevention there is.
Step 6 — Prevention
- Forms: use dropdowns, not free text, for anything you segment on. Use hidden fields to capture UTMs and source data (HubSpot KB — hidden fields).
- Imports: require a Record ID or unique property column for updates.
- Permissions: limit who can create properties.
- Monthly review: duplicates manager queue, new properties, integration error logs.
- Quarterly: re-run this checklist, lightly.
How long does it take?
It depends on record volume, the number of integrations and how many properties nobody owns. A small portal with one or two integrations can often get through Steps 1–4 quickly. A portal with years of imports and several syncs needs a scoped audit first.
When I build a CRM structure from scratch (pipelines, deal stages, lead flow, qualification workflows), I design for Steps 2–6 on day one. Prevention is far cheaper than cleanup.
Sources
- HubSpot KB — Deduplication of records: https://knowledge.hubspot.com/records/deduplication-of-records
- HubSpot KB — Manage duplicate records: https://knowledge.hubspot.com/records/manage-duplicate-records
- HubSpot KB — Track CRM data limits: https://knowledge.hubspot.com/data-management/track-crm-data-limits
- HubSpot KB — Create and edit forms (lifecycle stage on submission): https://knowledge.hubspot.com/forms/create-and-edit-forms
- HubSpot KB — Hidden form fields: https://knowledge.hubspot.com/forms/pass-contact-property-values-with-hidden-form-fields
- HubSpot Developers — Associations API: https://developers.hubspot.com/docs/api-reference/latest/crm/associations/associate-records/guide
- HubSpot Developers — Custom objects API (upsert): https://developers.hubspot.com/docs/api-reference/latest/crm/objects/custom-objects/guide
FAQ
Does HubSpot remove duplicates automatically? On all plans, it deduplicates contacts by email address and companies by domain name. Other duplicates need the duplicates manager or Record ID-based imports.
Which plan do I need to merge duplicates in bulk? Data Hub Professional (up to 30,000 pairs) or Enterprise (up to 100,000 pairs).
Can a form move a customer back to "Lead"? No. HubSpot forms can't move a record's lifecycle stage backwards.
How often should I clean HubSpot data? Do a light monthly review of duplicates, new properties and integration errors, and a fuller pass quarterly.