CRM migration
Field-level mapping, validation, and rollback between CRUMP CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
CRUMP CRM
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between CRUMP CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
CRUMP CRM is a verticalised layer on Microsoft Dynamics 365, which means data export is governed by Dynamics 365 licensing tiers and requires direct access to the underlying Dynamics 365 instance rather than a published REST endpoint. We connect as a Dynamics 365 service account with sufficient read permissions, enumerate the active entities in the source org, then pull Contacts, Accounts, Deals, Projects, and Cases in dependency order. We flag inactive modules so we do not import empty containers that will confuse the destination. Odoo CRM is the CRM module within the Odoo ERP ecosystem, so migration involves mapping CRM records to Odoo's crm.lead model while routing project and ticket data to their respective Odoo apps (project.project, helpdesk.ticket). We do not migrate CRUMP CRM's bundled invoicing records unless the customer specifically requires them in Odoo's account.move model; invoicing is a separate scope with its own chart-of-accounts configuration. Workflows, automations, and e-signature configurations do not migrate; we deliver a written inventory for the customer's admin to rebuild in Odoo's Studio or automation tools.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a CRUMP CRM object lands in Odoo CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
CRUMP CRM
Contact
Odoo CRM
res.partner (Contact type)
1:1CRUMP CRM Contacts export from Dynamics 365 as contact records. We map to Odoo res.partner with partner_type=contact, preserving full name, email, phone, street/city/state/zip from Dynamics 365 address fields, and owner (user) references as Odoo res.users lookups where the user email matches. All standard address fields migrate directly; custom contact properties enumerated during the audit phase become res.partner custom fields in Odoo.
CRUMP CRM
Account (Company)
Odoo CRM
res.partner (Company type)
1:1CRUMP CRM Accounts map to Odoo res.partner with partner_type=company. We preserve the parent-child hierarchy if the source org uses parentaccountid, creating company records before contact records so that the child_contact.parent_id lookup is satisfied at insert time. The company domain from the website field becomes the dedupe key during import.
CRUMP CRM
Deal (Opportunity)
Odoo CRM
crm.lead
1:1CRUMP CRM Deals correspond to crm.lead in Odoo CRM. We map deal name to lead name, dealvalue to Odoo's expected_revenue or lst_price, closedate to date_deadline, and dealstage to a crm.stage value that we configure before migration. If the CRUMP CRM org uses multiple deal pipelines, we map each to a separate Odoo Sales Team or a custom stage category in crm.lead.
CRUMP CRM
Project
Odoo CRM
project.project
1:1CRUMP CRM Projects migrate to Odoo project.project. We map project name, status (active/closed), start and end dates, and assigned team members as project.task records within the project. Project-level custom fields from Dynamics 365 enumerate as project.task custom fields or as stage-specific fields in project.project. Note that task-level detail (hundreds of sub-tasks per project) requires explicit scoping: we import the top-level project and first-tier tasks by default, with deeper task hierarchies as a separate import pass.
CRUMP CRM
Ticket (Case)
Odoo CRM
helpdesk.ticket
1:1CRUMP CRM Helpdesk tickets are Cases in Dynamics 365. We map ticket number, subject, description, priority, and status to Odoo helpdesk.ticket fields. We also create helpdesk.team records to match the ticket categories in the source org. Linked contact (customer_id) resolves to the res.partner created from the Contact mapping. Custom ticket fields migrate as helpdesk.ticket custom fields enumerated during audit.
CRUMP CRM
Invoice
Odoo CRM
account.move
1:1Invoicing is part of CRUMP CRM's bundled suite. We export invoice records with line items, totals, and payment status, but the relationship to the originating Deal or Project must be reconstructed from the export since Dynamics 365 does not always expose the full relationship graph in a flat export. Invoice migration to Odoo account.move requires the Odoo accounting app to be installed and configured with the customer's chart of accounts before invoice import begins; this is a separate scope from CRM migration and requires an accounting specialist.
CRUMP CRM
Task
Odoo CRM
project.task
1:manyCRUMP CRM Tasks exist across CRM, project, and helpdesk modules. We deduplicate by taskid across modules, label each task by its origin module (crm_task, project_task, helpdesk_task), and route them to the corresponding Odoo destination: project.task for CRM and project tasks, helpdesk.ticket for helpdesk tasks. Task assignment migrates by resolving the CRUMP CRM owner email to an Odoo res.users record.
CRUMP CRM
User (Team Member)
Odoo CRM
res.users
1:1CRUMP CRM user accounts and role assignments map to Odoo res.users. We resolve by email match. Inactive users in CRUMP CRM are archived in Odoo (active=False) rather than imported as active, which avoids ghost records and keeps the Odoo user licence count clean. Role and team assignments map to Odoo sales team membership (crm.team member) and project team membership.
CRUMP CRM
Custom Entity (Dynamics 365)
Odoo CRM
Custom ir.model.data or x_ model
1:1CRUMP CRM custom entities created on Dynamics 365 are enumerated during the audit phase. Each custom entity and its fields are documented and mapped individually because no two Dynamics 365 deployments share the same custom schema. In Odoo, custom entities map to ir.model records created via developer mode, with corresponding database tables created before migration. Lookup relationships to standard entities (contact, account) are resolved at migration time using external IDs.
CRUMP CRM
Attachment
Odoo CRM
ir.attachment
lossyAttachments stored in Dynamics 365 notes or SharePoint-linked document locations require a separate file-level export pass. We do not migrate binary blobs through the API layer without a dedicated file export strategy. For CRUMP CRM, we export attachments to a flat file store, then import them into Odoo ir.attachment linked to the parent record (res.partner, crm.lead, project.task, helpdesk.ticket) using base64-encoded content via Odoo's CSV import or RPC batch API. Attachment migration is scoped separately from the core record migration and priced as an add-on.
CRUMP CRM
Engagement: Note
Odoo CRM
mail.message
1:1CRUMP CRM Notes migrate to Odoo mail.message records attached to the parent record (res.partner, crm.lead, project.task). Note body migrates as the message body, and the original creation timestamp preserves the activity timeline order. Notes attached to multiple records in Dynamics 365 create multiple mail.message records in Odoo, one per parent.
CRUMP CRM
Engagement: Email
Odoo CRM
mail.message
1:1CRUMP CRM email engagements migrate to Odoo mail.message records with message_type=email. The WhoId (contact) and WhatId (deal or account) from Dynamics 365 resolve to the Odoo res.partner and crm.lead records created during the primary migration pass. Email body and subject transfer directly. Attachments to emails route to ir.attachment and link via mail.message.attachments.
| CRUMP CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (Contact type)1:1 | Fully supported | |
| Account (Company) | res.partner (Company type)1:1 | Fully supported | |
| Deal (Opportunity) | crm.lead1:1 | Fully supported | |
| Project | project.project1:1 | Fully supported | |
| Ticket (Case) | helpdesk.ticket1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Task | project.task1:many | Fully supported | |
| User (Team Member) | res.users1:1 | Fully supported | |
| Custom Entity (Dynamics 365) | Custom ir.model.data or x_ model1:1 | Fully supported | |
| Attachment | ir.attachmentlossy | Fully supported | |
| Engagement: Note | mail.message1:1 | Fully supported | |
| Engagement: Email | mail.message1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
CRUMP CRM gotchas
Dynamics 365 licensing tier gates API access
No publicly documented API endpoint or developer portal
Per-user pricing creates predictable but escalating costs
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Dynamics 365 connection and entity audit
We obtain Dynamics 365 admin credentials or a service account with read permissions on the source org. We connect via the Dynamics 365 Web API (api-version=v9.1 or later) and enumerate all active entities, including custom entities. We document the full entity list, field schemas, and relationship metadata (Lookup, Regarding) for each active module (CRM, Project, Helpdesk). We also determine the Dynamics 365 licence tier during this step to identify any entities restricted by the licence. The output is a written Entity Inventory document that defines exactly which entities will migrate and which are out of scope.
Odoo destination environment review and schema pre-creation
We review the target Odoo instance (Odoo Online/Sh or on-premise) to confirm which apps are installed (CRM, Project, Helpdesk, Invoicing). We pre-create every custom field required for the migration using Odoo Studio for visible fields or directly in the database for developer-mode fields. We configure crm.lead stages to match the CRUMP CRM deal pipeline stages, create helpdesk.team records to match ticket categories, and set up project.project with the required project statuses. Schema pre-creation happens in an Odoo staging or sandbox environment when available.
Data extraction and transformation
We extract all target entities from Dynamics 365 in dependency order: res.partner (companies first), res.partner (contacts with parent_id resolved to company), crm.lead, project.project, project.task, helpdesk.ticket, mail.message (notes and emails), and custom entities last. We transform each record: normalise address fields, convert Dynamics 365 OptionSet values to Odoo selection values, resolve owner email to Odoo res.users id via a pre-built lookup table, and assign external IDs for parent-record resolution during import. We run a data quality pass to flag duplicates, missing required fields, and malformed records before the first import attempt.
Sandbox or staging migration and reconciliation
We run a full migration into the Odoo staging environment using production-like data volume. The customer reconciles record counts (contacts in, accounts in, leads in, projects in, tickets in), spot-checks 25-50 random records against the source Dynamics 365 data, and validates that parent-child relationships resolved correctly. Any mapping corrections, missing fields, or data quality issues surface here. We do not proceed to production migration until the customer signs off on the staging results.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (companies), res.partner (contacts), crm.lead (deals), project.project, project.task, helpdesk.ticket, mail.message (engagement history), custom entities. Each phase emits a row-count reconciliation report showing records attempted, records succeeded, and records skipped with reason. We apply the same external ID strategy in production to maintain parent-record resolution consistency.
Cutover, validation, and workflow handoff
We freeze Dynamics 365 writes during cutover, run a final delta migration of any records modified during the migration window, then designate Odoo as the system of record. We validate key record counts, spot-check critical records (largest deals, highest-priority tickets), and confirm that project and ticket links are intact. We deliver a written Workflow and Automation Inventory document that lists every CRUMP CRM workflow, automation rule, and e-signature configuration requiring rebuild in Odoo Studio or via custom development. We do not rebuild automations as part of the standard migration scope.
Platform deep dives
CRUMP CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across CRUMP CRM and Odoo CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
CRUMP CRM: Not publicly documented; governed by Dynamics 365 licence tier.
Data volume sensitivity
CRUMP CRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during CRUMP CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your CRUMP CRM to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave CRUMP CRM
Other ways to arrive at Odoo CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.