How to fix duplicate leads, contacts and accounts in your CRM
Duplicate records come from having several ways for data to enter the CRM and no shared rule for matching it. Fixing them takes two jobs: a one-time cleanup that merges what already exists, and matching rules at every entry point so new duplicates never get created.
Why CRMs fill up with duplicates
Most duplicates are created by the systems around the CRM, not by reps typing twice.
- Several entry points: web forms, list imports, enrichment tools, outreach tools and manual entry each create records independently.
- Integrations that create instead of update, such as a prospecting tool syncing a contact the CRM already has.
- Inconsistent values: a personal and a work email, "acme.com" and "www.acme.com", or "Acme Inc" and "Acme Incorporated".
- Separate objects: in Salesforce, the same person can exist as both a Lead and a Contact.
What duplicates cost a revenue team
Duplicates break the processes that depend on knowing one customer is one record.
- Leads routed to the wrong rep, because a new record ignores the existing account owner.
- The same prospect receiving two sequences from two reps.
- Pipeline and lead counts that are inflated or don't match between reports.
- Attribution split across records, so marketing can't see what produced revenue.
How to clean up existing duplicates
Clean up in a fixed order: measure, define rules, back up, then merge in batches.
- Measure the problem. Export contacts and companies, then count records that share an email or a normalized domain.
- Define match keys for each object (table below).
- Decide which record survives a merge, for example the one with the most activity, or the one owned by the current account owner.
- Back up a full export before any bulk change.
- Merge in small batches, starting with exact matches, and check reports after each batch.
- Review fuzzy matches, such as similar company names with no shared domain, by hand.
| Object | Primary match key | Fallback |
|---|---|---|
| Contact / Lead | Email address | First name, last name and company domain |
| Company / Account | Normalized website domain | Company name plus country |
| Deal / Opportunity | Account plus close date and amount | Review manually |
How to stop new duplicates at the source
Prevention means every entry point checks for an existing record before it creates one.
- Normalize data on the way in: lowercase emails, strip "www." and paths from domains.
- Set integrations to update matching records rather than always creating new ones.
- In Salesforce, use matching rules and duplicate rules to warn on or block duplicates.
- In HubSpot, contacts are deduplicated by email and companies can be deduplicated by domain. Use the duplicate management tool to review the rest.
- For custom entry points, add a lookup step in your automation (for example in n8n) that searches the CRM before creating a record.
When to bring in help
Cleanup is a project; prevention is a system. If duplicates keep returning after a cleanup, the cause is usually an integration or entry point that creates records without checking, and fixing it means mapping how data enters the CRM end to end.
FAQ
Will merging records delete data?
Merging keeps one record and combines activity and associations from the others, but conflicting field values are resolved by your rules. That is why a backup and agreed survivor rules come first.
How often should we check for duplicates?
Monthly reviews catch drift, but the goal is prevention at entry so reviews find very little.
Should leads and contacts be deduplicated against each other in Salesforce?
Yes. Lead-to-contact and lead-to-account matching stops known customers re-entering as new leads.
Why do duplicates return after a CRM cleanup?
Cleanup removes existing duplicates but does not change the tools creating them. We check imports, forms and integrations for consistent matching keys and update-before-create rules so the next sync does not recreate the problem.