CRM migration
Field-level mapping, validation, and rollback between Axelor CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Axelor CRM
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Axelor CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Axelor CRM to Odoo CRM is a migration between two open-source ERP-adjacent platforms with different core data models. Axelor uses a Lead-to-Third-Party pipeline where conversion produces either a customer or a prospect Third Party, while Odoo uses a distinct Lead-to-Opportunity model with Partner as the unified contact/company object. We extract data from Axelor's XML AppLoader exports, inspect custom Studio XML schemas during scoping to map all custom fields, and resolve the Third-Party-to-Partner conversion logic by splitting on the Axelor isCustomer flag. Agency routing (a distinct Axelor segmentation concept) has no native Odoo equivalent, so we reconstruct it as Odoo Tags on the Partner record. BPM workflows and business rules do not migrate as data; we document every workflow trigger, condition, and action as a written specification for the customer's admin to rebuild in Odoo Studio. Document metadata migrates; binary file transfer is handled separately from the data migration scope.
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 Axelor 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.
Axelor CRM
Lead
Odoo CRM
Lead
1:1Axelor Lead records map directly to Odoo crm.lead. The Lead name, email, phone, source, medium, and expected closing date migrate to Odoo Lead fields. The Axelor lead agency assignments (many-to-many junction) are resolved by creating Odoo tag records for each Axelor Agency and applying them to the corresponding migrated Lead records. Lead priority and rating from Axelor map to Odoo's priority field and a custom stage-based rating field.
Axelor CRM
Third Party
Odoo CRM
Partner
1:1Axelor Third Party is the core Contact/Company entity that covers both customers and prospects. We split the Axelor isCustomer flag: Third Parties where isCustomer is true map to Odoo Partner with customer_rank set to create a Customer Partner; those where isCustomer is false map to a Vendor Partner or remain as Prospect-ranked. The Axelor Third Party type (customer, prospect, vendor, both) drives the Odoo Partner category and is_customer, is_company boolean flags. Parent-child Third Party hierarchies (holding-subsidiary relationships) map to Odoo Partner's parent_id relationship.
Axelor CRM
Contact
Odoo CRM
Partner (individual, is_company=False)
1:manyAxelor Contacts are distinct child records linked to a parent Third Party. During migration, we create Odoo Partner records with is_company=False for each Axelor Contact and set the parent_id to the Partner created from the Contact's parent Third Party. The Axelor Contact's role, function, and direct phone/email fields map to the Odoo Partner function field and contact fields. If the parent Third Party does not yet exist at Contact migration time, we create it first.
Axelor CRM
Opportunity
Odoo CRM
Opportunity (crm.lead with type=opportunity)
1:1Axelor Opportunities map to Odoo Opportunities (crm.lead with type='opportunity'). The Axelor stage name, expected amount, and probability migrate to Odoo's stage_id and expected_revenue fields. The partner_id on Odoo Opportunity resolves to the Partner created from the linked Third Party. If the Axelor Opportunity references a Contact (salePartner), that Contact's parent Third Party becomes the Odoo partner_id.
Axelor CRM
Opportunity Stages
Odoo CRM
Stage
lossyAxelor Opportunity stage names and their sequence order map to Odoo CRM Stage records within the customer's Pipeline. We create stages in the same sequence order and assign probabilities matching the Axelor stage configuration. If the Axelor deployment uses custom stage names (beyond the default New, Qualified, Proposal, Won, Lost), we preserve them in Odoo stage names to avoid data misinterpretation.
Axelor CRM
Recurrent Revenue Fields
Odoo CRM
Custom Fields on Opportunity
lossyThe recurrent revenue amount and default recurring period fields on Axelor Opportunities exist only when 'Manage recurrent revenue on opportunities' is activated in Axelor CRM settings. We detect these fields during scoping by inspecting the Opportunity XML schema. When present, we create matching custom fields on the Odoo crm.lead model (recurrent_amount, recurrent_period) before Opportunity data import. The customer configures these fields in Odoo Studio post-migration.
Axelor CRM
Agencies
Odoo CRM
Tags
1:manyAgencies are a distinct Axelor CRM concept for routing and segmenting leads and Third Parties. Odoo has no native Agency object. We extract the Agency records as a distinct dataset, create Odoo crm.tag records for each Agency, and apply them to the migrated Leads and Partners. The many-to-many junction between Lead and Agency is resolved as a multi-tag assignment on each Lead during migration. Customers requiring agency-based routing in Odoo beyond tagging can configure this via Odoo Sales Team assignment rules.
Axelor CRM
Custom Objects (Studio)
Odoo CRM
Custom Models (ir.model) or Custom Fields
1:1Axelor Studio custom objects are defined in XML and compiled to JPA models at deployment. We inspect the XML schema for each custom object during scoping, infer field names and data types, and create corresponding Odoo custom models via the Studio interface or a technical module. Custom fields on standard objects map to Odoo custom fields with equivalent types (char, integer, float, date, many2one, selection). Objects defined in XML as enums map to Odoo selection fields. This work is scoped as technical configuration during migration; the customer provides the XML model definitions during discovery.
Axelor CRM
Owner
Odoo CRM
User
1:1Axelor user records include roles, organizational structure, and access permissions used for record ownership assignment. We extract the user identity data (name, email, active status) and match by email against the destination Odoo User table. Owners without a matching Odoo User are held in a reconciliation queue; the customer's Odoo admin provisions missing users before record import resumes. Role and permission schema do not migrate; Odoo's access rights model is fundamentally different from Axelor's role-based configuration.
Axelor CRM
Documents / Attachments
Odoo CRM
Attachments (ir.attachment)
1:1Axelor DMS stores binary documents linked to CRM records. We export document metadata (filename, URL, file size, record reference) and include it in the migration scope as an attachment manifest. The actual binary files require a separate file transfer step using SFTP or cloud storage, outside the API-based migration scope. We provide the attachment manifest mapping each Axelor document to its target Odoo record (res_model, res_id) so the customer's admin can finalize the file transfer post-migration.
Axelor CRM
Engagement: Note
Odoo CRM
Note (mail.message)
1:1Axelor notes linked to Leads, Third Parties, or Opportunities migrate to Odoo mail.message records with message_type='comment' on the corresponding Odoo record. The note body, author, and creation timestamp preserve. Notes with attachments resolve the attachment references against the attachment manifest to link files to the Odoo record.
Axelor CRM
Engagement: Task / Meeting
Odoo CRM
Task (project.task) / Calendar Event
1:1Axelor task and meeting engagements linked to CRM records migrate to Odoo project.task records for tasks (with project_id=None for CRM-only tasks) and calendar.event records for meetings. The assignee maps from Axelor owner to Odoo User via the owner reconciliation queue. Meeting location and attendee information migrates to Odoo calendar.event and calendar.attendee records. Historical task and meeting data is migrated after Leads, Third Parties, and Opportunities are in place so that the parent record references resolve.
| Axelor CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | Lead1:1 | Fully supported | |
| Third Party | Partner1:1 | Fully supported | |
| Contact | Partner (individual, is_company=False)1:many | Fully supported | |
| Opportunity | Opportunity (crm.lead with type=opportunity)1:1 | Fully supported | |
| Opportunity Stages | Stagelossy | Fully supported | |
| Recurrent Revenue Fields | Custom Fields on Opportunitylossy | Mapping required | |
| Agencies | Tags1:many | Mapping required | |
| Custom Objects (Studio) | Custom Models (ir.model) or Custom Fields1:1 | Mapping required | |
| Owner | User1:1 | Fully supported | |
| Documents / Attachments | Attachments (ir.attachment)1:1 | Fully supported | |
| Engagement: Note | Note (mail.message)1:1 | Fully supported | |
| Engagement: Task / Meeting | Task (project.task) / Calendar Event1: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.
Axelor CRM gotchas
Version-to-version migration breaks schema and workflows
BPM workflows and business rules do not export as data
No publicly documented API rate limits or developer portal
Custom Studio objects have no standard export format
Recurrent revenue fields are configuration-dependent
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
Discovery and source version scoping
We audit the source Axelor CRM deployment across version (6.1.x through 6.5.x), installed apps, custom Studio objects, BPM workflow count, agency count, data volumes per object (Leads, Third Parties, Contacts, Opportunities, engagements), and whether the recurrent revenue configuration is active. We inspect the Opportunity XML schema to confirm whether recurring revenue fields are present. We extract and review the Axelor AppLoader export package structure and identify any XML model definition files for custom objects. This output is a written migration scope that identifies which objects migrate as data, which require XML schema inspection, and which are configuration items requiring manual rebuild.
Schema inspection and field mapping design
We inspect the XML model definitions for all custom Studio objects, infer field names and data types, and design the corresponding Odoo schema: custom fields on standard models (via Odoo Studio) or custom models (via a technical module). We design the Third Party-to-Partner type split rules, the Agency-to-Tag mapping, and the Contact parent-Third-Party resolution order. We map Axelor Opportunity stages to Odoo CRM stages with probability alignment. The schema design is validated against the customer's Odoo instance (new or existing) before any data extraction begins.
Data extraction and staging
We extract data from Axelor via AppLoader exports and direct database query for objects not fully covered by AppLoader. We stage the extracted data in a structured CSV format with normalized field names, applying the Third Party type split, Contact parent resolution, and Agency-to-Tag junction resolution. We run deduplication checks on Third Party records (matching on company name, domain, email) to identify duplicates before import. Data quality issues (null required fields, invalid formats) are flagged in a pre-import audit report with remediation recommendations.
Owner and user reconciliation
We extract every distinct Axelor Owner referenced on Lead, Third Party, Contact, Opportunity, and engagement records and match by email against the destination Odoo User table. Any Owner without a matching Odoo User goes to a reconciliation queue for the customer's Odoo admin to provision. Agency-to-Odoo-User routing assignments are documented as a reference table since routing automation does not migrate. Migration cannot proceed past this step because Odoo requires a valid res_users reference for record assignment.
Production migration in dependency order
We run production migration in record-dependency order: Partners (from Third Parties, split by type), Contacts (with parent_id resolved to Partner), Leads (with tag assignments applied), Opportunities (with partner_id and stage_id resolved), custom object data, engagement history (Notes, Tasks, Meetings). Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC API with batch chunking and throttling to avoid overwhelming the destination instance. Attachment metadata is delivered as a manifest for the customer's separate file transfer step.
Cutover, validation, and automation rebuild handoff
We freeze Axelor writes during cutover, run a final delta migration of records modified during the migration window, then enable Odoo as the system of record. We deliver the BPM workflow inventory document (for Axel's rebuilding in Odoo Studio) and the Agency routing reference table. We support a one-week hypercare window for reconciliation issues raised by the customer's sales team. We do not rebuild BPM workflows or routing automation in Odoo as part of the migration scope; those are documented for the customer's Odoo admin to handle separately.
Platform deep dives
Axelor CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Axelor CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Axelor CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Axelor CRM and Odoo CRM.
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
Axelor CRM: Not publicly documented.
Data volume sensitivity
Axelor CRM exposes a bulk API — large-volume migrations stream efficiently.
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 Axelor CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Axelor 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 Axelor 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.