The data migration failure statistic
Gartner estimates that 73% of CRM migrations miss their go-live date, and the #1 cause is data quality — not technical failure. Teams spend months building integrations and UI, then discover at cutover that 30% of accounts have duplicate emails, 15% of contacts are orphaned, and the picklist values don't match. This playbook is the exact 7-step process we've used to migrate 500+ Salesforce orgs with zero data loss and zero go-live delays.
Step 1: Audit & Profile
Before touching any data, profile it. Run a full audit of your source system(s): row counts per object, null rates per field, duplicate rates on key fields (email, phone, external ID), and picklist value distributions. Tools: Salesforce Data Loader export + Excel pivot, or dedicated tools like Validity DemandTools, Tripwire, or dataloader.io. Output: a data quality scorecard with red/yellow/green per object. Budget 1-2 weeks for a mid-size org (50k records per object).
Step 2: Cleanse & Deduplicate
Now fix what you found. Deduplicate using a matching rule (exact email match first, then fuzzy name+domain match). Standardise picklists (map 'USA', 'U.S.', 'United States' → 'United States'). Validate email formats and phone formats. Fill missing required fields from secondary sources. This step takes 2-4 weeks and is where most teams cut corners — don't. Dirty data in Salesforce costs 10x more to fix post-migration.
Step 3: Map Fields
Build a field mapping document: source field → target Salesforce field, with transformation rules (e.g., 'concatenate First_Name + Last_Name → Name', 'convert currency to USD', 'map status Open→In Progress'). Every field must have an owner, a validation rule, and a fallback. Use a spreadsheet with columns: Source Object, Source Field, Target Object, Target Field, Transformation, Default, Owner, Status. This document is your single source of truth — review it with business stakeholders weekly.
Step 4: Build Templates
Create CSV templates matching your field mapping. Include only the fields you're migrating (not every field on the object). Add a 'Source_ID' column to every template for traceability. Test the template with 10 rows manually via Data Loader — verify the import succeeds, fields map correctly, and no validation rules block the load. Fix templates before scaling.
Step 5: Pilot with Bulk API
Load 5-10% of your data (e.g., 2,500 of 50,000 records) using the Bulk API via Data Loader or dataloader.io. Monitor: insert success rate (target >99%), error types (validation, duplicate, trigger), and batch processing time. Fix errors, refine mappings, and re-pilot until success rate >99.5%. This pilot catches governor-limit issues, trigger recursion, and workflow fires before they impact the full load.
Step 6: Validate & Reconcile
After the pilot, validate: run reports in Salesforce comparing record counts (source vs target), spot-check 50 records across objects, verify relationships (accounts→contacts→opportunities link correctly), and confirm roll-up summaries calculate. Reconcile financial fields (total pipeline value) to the penny. Document any discrepancies and fix before cutover.
Step 7: Cutover & Rollback
Plan a cutover window (typically a weekend). Freeze the source system, run the full Bulk API load, validate, and go live. Have a rollback plan: keep the source system running for 2 weeks in read-only mode, and document how to restore from backup if cutover fails. Communicate the cutover to all users 1 week in advance, with a go/no-go decision gate 24 hours before.
"Dirty data in Salesforce costs 10x more to fix post-migration than pre-migration."
Key Takeaway
Profile first, cleanse second, map third — never skip the data quality audit. A 2-week profiling investment saves 10x in post-migration cleanup. Target >99.5% insert success rate before full cutover.