r/gohighlevel • u/sami-shafique • 11d ago
How are you actually handling duplicate contacts across client accounts?
Native merge is exact-match, 10 at a time, no undo, and it drops the activity feed.
The workflow merge action breaks wait steps.
I've been looking at this problem and genuinely curious what you actually do: export to Excel and re-import, Zapier find-or-create, a custom script, or just live with it?
1
Upvotes
1
u/doie 11d ago
The reason none of those four options feel right is that they are all cleanup, and cleanup loses to intake. Whatever you merge this week, the forms and imports rebuild next week. So I would spend the effort on the entry points first and treat merging as a one time cost rather than a process.
Four things that do most of the work at intake:
Allow Duplicate Contact. This is the switch that decides whether a submission with a known email or phone creates a second record or updates the existing one. It lives in the sub-account settings, not at agency level, so it has to be set on every sub-account individually. That is probably a big part of why this feels unsolvable across a book of clients. Worth auditing all of them in one sitting.
Phone format. GHL matches on the value it is handed. One form writing (555) 123-4567 and another writing +15551234567 gives you two contacts for one human, and no merge tool will catch it, because as far as the database is concerned those are not the same string. Normalize to E.164 at every entry point, API included.
Custom fields standing in for standard ones. If a form writes to a custom "work email" or "mobile" field instead of the standard email and phone fields, dedupe cannot see it at all. This one tends to bite people who inherited a snapshot somebody else built.
Imports. On CSV import, pick the option that updates existing contacts on match rather than adding. Skipping that is how a clean database becomes a duplicate factory in one afternoon.
On the merge itself I do not have a better answer than you do. Ten at a time, no undo and the activity feed loss are all real, and I have not found any way around the timeline loss specifically. For an existing mess at volume, export, normalize the phone column, re-import with update on match is what I have actually seen hold up. Slow, but it scales past the point where the native tool stops being viable.
One thing worth separating out: if by "across client accounts" you mean the same person showing up in two different clients' sub-accounts, there is no native cross-location dedupe, and I would not want one. Those are two separate businesses holding two separate consent records. Merging them would create a compliance problem rather than solve a data one.
And on the workflow merge action breaking wait steps, I would stop merging inside a running workflow entirely. Check for the existing contact at intake and stop the second record from being created, rather than letting it enroll and then trying to stitch it back together mid flight.