CRM consolidation and migration checklist
Merge a legacy CRM, an email platform, and years of website forms into one contact base you can defend to a board, without losing a single suppression, deal, or line of history. The method behind a 222,000-contact consolidation, with the counts that have to match before you trust the number.
Consolidating contact systems succeeds when four rules hold: match on email within a scope and never guess, carry suppression across before any contact is imported, dry-run every import and compare its counts to the executed run, and never delete or overwrite in the first pass. This CommsOperator checklist is the method used to merge a CRM of 213,000 contacts, an email platform of 217,000, and 145,000 website form submissions into one base of 222,000.
For: Operations leads consolidating two or more contact systems, and anyone who has to stand behind the resulting number ยท Published 2026-08-26
What is inside
- Pre-migration inventory: which system is authoritative for which field
- Matching rules, including the free-mail domain trap
- Suppression carry-over before a single contact moves
- Dry run, compare, execute: the six counts that must match
- Enrichment and data-quality passes after the merge
- Five validation queries to run afterwards, with the number each should return
Do this in the right order and the merged base is one you can email from on day one, with every unsubscribe still honoured and every deal still attached. This is the method from a real consolidation: a legacy CRM, an email platform with 239 lists and 1,089 sent campaigns, and seven years of website forms across 97 form definitions, merged into one contact base. The executed run created 124,773 new contacts, carried 4,253 suppressions, wrote 5,209 deals, and deleted or overwrote nothing.
1. Inventory before you touch anything
- List every system holding contacts, with its record count and last-updated distribution. A system with 300,000 records that have not moved in two years is not a source, it is an archive.
- Decide what each system is authoritative for, field by field. Two systems both claiming to own 'job title' is how you get a merge that nobody trusts.
- Export a dated snapshot of each source and keep it. You will want to diff against it.
- Identify the suppression sources: unsubscribe lists, bounce records, blocklists, and any manual do-not-contact list living in a spreadsheet.
- Count the overlap between sources on email before planning, so the expected new-record count is known in advance.
2. Matching rules
- Match contacts on normalised email within the target scope. Lowercase, trim, and normalise plus-addressing and dots only for providers where that is correct.
- Match companies on domain, never on name. Do not create a company from a free-mail domain.
- Where a source has no email, do not guess from name and company. Park those records for manual review.
- Record the source on every imported record. Provenance is what lets you unwind a bad import later.
- Decide the update policy per field: fill-if-empty by default, overwrite only for fields the source owns.
3. Suppression first
Import suppression before contacts. If a bounce list arrives after the contacts, there is a window in which a campaign can go out to addresses you already knew were bad.
- Normalise every suppression reason to your target system's taxonomy, mapping unknown reasons to the strictest tier rather than dropping them.
- Import the blocklist as suppression records, not as contacts with a flag. The two behave differently on merge.
- Verify a sample: pick 20 addresses known to have unsubscribed and confirm they are blocked in the target.
- Only then import contacts.
4. Dry run, compare, execute
- Run the import in dry-run mode and record every count: created, updated, skipped, suppressed, tombstoned, errored.
- Sanity-check the ratios. If 'created' is close to the source count, your matching is not working.
- Execute and compare the counts to the dry run. They should be identical. A difference means something moved underneath you.
- Assert no deletes and no overwrites in the first pass. Second passes are cheap; a lost history is not.
- Keep the run log with the counts. It is the evidence that the numbers you report later are real.
5. Form history is the hidden asset
Website form submissions are usually the richest source nobody imports: they carry the person's own words, their role at the time, their interest, and their consent trail. In the consolidation above, 145,494 submissions across 97 forms enriched 89,566 existing contacts, added 3,407 new ones, backfilled 67,339 profile links, and flagged 4,167 sponsor leads that had never been in a CRM.
6. Data-quality passes after the merge
- Normalise countries and locations. In the run above, 140,032 records needed a location fix.
- Recompute derived fields such as seniority or experience so they reflect the merge date, not the export date.
- Deduplicate identities that share a person across brands, keeping the suppression union rather than the intersection.
- Verify a random sample of 100 merged records by hand. This is the step everyone skips and everyone regrets.
7. Validation queries to run afterwards
- Count contacts with no source recorded. Should be zero.
- Count suppressed contacts that appear in any active campaign audience. Must be zero.
- Count companies created from free-mail domains. Should be zero.
- Count contacts with the same normalised email in the same workspace. Should be zero.
- Compare the total against the expected union of sources minus the measured overlap. Explain any gap before you report the number.
This is how CommsOperator is run, not just written
If the practice makes sense to you, the product built around it is one request away. Tell us what you run and we will tell you if it fits.