Duplicate contacts: why your CRM keeps making two of everyone
Your CRM keeps making duplicates because several intake lanes write to it, such as a form, email, a booking link and imported lists, and each one decides on its own whether a person already exists. A cleanup day fixes the records and leaves the lanes running. The fix is one match rule every lane checks before creating anything.
You merged the duplicates last quarter, maybe with a contractor or a spare afternoon and the merge tool. A few weeks later the same client shows up twice again, one record from the contact form and one from the booking link, with the deal history split between them. Somebody emails the wrong record, a report counts the same lead twice, and people stop trusting the CRM enough to keep it updated.
Why the duplicates keep coming back
A CRM gets a new record every time something writes to it and decides the person is new. In most agencies and consultancies, several things write to it. The website form creates a contact when someone fills it in. Email logging can create one for every new address that writes in. The booking tool creates one when a lead books a call, and somebody imports a list from an event or an old spreadsheet. Each of those lanes checks for an existing record in its own way, and some don't check at all.
HubSpot's own knowledge base says that when a new contact is added, it looks for a matching value in the Email property. That works when every lane carries the same address. It breaks when a lead fills in the form from a work address and books the call from a second one, or when a list goes in with no email or other unique identifier, which HubSpot says brings every row in as a new contact. If you run a different CRM, check which field it matches on, because the gaps tend to sit in the same places.
So the cleanup day doesn't hold. Merging fixes the records that exist today, and every lane keeps writing tomorrow with the same gaps. Duplicates are made at the moment a record is created, so the fix belongs at that moment too: one match rule that every lane checks before it creates anything.
What duplicates cost you
The cost shows up as small, repeated work that nobody books as a cost. Someone checks two records before every call. A follow-up lands on the record nobody is watching, so the lead hears nothing. Two people email the same lead because each saw a different record. Reports count one lead twice, which makes conversion look worse than it is, and the next cleanup goes on somebody's calendar.
Each of those is a few minutes spent working out which record is true, spread across everyone who touches the CRM. That is coordination time, and it rarely gets counted because it never arrives as one big task. The coordination cost tool turns your own hours and rates into a monthly figure, so you can see what the checking is worth before deciding whether to fix it.
The system shape: one match rule before any record is created
Every lane goes through the same check before it writes. The rule looks for the email first. If there is no email match, it looks for the company domain together with the person's name, which catches the same person writing in from a second work address. A match updates the existing record and adds the new activity to it. When nothing matches, the rule creates one new record. Anything it can't decide goes to a short review list instead of becoming a guess.
- Website form
- Email
- Booking link
- Imported list
- Match found: update the record
- No match: create one record
| Intake lane | How it creates duplicates | The match rule |
|---|---|---|
| Website form | A returning lead types a different address, and the form matches on email only, so the new address makes a new contact | Check email first, then company domain and name, before the form writes anything |
| Email logging creates a contact for a new address, including a second address for someone already in the CRM | Run the same check on the sender, and add the new address to the matched record | |
| Booking link | The booking tool writes its own contact with whatever address the lead typed into the calendar | Send every booking through the same check, then attach the meeting to the matched record |
| Imported list | Rows with no email or other unique identifier come in as new contacts, one per row | Check every row against the rule before import, and hold rows with no email or domain for review |
| Someone typing one in | A contact gets added by hand without a search first | Search by email and company before adding, and let a scheduled check flag any pair that slipped through |
The rule lives in one place and every lane calls it. If each tool gets its own copy of the rule, the copies drift apart the first time someone edits one of them, and the duplicates start again from that lane.
What stays human
The rule handles the clear cases and people decide the rest. When two records might be the same person, such as a shared address a whole firm writes from, or two people with the same name at one company, the rule puts the pair on a short review list. Someone who knows the client picks the right record, and the decision takes seconds because the pair is already side by side.
A person also owns the rule itself: which field wins when two records disagree, and what happens when a client moves to a new company. Which field wins is a source of truth question, and it is worth settling before the match rule goes in. If the CRM owns contact details, the booking tool and the email tool read from it and send changes back to it, so a merge in one place stays merged everywhere.
I'd still do one cleanup, after the rule is live and the lanes have stopped adding new duplicates. Merge in the order the rule matches, email first and then domain with name, and keep a record of every merge so a wrong one can be undone. That part is a person's job too, because a merge that joins two real clients is harder to fix than a duplicate.
Questions
Why do HubSpot duplicates come back after I merge them?
Merging fixes the records you have today, while the lanes that made them keep writing with the same gaps: a form filled in from a second address, a call booked from another one, or an import with no email or other unique identifier. HubSpot matches new contacts on the Email property, so any lane that brings a different email, or none, makes a new record.
Should I just turn on my CRM's automatic duplicate tools?
Turn on whatever your CRM offers, since it's already there. It covers what the CRM can see, using the fields the vendor chose. A match rule you write runs in every lane, including the booking tool and imports, and it uses the fields your business trusts, such as company domain with name.
Is email the right field to match on?
Email first, because it is the closest thing most CRMs have to a unique label for a person, and HubSpot uses it for contacts. It misses people who write from two addresses, and it can't tell apart several people using one shared address. That is why the rule falls back to company domain and name, and sends anything unclear to a person.
Do I need a developer to set up a match rule?
For a single lane, maybe not, since some form and booking tools can look up a contact before creating one. Across several lanes, someone has to write the rule once and route every lane through it, and that part is build work. Either way, write the rule down in plain words first, so whoever builds it builds the same rule everywhere.
How do I find out how many duplicates I have and where they come from?
Export your contacts and sort by email, then by company domain and last name. Pairs that sit next to each other are likely duplicates, and the field that records each contact's original source usually tells you which lane made it. Count them by lane, and put the match rule on the busiest lane first.
Related
- Dedupe keyA dedupe key is the field a system uses to decide two records are the same person or company. Which key to pick, an example, and what goes wrong without one.
- Source of truthThe one system whose copy of a record wins when two tools disagree. Why it matters for opt-outs and phone numbers, and how a one-way sync keeps it that way.
- Two tools, two truths: which system is the source of truthWhen two tools disagree about a client, pick one owner tool for each field, let changes flow one way from it, and send edits made elsewhere back to the owner.
- How do I stop website form duplicates in HubSpot?Where the handoff from your website form to HubSpot makes duplicates or loses leads, which field is the key, what stays with a person, and what I'd pick.
- Records from forms and emailed PDFs, kept in one place that stays rightA system I built that keeps the right version of each customer record in Airtable. Forms and emailed PDFs feed it, and HubSpot copies from it.
- What does coordination cost your business each year?Turn your leads, proposals and active projects into the hours your people spend coordinating each month, and what that time costs you in a year.