Every customer once, and every change on the record.

We match duplicates, fill gaps from your own order or job history, and write the result into the CRM you already use. Every field we touch is logged with its old value, its new value and the time, so nothing your team typed is ever lost.

324 of 325practices synced at a dental lab
3,244field writes, all logged
0failures
0values overwritten

What changes in the list.

Six problems we find in almost every customer list, and what each one looks like once it is fixed.

Illustration of three slightly different copies of the same customer card stacked crookedly, with a magnifying glass over the misspelled names.
ProblemBeforeAfter
DuplicatesThe same customer three times, spelled three waysOne record, with the others linked and flagged for your decision
Empty recordsName only, no phone, no historyFilled from your own orders or jobs: how often they buy and when they last did
Shared numbersTwo offices on one phone, counted as one customer or as a duplicateA roll-up card that links them, kept out of per-customer messaging
Status"Active" on people who left long ago, "inactive" on regularsStatus worked out from real activity, with the rule written down
Your team's notesAt risk every time someone imports a fileNever overwritten. The sync fills blanks and adds; it does not replace.
What changedNobody knows who edited whatA log line per field: old value, new value, time, result

Two programs: one that looks, one that writes.

Splitting reading from writing is the main safety rule. The part that explores your data cannot change it, by construction.

Inputs Look (read-only) Check Write Order / job historyyour own export Current CRMcontacts as they are Read-only clientno create, edit or delete code Matcherphone first, graded Dry runevery planned change listed You approveweak matches decided Writer, livereads, merges, then writes Do-not-write listfields it must skip Audit logold, new, time, status Reruns are safe: the writer skips rows already done. Its access token can update contacts but cannot send messages, start workflows or move money.
How the sync is built. The same pattern we used at the dental lab, with any CRM that has an API or a reliable import.

One line for every field we touch.

This is what you get alongside the cleaned CRM. The rows below are sample data in the same shape as the real log.

timerecordfieldold valuenew valueresult
14:02:11acct-0142last_order_date(empty)2026-07-28200 written
14:02:11acct-0142orders_12mo(empty)31200 written
14:02:12acct-0142notes"Prefers Tuesday pickups"(unchanged)kept, team value
14:02:12acct-0207segment(empty)own rhythm200 written
14:02:13acct-0207intake_form_answers(not read)(not written)do-not-write list
14:02:13group-0019linked_accounts(empty)acct-0311, acct-0312200 written

Shared phones become roll-ups

When two or more customers share one phone or email, matching on that number would merge different people. They get a roll-up card that links them instead. At the lab this produced 29 roll-up cards, and those groups were kept out of anything addressed to one customer.

Some fields are never written

Fields filled in by your customers themselves, or anything sensitive, go on a permanent do-not-write list. At the lab, patient-submitted fields were on that list from day one. The writer checks it before every change.

Illustration of a single clean customer card sitting on a neat stack, with a long receipt-like log strip curling out beside it.

The dental lab, in numbers

Carlos Ceramics Dental Lab had years of case history and a GoHighLevel account that did not reflect it. Of 325 practices, 215 matched on phone with high confidence, 40 more weakly, 69 shared an identifier with another practice, and 1 was missing from the CRM. We wrote 324 of them: 3,244 field writes, every one returned success, none failed, and no existing value was overwritten.

The job stopped at clean records. No office was emailed or texted as part of it. Read the full case study.

What we need from you

  • Admin access to the CRMThrough a user of our own.
  • An export of your historyOrders, jobs or invoices.
  • Thirty minutesTo decide the weak matches we flag.

About cleanup and sync.

What do you match records on?

Whatever is most stable in your data. For the dental lab it was the phone number, then name and address as a check. Matches are graded, and the weaker ones are shown to you before anything is written.

Can we undo a sync?

Yes, field by field. The audit log keeps the old value next to the new one, so any change can be put back. Because the writer only fills blanks and adds, there is usually little to undo.

Two of our customers share one phone number. What happens?

They are not merged. Customers sharing a phone or email get a roll-up card that links them, and they are kept out of any per-customer messaging until you decide how to reach each one.

Send us the export. We'll show you the dry run first.

Nothing is written until you have seen every planned change.