Short answer
HubSpot deduplicates contacts on email and companies on domain, but not for API-created companies, deals or tickets. Prevent duplicates with unique value properties on your real business keys and disciplined imports, then clean up with the duplicates tool, a tested merge rule and a pre-merge export, because merges cannot be undone.
How HubSpot deduplicates on its own
Before you buy a tool or write a script, know what the platform already does, because most duplicate problems come from the gaps in this list. HubSpot's deduplication article describes the default behavior:
- Contacts are matched on the Email property when created manually, through forms or through imports. A form submission with a known email updates the existing contact. An import row with no email and no other unique identifier creates a new contact.
- Companies are matched on the primary Company domain name. Companies created through the API, including installed sync apps, are not deduplicated on domain at all.
- Deals and tickets have no automatic deduplication. Record ID is the only reliable key for imports.
- Unique value properties. You can mark up to ten custom properties per object as requiring unique values. They apply to manual edits and imports, but not to forms.
The duplicate management tool (Professional or Enterprise in Marketing, Sales, Service, Data Hub or Smart CRM) finds likely pairs using several properties at once and lets you review, merge or reject them. Bulk merging and the duplicate audit log need Data Hub Professional or Enterprise.
Prevention checklist
- Standardize email and domain at the source. Lowercase, trimmed, no role aliases on advisor records. Put this in your property standards and your import template.
- Map every import to Email or Company domain name. If a file has neither, add Record ID from an export first. Don't import "name only" lists.
- Add unique value properties for your real keys. Account number, CRD number, NMLS ID, loan number or policy number should each be a unique value property on the right object so a second record with the same key is rejected.
- Treat API and integration writes as unprotected. Companies created by integrations are not domain-deduplicated. Have the integration search before it creates, or route it through a staging property that a workflow reconciles.
- Keep form fields minimal. A secondary email entered on a form overwrites the contact's existing email, which can create a new identity on the next submission from the old address.
- Agree parent and child company rules. Households, branches and holding companies should be modeled with associations, not by creating near-identical company records.
- Restrict who can merge. Merging needs the Merge records permission or Super Admin. Give it to a small group that knows the rules below.
Cleanup checklist
- Export before you touch anything. Merges cannot be reverted, so take a full export of contacts and companies with Record ID, Email, Company domain name, owner and create date.
- Open the duplicates tool and set the similarity filter high. Start with the pairs the tool is most confident about, review a sample by hand, then widen.
- Add a custom rule for your business key. You can define up to two rules per object with up to nine properties each. A rule on account number or household ID catches pairs that name and email miss.
- Decide the primary record deliberately. By default the primary record's values win and the secondary fills gaps. The merged record keeps the oldest create date, the furthest lifecycle stage, combined activities and combined property history. The merge records article lists the full rules.
- Check integrations before each batch. After a merge, only the primary contact keeps syncing to Salesforce. Both records are also unenrolled from active workflows by default, so a contact mid-sequence or mid-nurture will drop out.
- Use bulk merge only with a tested rule. Bulk criteria include most recent engagement, oldest engagement, created first, created last and most recently updated. Pick one, test on 20 pairs, then run the batch.
- Reject pairs you have verified are different people. Rejected suggestions stop appearing, and you can undo a rejection for up to 14 days if the records haven't changed.
- Watch the merge cap. Records involved in a combined 250 or more merges can no longer be merged. Heavily reused "catch-all" contacts hit this.
- Record what you did. Data Hub Professional or Enterprise keeps a duplicate audit log for auto-merged and rejected pairs, and merge history can be exported for data up to 90 days old. Manual merges aren't in that log, so keep your own change record for those.
Merge rules that surprise people
| Area | What happens on merge |
|---|---|
| Record ID | A new ID is created; old IDs are stored in the Merged record IDs property |
| Primary email kept, secondary email added as an additional address | |
| Company domain | Secondary domain becomes a secondary domain on the kept company |
| Static lists | Secondary record is removed from all static segments |
| Workflows | Both records unenrolled from active workflows by default |
| Parent and child companies | A company in a parent-child relationship may fail to merge |
What we recommend for regulated firms
- Dedupe on the regulated identifier, not the email. Clients change email addresses; account and household identifiers don't. Make those the unique keys.
- Never bulk merge records with open compliance activity. Complaints, suitability reviews and in-flight approvals should be excluded from the batch and handled one at a time.
- Keep the pre-merge export for your retention period. The merged record shows the merge date rather than the original timestamp on changed properties, so the export is your evidence of what each record said before.
- Run cleanup before a Salesforce connector go-live, not after. Duplicates on either side multiply once the sync starts.
Official documentation
Frequently asked questions
Can I undo a merge in HubSpot if we picked the wrong primary record?
No. HubSpot states that merged records cannot be unmerged. The merged record keeps the original IDs in a Merged record IDs property, and you can remove an extra email or domain and recreate a record by hand, but the original separate histories are gone. Export before merging, test any bulk rule on a small sample, and limit the Merge records permission to people who know the rules.
Why does our integration keep creating duplicate companies?
Companies created through the API, including installed data sync apps, are not deduplicated on company domain name. Only manual creation, forms and imports get that check. Fix it at the integration: have it search by domain or by your unique business key before it creates, or write to a staging property that a workflow reconciles. Then add a custom duplicate rule on that key so the duplicates tool catches what slips through.
Salesforce, HubSpot, Anthropic and OpenAI change their products often. Check the official documentation before you rely on a specific setting, limit or price.
