CRM migration checklist

Migration Checklist: Moving to Odoo CRM

An exhaustive 8-phase punch list for moving contacts, pipeline, activities, and attachments into Odoo CRM using its native import, ORM, and RPC paths.

129 tasks 4–14 weeks typical Updated May 27, 2026
Odoo CRM
Contacts
Companies
Deals
Leads
Activities
Notes
0 of 129 tasks complete

Phase 0

Decide & Plan

Lock scope, deployment shape, and edition before any data moves.

  • Risk if skipped: Picking Odoo Online and then discovering you need server-side scripts forces a re-platform mid-project.

  • Risk if skipped: Restoring an Enterprise database into a Community container marks Enterprise modules as 'not installable, skipped' and breaks views that reference them.

  • Risk if skipped: Mapping against the wrong major produces import files that reference fields renamed in the target version.

  • Risk if skipped: Discovering a residency conflict after go-live forces a database export, region re-provision, and re-import.

  • Risk if skipped: Without explicit success criteria the project never formally closes and stretches indefinitely.

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 count you cannot prove completeness after cutover.

  • Risk if skipped: Duplicates carried into res.partner inflate counts and split activity history across two records that never get re-merged.

  • Risk if skipped: Mismatched country strings either fail the import row or silently leave country blank.

  • Risk if skipped: Skipping the inventory means custom fields are discovered piecemeal during transform and re-mapping costs days.

1b. Destination Odoo tenant setup

  • Risk if skipped: Skipping the sandbox forces every test against production and contaminates real data with test rows.

  • Risk if skipped: Changing the company timezone after import shifts every imported datetime by the offset delta and corrupts activity due-dates.

  • Risk if skipped: Importing leads with a missing team_id reference sets every lead to the default team and breaks pipeline-by-team reporting.

  • Risk if skipped: Mapping source stages to a stage that does not yet exist drops every affected lead to the default 'New' stage and erases pipeline position.

  • Risk if skipped: Discovering a missing custom field after a 50k-row load forces a transform, file re-build, and re-import.

  • Risk if skipped: Files over the cap fail silently in batch imports and leave records with broken references.

1c. People prep

  • Risk if skipped: Without a named responder, the inevitable cutover-day questions land in random inboxes and frustrate users.

Phase 2

Source Export

Pull a complete, timestamped snapshot of source data and configuration.

  • Risk if skipped: Forgetting the source ID column makes idempotent re-runs impossible and forces full re-imports.

  • Risk if skipped: Mixing activities and messages into one file makes the post-import audit trail impossible to reconstruct.

  • Risk if skipped: Files without a manifest cannot be re-linked to their parent records and become orphaned uploads.

  • Risk if skipped: Without an export timestamp you cannot compute the delta and risk losing every change made between export and cutover.

Phase 3

Transform & Map

Reshape source exports into Odoo-shaped CSVs.

3a. Mapping spreadsheet

  • Risk if skipped: A mapping kept in heads or chat threads cannot be audited and produces inconsistent transforms across re-runs.

  • Risk if skipped: Without external IDs, re-running the importer creates duplicate records instead of updating the existing ones.

3b. Data transformation

  • Risk if skipped: Day-month inversion on dates produces silently-wrong close_date values that misreport entire quarters.

  • Risk if skipped: Encoding mismatches surface as mojibake on contact names that have to be reimported per row.

  • Risk if skipped: Unescaped newlines in note bodies split one row into two and shift every subsequent column.

3c. Relationship and audit-trail decisions

  • Risk if skipped: Loading raw integer IDs into Many2one columns ties imports to a specific database instance and breaks if you ever rebuild or migrate again.

  • Risk if skipped: Failing to preserve historical timestamps makes age-based pipeline reporting (e.g. 'leads older than 30 days') wrong for the first month post-cutover.

  • Risk if skipped: Loading crm.lead before res.partner causes every partner_id reference to fail and every lead to import with a null contact.

3d. CRM-specific transforms

  • Risk if skipped: An unmapped source stage drops every lead in that stage to Odoo's default 'New' stage, erasing forecast position.

  • Risk if skipped: Importing the human-readable label when the field's internal key differs causes the row to fail silently for that column and leave a null value.

  • Risk if skipped: Without parent_id, the chatter shows a flat list of unrelated messages instead of conversation threads.

  • Risk if skipped: Misallocated company_id values make records invisible to users in the correct company and trigger record-rule access errors.

