Skip to content

Data Migration and Cleanup ​

Your CRM is only as good as the data inside it. Migrating dirty data into a shiny new system just gives you a shiny new system full of garbage β€” invest in cleanup before migration, not after.

Why This Matters ​

  • 🏒 Owner: Bad data costs businesses an estimated 15-25% of revenue through missed opportunities, duplicated outreach, and flawed forecasting. Data migration is your one chance to start clean.
  • πŸ’» Dev: You will build the migration scripts, field mappings, and validation rules. Understanding the data landscape upfront prevents weeks of rework when production data behaves nothing like test data.
  • πŸ“‹ PM: Data migration is the most commonly underestimated workstream in CRM projects. If you do not plan for it explicitly, it will blow your timeline.
  • 🎨 Designer: The data model determines what you can display and how. Inconsistent or missing data means empty fields, broken layouts, and user frustration on day one.

The Concept (Simple) ​

Think of data migration like moving to a new house.

You would not pack every item you own β€” including the broken furniture, expired food, and boxes of junk from the garage β€” load it all into a truck, and dump it in your new home. You would sort first. Keep what is valuable, toss what is trash, fix what is worth repairing, and organize everything before it goes into the new space.

Data migration works the same way. Before you move a single record to your new CRM, you audit what you have, throw away duplicates and dead records, standardize formats, and map everything to its new home. The move itself is the easy part. The preparation is where the real work happens.

In one sentence: Clean your data before you migrate it, because a new CRM will not fix old data problems β€” it will amplify them.

How It Works (Detailed) ​

The Data Migration Lifecycle ​

Data migration is not a single event β€” it is a structured process with distinct phases.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  AUDIT   │───▢│  CLEAN   │───▢│   MAP    │───▢│ MIGRATE  │───▢│ VALIDATE β”‚
β”‚          β”‚    β”‚          β”‚    β”‚          β”‚    β”‚          β”‚    β”‚          β”‚
β”‚ Inventoryβ”‚    β”‚ Dedupe   β”‚    β”‚ Old ──▢  β”‚    β”‚ Extract  β”‚    β”‚ Spot     β”‚
β”‚ all data β”‚    β”‚ Purge    β”‚    β”‚ New      β”‚    β”‚ Transformβ”‚    β”‚ check    β”‚
β”‚ sources  β”‚    β”‚ Normalizeβ”‚    β”‚ fields   β”‚    β”‚ Load     β”‚    β”‚ Reconcileβ”‚
β”‚ Assess   β”‚    β”‚ Enrich   β”‚    β”‚ Define   β”‚    β”‚ (ETL)    β”‚    β”‚ User     β”‚
β”‚ quality  β”‚    β”‚          β”‚    β”‚ rules    β”‚    β”‚          β”‚    β”‚ acceptanceβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     β”‚                                                               β”‚
     └───────────── Iterate until quality gates pass β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Phase 1: Data Audit and Inventory ​

Before cleaning anything, you need to know what you have. The audit answers four questions:

  1. Where does data live? (Spreadsheets, old CRM, email, ERP, sticky notes)
  2. How much data is there? (Record counts by type)
  3. How good is it? (Completeness, accuracy, freshness)
  4. Who owns it? (Which team or person is the source of truth)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    DATA INVENTORY MATRIX                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  DATA SOURCE   β”‚ RECORDS β”‚ COMPLETE % β”‚ FRESHNESS β”‚ OWNER      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Old CRM        β”‚ 45,000  β”‚ 62%        β”‚ Mixed     β”‚ Sales ops  β”‚
β”‚ Spreadsheets   β”‚ 12,000  β”‚ 35%        β”‚ Stale     β”‚ Various    β”‚
β”‚ Email contacts β”‚ 28,000  β”‚ 20%        β”‚ Recent    β”‚ Individual β”‚
β”‚ ERP system     β”‚ 8,500   β”‚ 85%        β”‚ Current   β”‚ Finance    β”‚
β”‚ Business cards β”‚ 3,000   β”‚ 40%        β”‚ Stale     β”‚ Sales reps β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ TOTAL          β”‚ 96,500  β”‚            β”‚           β”‚            β”‚
β”‚ After dedupe   β”‚ ~38,000 β”‚ (estimate) β”‚           β”‚            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data quality scoring: Rate each data source on four dimensions:

DimensionDefinitionScore 1 (Bad)Score 5 (Good)
CompletenessAre required fields populated?< 30% of fields filled> 90% of fields filled
AccuracyIs the data correct and current?Many bounced emailsVerified within 6 months
ConsistencyAre formats and values standardized?Free-text everythingPicklists, standard formats
UniquenessHow many duplicates exist?> 30% duplicate rate< 5% duplicate rate

