GoHighLevel
How to remove duplicate contacts in GoHighLevel
GoHighLevel deduplicates on email and phone. That sounds sufficient until you realise how many ways the same person can enter your CRM without matching either field exactly.
How do I remove duplicate contacts in GoHighLevel?
Export the sub-account to CSV, standardise formats before matching (casing, phone numbers, company suffixes), then run fuzzy matching across name, email domain and normalised phone rather than exact match. Merge duplicates rather than deleting them so no populated field is lost, then re-import. GoHighLevel's built-in Manage Duplicates tool scans by email, phone or name, but merges a maximum of 10 records at a time and cannot be undone, so large cleanups are done outside the platform.
Step by step
- Export the sub-account
Contacts → select all → Export. Take a full CSV including custom fields, tags, and the date-created column. Keep this file untouched as your rollback.
- Standardise before you match
This is the step people skip and it wastes the whole exercise. Normalise casing, strip company suffixes, and convert every phone number to E.164 format. ‘07700 900123’ and ‘+447700900123’ are the same number, but no matching engine knows that until you tell it.
- Extract the email domain
Split every address into local part and domain. Matching on domain plus surname catches duplicates that exact-email matching never will —
dave@acme.coandd.mills@acme.coare plausibly the same person at the same company. - Run fuzzy matching, not exact
Match on a combination: surname similarity, email domain, and normalised phone. Any two of the three agreeing is usually a genuine duplicate. Flag rather than auto-merge where only one matches.
- Merge, never delete
For each cluster, build one surviving record that keeps the most complete value from every field. If one duplicate has the phone number and another has the job title, the survivor gets both. Log every merge.
- Consolidate the tags
Duplicates almost always carry tag variants —
lead,Lead,new-lead,Lead-2024. Decide the canonical tag, map the variants to it, and write the taxonomy down before re-import. - Re-import and verify
Import as an update against a unique identifier, not as new contacts, or you will create the exact problem you just fixed. Spot-check 50 records against the original export.
What GoHighLevel's Manage Duplicates tool does — and where it stops
GoHighLevel ships a built-in Manage Duplicates tool. It is genuinely useful and you should try it before paying anyone, including us. Open Contacts, click the three-dot menu, choose Manage Duplicates, then scan by email, phone or name.
Four documented constraints decide whether it is enough for your account. All four come from HighLevel's own support documentation:
| Documented limit | What it means at scale |
|---|---|
| Maximum 10 records per merge | 3,000 duplicate pairs means roughly 300 separate merge operations, run by hand. |
| “Once merged, the process cannot be reverted” | No undo. A wrong master record is permanent, so every merge needs checking first. |
| Rejecting a suggestion is permanent | “This action cannot be reverted.” A mis-click removes that pair from all future scans. |
| Admin-only access | Team members and users cannot see the tool at all, so the work cannot be delegated internally. |
Use the native tool when you have a few dozen obvious duplicates and an admin with a free afternoon. Work outside it when you have thousands of pairs, need an audit trail, or cannot risk an unreversible merge on live client data. Below is the method we use for the second case.
Why duplicates keep appearing in the first place
GHL's native deduplication compares email and phone as exact strings at the point of entry. It is fast and it is safe — it will never merge two people who happen to share a surname. But it means every one of these creates a new record:
- A contact fills a form with
dave@acme.cohaving previously been imported asd.mills@acme.co - A phone number is entered as
(555) 014-2where the existing record holds+15550142 - A CSV import runs without a unique identifier mapped
- Two sub-accounts hold the same lead and get consolidated later
None of these are bugs. They are the predictable result of exact matching applied to human data entry.
How to stop it recurring
Cleaning is the easy half. Preventing recurrence takes three habits:
- Map a unique identifier on every import. Email is usually the practical choice. An import without one is a duplicate generator.
- Lock down tag creation. If everyone can invent tags, everyone will. Publish the taxonomy and review it monthly.
- Normalise phone numbers at entry. A required-format field on your forms costs ten minutes and prevents a category of duplicate permanently.
Contact data still decays at roughly 22–25% a year regardless, so plan a verification pass each quarter.
Want this done for you?
This is our most-requested work — 237 of our 282 client reviews come from CRM and GoHighLevel data projects. Send a sample export and we will tell you what is in it, free, within one business hour.
FAQ
Common questions
Does GoHighLevel have a built-in duplicate finder?
GHL merges on exact email and phone matches during import, and offers a Manage Duplicates scan plus manual merge on contact records. There is no bulk fuzzy-matching tool, which is why duplicates that differ by formatting or by using a different address survive.
Will merging contacts lose my conversation history?
Merging inside GoHighLevel preserves conversations on the surviving record. If you are cleaning via export and re-import, conversations stay attached to the original contact IDs — which is why we re-import as an update rather than replacing records.
How many duplicates should I expect?
Between 15% and 40% is normal for a database that has been imported into more than once. We removed 450+ duplicates from one 3,000-record CRM and 320 from a 1,000-record HubSpot migration.
Can I merge more than 10 contacts at once in GoHighLevel?
No. HighLevel's documentation caps the Manage Duplicates tool at 10 records per merge and the tool notifies you when the limit is reached. A database with 3,000 duplicate pairs therefore needs roughly 300 separate merge operations, each one performed by hand by an admin.
Can a GoHighLevel merge be undone?
No. HighLevel states plainly that once merged, the process cannot be reverted, and that rejecting a suggested duplicate is also permanent. That is why we work from a full CSV export and keep the untouched original as a rollback before any merge runs.
Can you do this for us?
Yes — it is our most-requested service. Fixed price from $250 for up to 2,000 contacts, with a test batch approved before we touch the full dataset.
Data you can actually trust
Tell us what is broken. We will tell you what it would take to fix — and if the answer is nothing, we will say that too.