Phase 0
Decide & Plan
Decisions that must be made before any extraction work starts.
-
Risk if skipped: Late-discovered Modules force schema changes mid-migration and trigger re-runs of upstream transform jobs.
-
Risk if skipped: Choosing a lower edition than the data requires blocks Sandbox testing and many-to-many relationships entirely.
-
Risk if skipped: Without a decision, reports and activity timelines look like every record was created on cutover day.
-
Risk if skipped: Provisioning in the wrong DC cannot be reversed by moving data later — it requires a fresh org and a second migration.
-
Risk if skipped: Without written criteria, the migration drags on indefinitely because nobody can declare it done.
Phase 1
Pre-Migration Prep
Everything that must be true before the first byte leaves the source.
1a. Source-system audit and cleansing
-
Risk if skipped: Without a baseline, you cannot prove what was lost in transit.
-
Risk if skipped: Duplicate Contacts post-load split activity history across two records and break reporting.
-
Risk if skipped: Rows with empty required fields are silently skipped by the importer and do not appear in the destination.
-
Risk if skipped: Missing source stages cause Deal rows to be skipped with a pipeline-stage-mismatch error during import.
1b. Destination-system setup
-
Risk if skipped: Skipping Sandbox forces every test to happen in production where errors are visible to end users.
-
Risk if skipped: Changing time zone after import does not retroactively re-stamp records and creates an off-by-N-hours bug on every datetime field.
-
Risk if skipped: Silent column drops are the single most common cause of Phase 6 reconciliation gaps.
-
Risk if skipped: Unknown picklist values are rejected row-by-row and the row is skipped.
-
Risk if skipped: Importing Deals without the matching triple in place causes every Deal in that pipeline to be skipped.
-
Risk if skipped: Without External ID, re-running a failed import duplicates every record.
-
Risk if skipped: An active welcome-email workflow during a 50,000-Contact load emails every contact at cutover.
1c. People prep
Phase 2
Source Export
Get all data out of the source system in a form you can transform.
-
Risk if skipped: Exporting Contacts without the Account foreign key forces a manual re-association later, which is error-prone at volume.
-
Risk if skipped: Treating email history as a standard Note loses the threading and sender metadata.
-
Risk if skipped: Files larger than the per-file cap will not load and silently leave records unlinked.
Phase 3
Transform & Map
The data-engineering core. Take raw exports and produce Zoho-shaped files.
3a. Mapping spreadsheet
-
Risk if skipped: Without a single mapping document, transform logic drifts between engineers and reconciliation finger-pointing becomes unavoidable.
-
Risk if skipped: Mismatched picklist values cause row-level skips at insert time, with the row reported in the import error log but not loaded.
3b. Data transformation
-
Risk if skipped: Date-format mismatches cause the entire CSV to be rejected at the validation step.
-
Risk if skipped: Non-UTF-8 files cause accented characters to corrupt to mojibake (e.g., 'café' → 'café').
-
Risk if skipped: Rows exceeding field width are skipped during Bulk Write.
3c. Relationship and audit-trail decisions
-
Risk if skipped: Reporting on Created Time will show every record dated to migration day, which destroys time-series trend analysis.
-
Risk if skipped: Re-uploading 100 GB of attachments into a Professional org (10 GB cap) saturates storage and blocks new records.
-
Risk if skipped: Attempting to model many-to-many on Standard or Professional editions silently flattens to one-to-many and loses associations.
3d. CRM-specific transforms
-
Risk if skipped: Records are skipped on layout-pipeline mismatch (deal pipeline does not belong to selected layout) and pipeline-stage mismatch (stage does not belong to deal pipeline). Both errors live in import history.
-
Risk if skipped: Loading the display label instead of the reference value causes every row to fail picklist validation.
-
Risk if skipped: Active Blueprints reject Stage updates that violate transition rules, causing import partials.
-
Risk if skipped: Pipeline velocity reports for periods before cutover will be empty.
-
Risk if skipped: Loading opted-out contacts as opted-in is a CAN-SPAM and GDPR violation.
Phase 4
Sandbox Test Migration
Catch every problem in Sandbox before it costs you in production.
-
Risk if skipped: Sampling fewer than 10 records misses field-level drops that only surface on certain record subtypes.
-
Risk if skipped: An untested triple discovered in production blocks the entire Deal-load wave.
-
Risk if skipped: Character-encoding bugs are invisible until a user opens the record and sees mojibake.
-
Risk if skipped: A 'works on 5 percent' test does not surface throughput cliffs that only appear at 50,000+ records.
-
Risk if skipped: Verbal sign-offs evaporate when reconciliation surfaces an issue post-cutover.
Phase 5
Production Cutover
Tightly sequenced execution window. Densest cluster of risk.
-
Risk if skipped: Skipping the delta loses every record created between Phase 2 export and cutover.
-
Risk if skipped: An active welcome-email workflow at cutover sends thousands of accidental emails in minutes.
-
Risk if skipped: Out-of-order loads leave lookup fields blank with no error and require a second pass to repair.
-
Risk if skipped: Insert-only loads on partial failure create duplicate records on retry.
-
Risk if skipped: Pushing through with an unexplained count delta makes Phase 6 reconciliation impossible.
-
Risk if skipped: Without a clean post-load snapshot, partial rollback requires per-record manual cleanup.
Phase 6
Validate
Prove the migration was correct before letting end users in.
6a. Reconciliation
-
Risk if skipped: Unexplained deltas typically trace to skipped picklist values, missing required fields, or layout-pipeline mismatches.
-
Risk if skipped: Null External IDs force every subsequent upsert to treat the record as new, creating duplicates.
6b. Relationship validation
-
Risk if skipped: Orphaned activities sit in the global Activities view but never appear in a sales rep's record-level timeline.
6c. Audit and compliance
-
Risk if skipped: Audit logs are retained 3 years by default; pulling them now is cheap, retrieving them later may not be possible.
6d. User-acceptance check
6e. Sign-off
-
Risk if skipped: Proceeding without sign-off leaves the project in a perpetual 'almost done' state.
Phase 7
Post-Migration Cleanup
Wrap up so the team can move on.
-
Risk if skipped: Marketing-automation re-sync without External-ID checks duplicates every contact.
-
Risk if skipped: Discarding exports too early eliminates forensic options if a data-quality issue surfaces months later.
Watch list
Risks to track throughout
These risks live across multiple phases — keep an eye on them from kickoff through cutover.
-
Layout-Pipeline-Stage triple mismatches silently skip Deals
Zoho CRM models Deals as a triple of Layout + Pipeline + Stage. A Deal row whose Pipeline does not belong to the selected Layout, or whose Stage does not belong to the selected Pipeline, is skipped at import time with a row-level error in import history but not surfaced as a job failure. Track this risk from Phase 1 (build the triples) through Phase 3 (mapping table) through Phase 4 (test every triple) through Phase 6 (reconcile per-Pipeline counts).
-
Bulk Write throughput and concurrency ceilings
Bulk Write caps at 200,000 records per job and 5 concurrent jobs per org; per-call upsert caps at 100 records per batch. A 1-million-record load that fits on paper still needs job orchestration. Time the Phase 4 Sandbox runs and size the Phase 5 cutover window accordingly, including buffer for re-runs.
-
Picklist reference-value vs display-label mismatch
Every picklist in Zoho CRM has two strings: the display label users see and the reference value that bulk loads match against. Bulk Write and upsert key off reference value. Loading display labels causes silent row-level rejections. Pull picklist metadata in Phase 3 and validate again in Phase 4.
-
System-managed Created Time cannot be overridden on bulk load
Zoho CRM stamps Created Time and Modified Time at the moment of insert. Bulk Write does not let you supply a historical timestamp for these fields. The workaround is a 'Source Created Date' custom field per Module, populated during transform. Any time-series report that depends on Created Time will be wrong for pre-cutover records — flag this to the analytics team in Phase 0.
Pair this with the long-form guide
The complete Zoho CRM migration guide
Same research, written as prose: data model, import mechanisms, mapping strategy, pitfalls, and partner landscape.