Phase 2: Deduplication Strategies ​

Duplicates are the most common and most damaging data quality problem in CRM. They cause reps to call the same prospect twice, reports to overcount pipeline, and automation to fire multiple times.

  DEDUPLICATION DECISION TREE
  ============================

  Two records look similar
         β”‚
         β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     NO     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ Same email OR   │───────────▢│ Same company +   β”‚
  β”‚ same phone?     β”‚            β”‚ same name (fuzzy β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚ match > 85%)?    β”‚
           β”‚ YES                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β–Ό                              β”‚ YES
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ DEFINITE DUPE   β”‚              β”‚ PROBABLE DUPE   β”‚
  β”‚ Auto-merge      β”‚              β”‚ Flag for human   β”‚
  β”‚                 β”‚              β”‚ review           β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Merge rules β€” which record wins?

FieldMerge Rule
NameMost complete version
EmailKeep all; mark primary
PhoneKeep all; mark primary
AddressMost recently updated
CompanyMost complete; standardize format
OwnerMost recent activity
Activity historyMerge all activities into surviving record
Custom fieldsNon-blank value wins; flag conflicts for review

Phase 3: Field Mapping ​

Field mapping translates the data model of your old system into the data model of your new CRM. This is where subtle mismatches cause the biggest problems.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     FIELD MAPPING TABLE                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  OLD SYSTEM FIELD  β”‚  NEW CRM FIELD   β”‚  TRANSFORMATION         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ CustomerName       β”‚ Account Name     β”‚ Trim whitespace, title  β”‚
β”‚                    β”‚                  β”‚ case                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ContactPerson      β”‚ First Name +     β”‚ Split on space; last    β”‚
β”‚                    β”‚ Last Name        β”‚ word = Last Name        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Tel                β”‚ Phone            β”‚ Format: +1 (XXX) XXX-  β”‚
β”‚                    β”‚                  β”‚ XXXX                    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Status (free text) β”‚ Stage (picklist) β”‚ Map to: Prospect, Lead, β”‚
β”‚                    β”‚                  β”‚ Opportunity, Customer   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Notes              β”‚ Description      β”‚ Truncate to 32,000 char β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ SalesRep (name)    β”‚ Owner (user ID)  β”‚ Lookup against user     β”‚
β”‚                    β”‚                  β”‚ table                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ (no equivalent)    β”‚ Lead Source      β”‚ Default: "Legacy Import"β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Region code        β”‚ (no equivalent)  β”‚ Archive to custom field β”‚
β”‚                    β”‚                  β”‚ or discard              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Common mapping pitfalls:

  • One field in the old system maps to multiple fields in the new (e.g., full name to first + last)
  • Picklist values do not match (e.g., "Hot Lead" vs "Qualified")
  • Data types change (e.g., free text to structured picklist)
  • Required fields in the new system have no source data

Phase 4: Normalization and Standardization ​

Before loading data, apply consistent formatting rules.

Data TypeStandardization Rule
Phone numbersE.164 format: +1234567890
Email addressesLowercase, trim whitespace
Company namesRemove Inc/LLC/Ltd variations; standardize casing
AddressesUSPS or postal service standard format
DatesISO 8601: YYYY-MM-DD
CurrencyStore as cents/integer; separate currency code
NamesTitle case; trim whitespace; remove honorifics
State/ProvinceTwo-letter abbreviation codes

Phase 5: Cutover Planning and Rollback ​

The actual migration event β€” the cutover β€” needs to be planned like a surgical operation.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    CUTOVER TIMELINE                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T-14 days        β”‚ Final test migration on staging             β”‚
β”‚                   β”‚ Validate record counts and field accuracy   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T-7 days         β”‚ Freeze changes in old system (or capture    β”‚
β”‚                   β”‚ delta records)                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T-1 day          β”‚ Full backup of old system                   β”‚
β”‚                   β”‚ Full backup of new system (pre-migration)   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T-0 (cutover)    β”‚ Run production migration scripts            β”‚
β”‚                   β”‚ Validate record counts match                β”‚
β”‚                   β”‚ Spot-check 50 records across all types      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T+1 day          β”‚ Key users validate their data               β”‚
β”‚                   β”‚ Fix critical issues                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T+3 days         β”‚ Go/no-go decision on full rollout           β”‚
β”‚                   β”‚ If no-go: execute rollback plan             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  T+7 days         β”‚ Decommission old system access (read-only)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Rollback plan essentials:

  • Full backup of the new CRM before migration starts
  • Documented steps to restore the pre-migration state
  • Clear criteria for when to invoke rollback (e.g., > 5% data loss, critical fields missing)
  • The old system remains accessible in read-only mode for at least 30 days

