CRM migration
Field-level mapping, validation, and rollback between openCRX and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
openCRX
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between openCRX and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from openCRX to Odoo CRM is a structural migration across fundamentally different data models and technology stacks. openCRX models the sales cycle through abstract contract and contract-position classes, with Accounts split into LegalEntity and Contact subclasses and rich Activity objects for time-tracking. Odoo CRM unifies Lead and Opportunity in crm.lead, maps Companies to res.partner with type=company, and links individual contacts as child records with address relations. We resolve the LegalEntity-Contact hierarchy during scoping, collapsing openCRX's dual-account pattern into Odoo's partner-address model, and we extract activity tracker groupings as tags or stage comments to preserve grouping context. openCRX Workflow Processes and Alert Topics are segment-scoped and non-portable; we deliver a written inventory of every process definition for the customer's admin to rebuild in Odoo Studio.
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 openCRX 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.
openCRX
Account (LegalEntity)
Odoo CRM
res.partner (type=company)
1:1openCRX LegalEntity records map directly to Odoo res.partner with partner_type set to company. The LegalEntity name maps to name, postal address from the related PostalAddress object maps via address fields (street, city, country, zip), and phone from related PhoneNumber maps via phone. openCRX multi-currency settings per LegalEntity map to Odoo partner properties. We resolve the parent-child LegalEntity hierarchy into Odoo's commercial partner link if present.
openCRX
Account (Contact)
Odoo CRM
res.partner (type=contact)
1:manyopenCRX Contact records map to Odoo res.partner with type=contact, linked to a parent res.partner (type=company) via parent_id. Contact's PostalAddress and PhoneNumber relations map to Odoo partner address fields. openCRX's Contact.fullName splits into firstname and lastname on Odoo. We use email as the dedupe key across both LegalEntity and Contact imports. Role-based attributes on openCRX Contact (e.g., buyer, decision-maker) are preserved as tags on the Odoo partner record.
openCRX
Opportunity
Odoo CRM
crm.lead (stage=opportunity)
1:1openCRX Opportunities inherit from the abstract contract hierarchy and carry deal fields, ratings, and associated notes. We map Opportunity to Odoo crm.lead where type=opportunity (versus type=lead for unqualified prospects). The openCRX contract rating maps to crm.lead probability. Stage transitions and timestamps from openCRX activity on the Opportunity are preserved as stage change comments and activity history in Odoo.
openCRX
Quote
Odoo CRM
sale.order (state=quotation)
1:1openCRX Quotes inherit from the same contract hierarchy as Opportunities and Sales Orders, with line positions modelled as contract positions. We map Quote to Odoo sale.order in quotation state. Quote positions map to sale.order.line with product, quantity, price_unit, and discount preserved. openCRX's multi-currency pricing rules carry into Odoo currency_id and price_list_id on the sale.order.
openCRX
Sales Order
Odoo CRM
sale.order (state=sale)
1:1openCRX Sales Orders follow the contract hierarchy and can be transformed from Quotes. The Sales Order header maps to Odoo sale.order with state=sale. Each order position maps to sale.order.line with product_id, product_uom_qty, price_unit, and discount preserved. If the Sales Order was created from a Quote, we map the sale.order.source_document to the original sale.order quotation.
openCRX
Invoice
Odoo CRM
account.move
1:1openCRX Invoices are terminal contract objects in the sales process chain, inheriting from contract classes. We map Invoice headers to Odoo account.move records of type=out_invoice, preserving invoice number, date, and payment terms. Line positions map to account.move.line records. openCRX's payment status and currency context carry into Odoo's invoice state and currency_id. Invoices in openCRX that are posted or reconciled map to Odoo posted account.moves.
openCRX
Product
Odoo CRM
product.product + product.pricelist
1:1openCRX Products with bundles and design-to-order configurations map to Odoo product.product with type=service or type=product. openCRX multi-currency price lists and run-time pricing rules map to Odoo product.pricelist records. openCRX Product.run_time_pricing rules become Odoo pricelist rule records. We capture product.product fields name, default_code, list_price, standard_price, type, and categ_id during import.
openCRX
Activities and Activity Trackers
Odoo CRM
mail.activity
1:1openCRX Activities with time-tracking map to Odoo mail.activity records. Activity Tracker groupings in openCRX (which group related activities under a named tracker) map to Odoo mail.activity.type and stage_id on crm.lead, or to tags if the tracker structure does not map cleanly to a stage. Custom feature definitions on openCRX activity subtypes are identified during scoping and mapped to Odoo custom activity type definitions. Activity timestamps and duration carry into Odoo date_deadline and activity_date_deadline.
openCRX
User-Defined Attributes (DataBinding PropertySet)
Odoo CRM
ir.model.fields (custom fields)
lossyopenCRX custom fields added via DataBinding PropertySet are stored as feature definitions bound to CrxObject at runtime. We identify all active PropertySet custom fields during scoping, map their data types to Odoo field definitions (Char, Text, Float, Integer, Date, Datetime, Many2one, One2many), and pre-create them as ir.model.fields on the relevant res.partner, crm.lead, or product.product model before migration begins. openCRX multi-valued PropertySet attributes become Odoo One2many or Many2many relations where the data model supports it.
openCRX
Attachments
Odoo CRM
ir.attachment
1:1openCRX stores binary attachments linked to objects via its document management layer. We extract attachment metadata and file content from the export process. During Odoo import, attachments re-attach to the corresponding migrated record (res.partner, crm.lead, sale.order) via ir.attachment records with res_model and res_id pointing to the target record. We run the export on a Linux or macOS client to avoid the Windows WebDAV quirks that affect openCRX file access. We flag any attachment whose original file is inaccessible due to WebDAV path issues for manual re-upload.
openCRX
Users and Roles
Odoo CRM
res.users
1:1openCRX role-based security with segment-scoped user assignments maps to Odoo res.users. We extract active users by email from openCRX and match against Odoo user records. openCRX segment membership maps to Odoo sales team membership via crm.team member records. Permissions and access levels from openCRX roles are documented in the migration scope for the customer's admin to reassign manually in Odoo Access Rights configuration. We do not map openCRX role definitions to Odoo groups as the models are structurally different.
openCRX
Workflow Processes
Odoo CRM
Studio automation (rebuild required)
1:1openCRX Workflow Processes are segment-scoped and stored as instance-bound definitions, not as records that can be exported and re-imported. We extract workflow process definitions (trigger conditions, actions, assigned activities) during discovery and deliver them as a written inventory for the customer's admin to rebuild in Odoo Studio. This is not a code migration; it is a process audit and handoff. Alert Topics follow the same constraint and are documented separately.
| openCRX | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account (LegalEntity) | res.partner (type=company)1:1 | Fully supported | |
| Account (Contact) | res.partner (type=contact)1:many | Fully supported | |
| Opportunity | crm.lead (stage=opportunity)1:1 | Fully supported | |
| Quote | sale.order (state=quotation)1:1 | Fully supported | |
| Sales Order | sale.order (state=sale)1:1 | Fully supported | |
| Invoice | account.move1:1 | Fully supported | |
| Product | product.product + product.pricelist1:1 | Fully supported | |
| Activities and Activity Trackers | mail.activity1:1 | Mapping required | |
| User-Defined Attributes (DataBinding PropertySet) | ir.model.fields (custom fields)lossy | Mapping required | |
| Attachments | ir.attachment1:1 | Mapping required | |
| Users and Roles | res.users1:1 | Mapping required | |
| Workflow Processes | Studio automation (rebuild required)1:1 | Mapping required |
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.
openCRX gotchas
No public REST API with documented rate limits
WebDAV client quirks block document access on Windows
"Too many open files" on Linux blocks installation and export
Workflow Processes are segment-scoped and non-portable
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
Source environment audit and export strategy
We audit the openCRX deployment: version, segment count, active custom fields (DataBinding PropertySet), user count, and record volumes across Account, Opportunity, Quote, Sales Order, Invoice, Activity, and Attachment objects. Because openCRX has no public REST API, we work with the customer's DBA to obtain a read-only PostgreSQL or H2 database export, or we script exports through the openCRX application layer. We resolve the open file limit on Linux export hosts (ulimit increase to 2048 or 4096) as a pre-flight check. The output is a written migration scope with record counts and a confirmed export approach.
Destination schema design and custom field pre-creation
We design the Odoo CRM schema before any data moves. This includes enabling the CRM, Sale, and Invoicing apps; creating custom fields on res.partner, crm.lead, sale.order, and product.product to capture openCRX properties that have no direct Odoo equivalent; configuring CRM pipeline stages mapped from openCRX deal stages; and setting up sales team membership from openCRX segment-based role assignments. For openCRX custom objects, we pre-create Odoo custom modules via ir.model and ir.model.fields definitions. Schema is validated in an Odoo test database before production migration begins.
Data extraction and transformation
We extract data from openCRX using the agreed export approach (database read or application-layer script). The extracted data is then transformed: openCRX LegalEntity and Contact records are split and re-parented to fit Odoo's res.partner model; openCRX contract-position hierarchy is flattened to sale.order and sale.order.line records; openCRX activities are mapped to mail.activity with activity tracker groupings preserved as tags or stage comments; openCRX custom PropertySet attributes are mapped to the pre-created Odoo custom fields. We produce a transformation log identifying any records with unmapped fields for the customer's review before import.
Odoo module configuration
We configure Odoo CRM with the apps required for the migration scope: CRM (required), Sale Management (for quotations and sales orders), Invoicing (for account.move records), and Project if activity groupings require it. We configure multi-currency and price lists, assign Odoo sales team structure based on openCRX segments, and set up field-level access for the migration user. Validation rules and required-field constraints are reviewed and, where necessary, temporarily disabled or scoped to exclude migration-context records to prevent import rejections.
Production migration in dependency order
We run production migration in dependency order using Odoo's XML-RPC API: res.partner records first (Companies from LegalEntity, then Contacts with parent_id resolved), then product.product and product.pricelist entries, followed by crm.lead records (with the Lead-Opportunity split applied), then sale.order quotations, confirmed sales orders, and account.move invoices, and finally mail.activity and ir.attachment records. Parent-record lookups (AccountId on Contact, PartnerId on crm.lead, OrderId on sale.order.line) are resolved before each insert batch. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and Workflow handoff
We freeze writes to openCRX during cutover, run a final delta migration for any records modified during the migration window, then enable Odoo as the system of record. We reconcile record counts against the openCRX source export across all objects and spot-check 25-50 records per object for field-level accuracy. We deliver the openCRX Workflow Process inventory document to the customer's admin for rebuild in Odoo Studio. We support a one-week hypercare window for reconciliation issues. We do not rebuild openCRX Workflow Processes as Odoo automations inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
openCRX
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between openCRX and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across openCRX and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between openCRX 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
openCRX: Not publicly documented.
Data volume sensitivity
openCRX 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 openCRX to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your openCRX 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 openCRX
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.