30-second verdict
HubSpot merges cannot be undone, and for most properties the most recently updated value wins, not the value on the record you picked as primary. That rule quietly overwrites things like external billing IDs and contact owners. The safe order of operations: export a full backup, write merge rules, reconcile six specific fields, merge a test batch of 10, verify, then run the rest. Last, fix the forms, Zaps, and imports that created the duplicates. Skip that last step and you will be doing this again next quarter.
Prerequisites
The native duplicate finder needs a Professional or Enterprise subscription in any hub. Free and Starter portals can still do this with the spreadsheet method in step 2. You need a user with export and merge permissions, ideally a super admin. Operations Hub Professional is only needed if you want ongoing duplicate monitoring, not for a one-time cleanup. Budget 2 to 3 quiet hours for the first pass. Do not start this at 4 p.m. on the day invoices go out.
What HubSpot keeps and discards when you merge
When you merge two contacts, HubSpot asks you to pick a primary record. People assume the primary record's values win every conflict. They mostly do not. Here is what happens.
| Item | What happens on merge |
|---|---|
| Email address | The primary record's email stays primary. The other email is kept as a secondary email on the merged record. This is the main thing picking a primary controls. |
| Most properties | The most recently updated value wins, regardless of which record you marked primary. This includes Contact owner and any custom property. |
| Create date | The earlier create date is kept. This shifts cohort and "new contacts" reports. |
| Lifecycle stage | The stage furthest down the funnel wins. Customer beats Lead, even if Customer was set by mistake. |
| Original source | Comes from the record that was created first. Your attribution reporting inherits the older record's story. |
| Activities and forms | Notes, emails, calls, meetings, tasks, form submissions, and list memberships from both records are combined. You do not lose history. |
| Associations | Deals, tickets, and company associations from both records carry over to the merged record. |
| The secondary record | It stops existing as a separate record. Its old ID redirects to the primary. There is no unmerge button, and support cannot restore the pre-merge state. |
Two more rules worth knowing. If either record unsubscribed from your emails, treat the merged record as unsubscribed. You cannot recover marketability by merging, and under CASL you would not want to. And for companies, the primary record's domain stays primary while the other becomes an additional domain, so pick the primary based on which domain your reporting and sync key on.
Duplicates are also a measurable cost, not just an annoyance: double outreach, split deal history, wrong owner routing. We treat them as one of the standard leaks in an operations leak audit.
Step 1: export a backup you can restore from later
Because there is no unmerge, your export is the only undo. From the contacts index page, open your table view, choose Export, pick CSV, and include all properties. Do the same for companies and deals. Make sure Record ID is in the export. Name the files with the date and store them somewhere outside HubSpot.
This backup will not let you click a button and restore a merged record. It lets you see exactly what each record held before the merge, so you can repair a property by hand if a merge goes wrong. That has saved us more than once, usually on a custom property nobody remembered existed.
Step 2: find the duplicates, three ways
The native tool (Professional and up)
From the contacts index page, open the Actions dropdown and choose Manage duplicates. HubSpot compares names, emails, phone numbers, and company data and shows you likely pairs side by side. You review each pair, pick the primary, and merge or dismiss. The same tool exists for companies.
Two limits to know. It shows a capped list of likely pairs at a time, so large portals need several passes: clear a batch, come back, repeat. And it finds likely pairs, not certain ones. A parent and child sharing a family email address look like duplicates to the tool. They are not. Dismiss those instead of merging.
Operations Hub Professional
Operations Hub Professional adds a data quality command center that tracks duplicate counts and formatting issues over time, feeding the same review queue. It is the right tool when you want a trend line, not just a one-time sweep: did new duplicates stop appearing after we fixed the forms? For a single cleanup, you do not need it, and we will say so even though we sell RevOps work.
The spreadsheet method (works on every tier)
Export all contacts with these columns: Record ID, Email, First Name, Last Name, Phone Number, Associated Company, Create Date, Last Activity Date, Lifecycle Stage, Contact owner. In Google Sheets:
- Add a helper column that normalizes email:
=TRIM(LOWER(B2)). - Flag duplicate emails:
=COUNTIF(F:F, F2)on the helper column. Anything above 1 is a group. - For contacts with no email, build a second key:
=TRIM(LOWER(C2&"|"&D2&"|"&G2))joining first name, last name, and company, and run COUNTIF on that. - Phones lie about formatting, so strip them to digits with
=REGEXREPLACE(E2,"[^0-9]","")before comparing.
Sort by the flag columns and review the groups. Note: duplicate exact emails should be rare, because HubSpot already blocks a second contact with the same email at creation. If you find them anyway, an import or API integration forced them through, and that source goes on your step 6 list.
Step 3: write your merge rules before you merge anything
Before the first merge, write one page that answers: which record is primary? Our default order, top rule wins:
- The record holding a live external system ID (QuickBooks customer ID, Stripe ID, Salesforce ID) is primary.
- Otherwise, the record with open deals is primary.
- Otherwise, the record whose email the person replies from is primary.
- Otherwise, the older record is primary.
Write down your exception properties too: the custom fields where you must check the value manually because most-recent-wins would pick wrong. Every portal has a few. Find yours now, not mid-merge.
Where this breaks: external IDs
In one portal we run, deal stages trigger QuickBooks invoicing and payment reconciliation. A custom property on the record holds the QuickBooks customer ID. If a duplicate with a blank or stale ID was updated more recently, the merge keeps the wrong value, and the next invoice goes to the wrong customer or fails to reconcile. The catch: before your merge session, build a list filtered to "quickbooks_customer_id is known" (or your equivalent), and for any duplicate pair where both records carry an ID, copy the correct value onto both records first. When both records hold the same value, most-recent-wins cannot hurt you. That trick, set the desired value on both records before merging, works for any fragile property.
Step 4: reconcile these six fields before each merge
For every pair, check these before clicking Merge:
- Email: decide which address should be primary. This is the one choice the primary selection controls.
- Contact owner: most-recent-wins can silently reassign a rep's contact. Set the surviving owner on both records first.
- Lifecycle stage: the furthest stage wins and merging cements it. If one record is wrongly marked Customer, fix it before the merge. Depending on your lifecycle settings you may need to clear the value before setting an earlier stage.
- Subscription status: if either record opted out, the merged record is out. Do not merge hoping to win back a marketable contact. Under CASL that is not a grey area.
- External system IDs: QuickBooks, Stripe, Salesforce, your e-signature tool. Copy the correct value to both records first, per the trick above.
- Open deals and active enrollments: check whether either record sits in an active sequence or workflow. Merging mid-sequence produces odd sends.
Step 5: merge a test batch of 10, verify, then run the rest
Pick 10 pairs that cover your messy cases: one with open deals on both sides, one with conflicting owners, one with an external ID, one unsubscribed. On each contact record, open the Actions dropdown and choose Merge. After the batch, verify each merged record against your step 4 checklist and your backup export.
Only then choose your bulk path:
- Under roughly 100 pairs: just do them in the UI over a few sessions. Boring beats broken.
- Hundreds to thousands of pairs: the merge API.
POST /crm/v3/objects/contacts/mergewithprimaryObjectIdandobjectIdToMergelets a script work through a reviewed pair list. The reviewed part matters: a human approves the pairs, the script does the clicking. - Third-party dedupe apps: they bulk-match and bulk-merge with rules. Pricing is typically a monthly subscription that scales with record count, so for a one-time cleanup, one month of a paid app can be cheaper than a week of manual merging. Cancel after.
Where this breaks: Salesforce sync and workflow re-enrollment
Two failure modes we see on bulk runs. First, Salesforce-connected portals: merging in HubSpot does not merge the matching Salesforce records. The sync throws errors, and Salesforce can push the deleted duplicate right back into HubSpot. Rule: when Salesforce is connected, dedupe in Salesforce first and let the sync carry the result into HubSpot. Second, workflows: merges update properties, and property updates can trigger workflows with re-enrollment turned on. A 300-pair merge session that touches Contact owner can fire 300 "your new account manager" emails in an afternoon. The catch: before the session, open each active workflow and check whether its enrollment triggers reference Contact owner, Lifecycle stage, or any property your merges will touch. Pause those workflows, run the merges, check each workflow's enrollment history, then unpause.
Step 6: fix the intake, or the duplicates return
HubSpot already deduplicates by exact email at creation. So every duplicate in your portal has a specific cause: a different email for the same person, a missing email, or a tool that bypassed the check. Find the cause or the cleanup is temporary. The usual suspects:
- Zapier, Make, or n8n steps that create instead of update. Across the 600+ workflows we have built, the "Create Contact" action used where "Create or Update Contact" belongs is the single most common duplicate source we find. In Make and n8n, the equivalent fix is search first, then branch to update or create. If you are choosing between those tools, our Zapier vs Make vs n8n comparison covers the trade-offs.
- Imports without an email or Record ID column. Rows with names but no email always create new contacts. For no-email records, include Record ID so the import updates instead of creates.
- Event and webinar tools pushing registrants. People register with a personal email and exist in your CRM under a work email. You will not stop this fully. You can route these contacts through a form or list that gets a weekly duplicate review.
- Reps creating contacts without searching. In Settings, under Objects and then Contacts, you can edit the create form reps see and make Email a required field. One required field removes most hand-typed duplicates.
Spend an hour here. It is worth more than ten hours of merging.
How you know it worked
Run this acceptance test before you call the cleanup done:
- Re-run the duplicate finder. The pair count should be near zero, with only legitimate false positives left (family-shared emails, parent and subsidiary companies). Dismiss those so they stop reappearing.
- Spot check 10 merged pairs. Search the old secondary email. Exactly one record should return, with that email listed as secondary, and deals, notes, and form submissions from both sides present on the timeline.
- Integration check. 48 hours after the bulk run, your connected apps should show zero new sync errors. If billing keys off the CRM, push one test transaction through the full flow.
- The 30-day watch. Re-run your spreadsheet COUNTIF (or check the data quality trend) on contacts created in the last 30 days. New duplicates should be roughly zero. If pairs are reappearing, you missed an intake source. Go back to step 6, not step 5.
When to stop DIYing, and what this costs if we do it
Honestly: if your portal has under a couple thousand contacts, no two-way sync, and no billing or automation keyed to contact properties, you do not need us. Follow this guide over two afternoons and the cost is your time.
Bring in help when any of these are true: 10,000+ records with lots of no-email duplicates, a Salesforce or QuickBooks two-way sync, attribution reporting that leadership reads, or invoicing automation tied to CRM records. In those portals a wrong merge has a dollar cost, not just a tidiness cost.
At our flat $150/hr CAD, the typical shape of this job is: audit and merge rules, 2 to 3 hours; backup, test batch, and verification, 2 to 3 hours; bulk merge plus intake fixes, 4 to 8 hours. So most portals land between 8 and 14 hours, roughly $1,200 to $2,100 CAD, with Salesforce-connected portals on the high side. We quote the scope in writing before we start, hours never expire, and there is no retainer. If a 15-minute look tells us you can do it yourself, we will say that too. Send us a note with your record count and connected apps and we will give you a straight answer.
FAQ
Can you undo a merge in HubSpot?
No. There is no unmerge for contacts, and HubSpot support cannot restore a merged record to its pre-merge state. Your pre-merge CSV export is the only record of what each contact held, which is why the backup is step 1 and not optional.
Does HubSpot prevent duplicates automatically?
Partially. At creation, HubSpot blocks a second contact with the same exact email, and companies deduplicate by domain. It does nothing about the same person under two different emails, contacts with no email, or records forced in by imports and API integrations. Those are the duplicates you have, and they each trace back to an intake source you can fix.
Do I need Operations Hub to deduplicate?
No. The Manage duplicates tool comes with Professional or Enterprise in any hub. Operations Hub Professional adds ongoing monitoring through the data quality command center, which is useful for watching whether new duplicates stop after you fix intake, but a one-time cleanup does not require it. Free and Starter portals can use the spreadsheet method.
What happens to deals, notes, and emails when I merge two contacts?
They are combined. Deals, tickets, company associations, notes, logged emails, calls, meetings, form submissions, and list memberships from both records carry over to the merged record. The risk in a merge is not lost activity history. It is property values, where the most recently updated value wins and can overwrite an owner, a lifecycle stage, or an external billing ID.
Want this handled instead of read about?
We scope this exact work in hours, quote it in writing, and ship it in weeks. The 30-minute call is free and useful either way.
Book a 30-minute call$150/hr flat · published pricing · no retainer pitch