In Practice ​

A Real-World Data Migration: 96,000 Records to Clean CRM ​

A B2B services company had 96,000 contact records spread across an old CRM, spreadsheets, and email exports. Here is what they found during audit:

  • 40% duplicates β€” the same contacts appeared in multiple sources with different spellings
  • 60% of phone numbers were in non-standard formats or disconnected
  • 25% of email addresses bounced when validated
  • "Status" field had 47 unique free-text values that needed to map to 6 picklist options

After a three-week cleanup effort, they migrated 38,000 clean, deduplicated records. Sales reps reported that the new CRM felt "like it actually knows our customers" because every record had complete, accurate, standardized data.

Anti-Patterns to Avoid ​

  1. The "Migrate Everything" Approach β€” Importing all historical records regardless of quality or relevance. If a contact has not been touched in three years and has no email address, it does not belong in your new CRM.

  2. Cleaning Data After Migration β€” This always takes three times longer and means users start with a bad experience. Clean first, migrate second.

  3. Skipping Test Migrations β€” Running the migration script once in production and hoping for the best. Always run at least two full test migrations against realistic data volumes.

  4. One-Person Migration β€” Assigning data cleanup to one analyst working alone. Business users must validate that their data looks correct β€” the analyst cannot know that "Acme Corp" and "ACME Corporation" are the same company without domain knowledge.

  5. Ignoring Delta Records β€” Records created or modified between the test migration and production cutover get lost. Plan for a delta migration or enforce a data freeze window.

Key Takeaways ​

  • Audit all data sources before cleaning β€” you cannot fix what you have not measured.
  • Deduplication typically reduces record counts by 30-50%. This is a feature, not a bug.
  • Field mapping is where most migration bugs originate. Document every transformation rule explicitly.
  • Normalize data formats (phone, email, dates, addresses) before migration, not after.
  • Run at least two test migrations with production-scale data before the real cutover.
  • Always maintain a rollback plan and keep the old system accessible in read-only mode.
  • Budget 2-4 weeks for data cleanup β€” it is the most underestimated phase in every CRM project.
  • Business users must validate migrated data. Technical teams alone cannot verify accuracy.

Action Items ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ROLE-BASED ACTION ITEMS                                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 🏒 Owner β”‚ ☐ Mandate a data quality audit before any migration  β”‚
β”‚          β”‚   work begins                                        β”‚
β”‚          β”‚ ☐ Approve the data retention policy β€” what migrates  β”‚
β”‚          β”‚   and what gets archived                             β”‚
β”‚          β”‚ ☐ Allocate budget for data enrichment tools if       β”‚
β”‚          β”‚   needed (email validation, firmographic data)       β”‚
β”‚          β”‚ ☐ Set quality targets: < 5% duplicates, > 85%       β”‚
β”‚          β”‚   field completeness                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ πŸ’» Dev   β”‚ ☐ Build the field mapping document with              β”‚
β”‚          β”‚   transformation rules for every field               β”‚
β”‚          β”‚ ☐ Write migration scripts with validation checks     β”‚
β”‚          β”‚   and error logging                                  β”‚
β”‚          β”‚ ☐ Run two full test migrations before production     β”‚
β”‚          β”‚ ☐ Create rollback scripts and test them              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ πŸ“‹ PM    β”‚ ☐ Build the data inventory matrix with record        β”‚
β”‚          β”‚   counts and quality scores                          β”‚
β”‚          β”‚ ☐ Schedule the cutover window and communicate it     β”‚
β”‚          β”‚   to all stakeholders                                β”‚
β”‚          β”‚ ☐ Define the go/no-go criteria for post-migration    β”‚
β”‚          β”‚ ☐ Plan the delta migration strategy for late changes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 🎨 Designβ”‚ ☐ Review migrated data in the new CRM layouts to    β”‚
β”‚          β”‚   verify fields render correctly                     β”‚
β”‚          β”‚ ☐ Design empty-state experiences for records with    β”‚
β”‚          β”‚   incomplete data                                    β”‚
β”‚          β”‚ ☐ Plan how "Legacy Import" records will display      β”‚
β”‚          β”‚   differently from newly created records             β”‚
β”‚          β”‚ ☐ Test dashboards with migrated data volumes         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Next: Customization vs Configuration

The Product Builder's Playbook