Phase 4

Sandbox Test Migration

Run the full migration against a duplicate database before touching production.

  • Risk if skipped: Loading the full file first burns hours debugging issues a 1% sample would have caught in minutes.

  • Risk if skipped: Bulk count matches can mask field-level corruption that only field-by-field comparison surfaces.

  • Risk if skipped: These edge cases surface encoding and escaping bugs that only fail on the rows your data actually contains.

  • Risk if skipped: Chatter that imports without author or timestamp is functionally useless and forces a re-load of every message.

  • Risk if skipped: Skipping a full-volume rehearsal means cutover-day surprises around throughput ceilings and timeout behavior.

  • Risk if skipped: Aggressive parallel writes against Odoo Online trip platform throttling and stall the load mid-batch.

  • Risk if skipped: Non-idempotent imports compound every retry into duplicate records and force a destructive cleanup.

Phase 5

Production Cutover

Sequenced execution window — one shot, fully scripted.

  • Risk if skipped: Late source writes that arrive after the final export become silent data loss.

  • Risk if skipped: Active automations during bulk load fire thousands of redundant notifications and inflate the activity log.

  • Risk if skipped: Hard-coding source IDs into res_id leaves every activity pointing at a non-existent or unrelated record.

  • Risk if skipped: Pushing attachments above 128 MiB or above the throughput ceiling causes silent failures that orphan the parent record.

  • Risk if skipped: Cascading row-count drift across models compounds and becomes unprovable later.

Phase 6

Validate

Prove correctness before users get the keys.

6a. Reconciliation

  • Risk if skipped: Skipping count reconciliation lets multi-thousand-row drops go unnoticed until users complain.

  • Risk if skipped: Pipeline value mismatch is the single most-noticed cutover defect by sales leadership.

6b. Relationship validation

  • Risk if skipped: Broken threading forces a re-load of mail.message after go-live and pollutes the chatter with duplicate ungrouped messages.

6c. Audit and compliance

6d. User-acceptance check

  • Risk if skipped: Without UAT, the first day post-cutover surfaces issues that should have been caught before users got the keys.

6e. Sign-off

  • Risk if skipped: Verbal sign-off creates downstream disputes about what 'done' meant.

Phase 7

Post-Migration Cleanup

Decommission the source, retire migration scaffolding, capture lessons.

  • Risk if skipped: Sales leadership without their reports stops trusting the migrated data even when it is correct.

  • Risk if skipped: Active migration-tier credentials become the path of least resistance for accidental or malicious bulk writes.

Watch list

Risks to track throughout

These risks live across multiple phases — keep an eye on them from kickoff through cutover.

  • Community vs Enterprise feature gap surfacing mid-migration

    Studio, Documents, predictive lead scoring, and several mail features only exist on Enterprise. Sandbox testing against an Enterprise database and then deploying onto Community causes views to break with 'not installable, skipped' errors and silently drops fields. Verify edition at every phase boundary, not just at Phase 0.

  • Selection-field internal-key vs label drift

    Odoo Selection fields store the internal key but display the label. Importers sometimes accept either, but rows mixing the two fail non-deterministically. Hold a single discipline across every CSV: export the internal key, import the internal key, validate against the internal key. This risk re-emerges every time a Selection field is added to the mapping.

  • Throughput ceilings and per-attachment caps compound across runs

    Odoo Online throttles bulk writes at the tenant level, and per-attachment files cap at 128 MiB by default. Test runs, mapping fixes, and re-loads compound throughput consumption; oversize attachments fail silently in batches. Track cumulative bulk-write volume and pre-flight attachment sizes from Phase 4 onward.

  • External-ID hygiene degrading after the first import

    The '__export__.<source>_<id>' convention is what makes safe re-runs possible. If any phase loads a model without external IDs (mail.message, ir.attachment via raw ORM calls, ad-hoc admin imports), the next re-run creates duplicates rather than updating. Audit external-ID coverage at the end of every phase that writes data.

Pair this with the long-form guide

The complete Odoo CRM migration guide

Same research, written as prose: data model, import mechanisms, mapping strategy, pitfalls, and partner landscape.