CRM migration
Field-level mapping, validation, and rollback between Oracle CRM On Demand and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Oracle CRM On Demand
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Oracle CRM On Demand and Odoo CRM.
Complexity
BStandard
Timeline
4-7 weeks
Overview
Moving from Oracle CRM On Demand to Odoo CRM is a platform migration that requires handling a legacy enterprise data model against a modular open-source ERP architecture. Oracle CRM On Demand stores Accounts, Contacts, Leads, Opportunities, and Activities in a flat relationship model, while Odoo CRM represents these as res.partner ( Contacts and Companies unified), crm.lead (Leads and Opportunities unified via pipeline stages), and mail.activity (Tasks, Calls, Meetings) with attachments stored in ir.attachment. The Oracle 30 req/min REST API rate limit demands careful batch sequencing, and the 168-hour export file retention window means we download immediately upon job completion. We resolve owner mapping via email lookup, handle custom object schema extraction from Oracle before Odoo model creation, and preserve Opportunity-to-Account and Contact-to-Account lookups through ID resolution at migration time. Workflow Rules, Assignment Rules, and Oracle's Migration Tool do not migrate; we deliver a written inventory of automation logic for Odoo Studio and server-action rebuild. Odoo's Community edition is free for core CRM; Enterprise adds Studio, a mobile app, and multi-company support, which determines the final migration destination tier.
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 Oracle CRM On Demand 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.
Oracle CRM On Demand
Account
Odoo CRM
res.partner (Company role)
1:1Oracle Accounts map to Odoo res.partner records with partner_type set to 'contact' = False and is_company = True. Oracle Account Name becomes res.partner name; Oracle address fields map to street, street2, city, state_id, zip, and country_id. Oracle Account Owner (user) maps to create_uid via email lookup. We resolve the Oracle Account row ID to the Odoo res.partner ID before importing any Contact records that reference it.
Oracle CRM On Demand
Contact
Odoo CRM
res.partner (Contact role)
1:1Oracle Contacts map to Odoo res.partner records with partner_type set to 'contact' = True and is_company = False. Oracle Contact Name, Email, Phone, Mobile, Job Title, and Department map to the corresponding res.partner fields. The parent_id lookup references the res.partner Account record resolved in the Account migration phase. We deduplicate by email using a pre-import dedup check and flag duplicates for customer review before insert.
Oracle CRM On Demand
Lead (Standard tier)
Odoo CRM
crm.lead (Lead stage)
1:1Oracle Leads (Standard CRM On Demand tier) map to Odoo crm.lead records with type = 'lead'. Oracle Lead_Status maps to crm.lead stage_id; Oracle Lead_Source maps to crm.lead source_id; Oracle Rating maps to crm.lead priority. Custom lead fields migrate as char, text, or selection fields on the crm.lead model. Note that the Enterprise Lead Referral tier allows create-only access via the API with no edit, convert, or analytics, which restricts what lead history can be extracted; we flag this during discovery and scope accordingly.
Oracle CRM On Demand
Opportunity
Odoo CRM
crm.lead (Opportunity stage)
1:1Oracle Opportunities map to Odoo crm.lead records with type = 'opportunity'. Oracle Opportunity Name becomes crm.lead name; Oracle Revenue and Probability map to expected_revenue and probability; Oracle Close Date maps to date_deadline; Oracle Account maps via the Account lookup resolved in the Account migration phase. The pipeline stage from Oracle maps to the corresponding Odoo crm.stage ID, which we configure as a custom pipeline before migration.
Oracle CRM On Demand
Pipeline Stages (Opportunity Stage)
Odoo CRM
crm.stage
lossyEach Oracle Opportunity Stage becomes an Odoo crm.stage record within the CRM pipeline. We create the stages in Oracle stage order with the same probability percentages from Oracle (rounded to integer). Odoo's Kanban stage ordering is set by the sequence field. If Oracle has closed won and closed lost stages, we map them to Odoo's corresponding lost_closed and won stage states.
Oracle CRM On Demand
Task
Odoo CRM
mail.activity
1:1Oracle Tasks map to Odoo mail.activity records with activity_type_id set to the Odoo standard 'To Do' activity type. Oracle Task Subject becomes mail.activity summary; Oracle Status maps to mail.activity functional state (done vs open); Oracle Due Date maps to mail.activity date_deadline. The res_model and res_id on the activity record reference the migrated crm.lead or res.partner record.
Oracle CRM On Demand
Call
Odoo CRM
mail.activity
1:1Oracle Call records map to Odoo mail.activity with activity_type_id set to the Odoo 'Call' activity type. Call Duration from Oracle maps to a custom integer field crm_call_duration_seconds on the activity. Call Subject becomes activity summary; Call Date becomes date_deadline or activity_date_deadline. We store Oracle call disposition in a custom activity field for audit.
Oracle CRM On Demand
Appointment
Odoo CRM
calendar.event
1:1Oracle Appointments map to Odoo calendar.event records. Oracle Appointment Subject becomes calendar.event name; Oracle Start Date/Time and End Date/Time map to start and stop on the event; Oracle Location maps to location. Attendees map to calendar.attendee records linked by email to the migrated res.partner or crm.lead. Recurring appointments in Oracle require Odoo calendar recurrence configuration to replicate.
Oracle CRM On Demand
User/Owner
Odoo CRM
res.users
1:1Oracle Named Users referenced as Owner on any record map to Odoo res.users by email address match. We extract every distinct Oracle Owner from Account, Contact, Opportunity, and Activity records during discovery, produce a user mapping table, and reconcile against the destination Odoo res.users table. Any Oracle Owner without a matching Odoo user goes to a provisioning queue for the customer's Odoo admin to create before record migration proceeds.
Oracle CRM On Demand
Custom Object
Odoo CRM
ir.model.model (custom crm model)
1:1Oracle custom objects have tenant-specific schemas accessible via the Oracle Web Services API. We reverse-engineer each custom object's field definitions (field name, type, required, picklist values) from the Oracle API before creating the corresponding Odoo model. The Odoo model is created via ir.model and ir.model.fields with the correct field type (char, text, selection, many2one, one2many) matching the Oracle type. Custom object data migrates after all standard object parent lookups are resolved.
Oracle CRM On Demand
Attachment
Odoo CRM
ir.attachment
1:1Oracle attachments associated with records (stored as URLs pointing to Oracle's document server or as binary blobs) map to Odoo ir.attachment records. We extract attachment content via the Oracle API, store it in our migration workspace, and create ir.attachment records with res_model pointing to the migrated model (crm.lead, res.partner) and res_id pointing to the migrated record ID. Large attachment volumes require separate scoping and may involve file-size limits on the destination Odoo instance.
Oracle CRM On Demand
Note
Odoo CRM
mail.message
1:1Oracle Notes migrate as Odoo mail.message records with message_type = 'comment'. The note body becomes mail.message body (HTML). We link each note to the parent record via res_model and res_id. If Oracle notes are associated with multiple records, we create individual mail.message records per link or consolidate under a primary record at the customer's direction.
| Oracle CRM On Demand | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner (Company role)1:1 | Fully supported | |
| Contact | res.partner (Contact role)1:1 | Fully supported | |
| Lead (Standard tier) | crm.lead (Lead stage)1:1 | Fully supported | |
| Opportunity | crm.lead (Opportunity stage)1:1 | Fully supported | |
| Pipeline Stages (Opportunity Stage) | crm.stagelossy | Fully supported | |
| Task | mail.activity1:1 | Fully supported | |
| Call | mail.activity1:1 | Fully supported | |
| Appointment | calendar.event1:1 | Fully supported | |
| User/Owner | res.users1:1 | Fully supported | |
| Custom Object | ir.model.model (custom crm model)1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Note | 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.
Oracle CRM On Demand gotchas
REST API rate limit of 30 req/min is a migration bottleneck
List exports expire after 168 hours
Migration Tool requires identical release versions
Enterprise Lead Referral tier limits lead functionality
Export field access gated by user role privileges
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 data audit
We audit the Oracle CRM On Demand tenant across active modules (Standard vs Enterprise Lead Referral), API user privileges (ensuring the export account has List-Export-All-Fields privilege), record counts for Accounts, Contacts, Leads, Opportunities, Activities, and custom objects, and existing Oracle custom object schema definitions. We extract a full object list via the Oracle Web Services API to reverse-engineer the custom object field map before designing the Odoo destination. The discovery output is a written migration scope document covering record volumes, custom object count, and any Oracle tier restrictions affecting data accessibility.
Destination schema design and Odoo model creation
We design the Odoo CRM destination schema: crm.lead stages (pipeline stages matching Oracle opportunity stages), res.partner fields, custom ir.model entries for each Oracle custom object, and Odoo user accounts for every Oracle Named User that appears as Owner. We create all custom models via Odoo's ir.model and ir.model.fields before any data import so that parent lookup references are satisfied at insert time. Schema changes are validated in an Odoo staging database before production deployment.
API extraction with rate-limit handling and file retention
We extract data from Oracle CRM On Demand using the REST API with client-side throttling to honor the 30 req/min limit. Large record sets are queued in batches; we wait for the one-minute window reset before resuming. We trigger Oracle list exports for bulk data, download files immediately upon job completion (within the 168-hour window), and store them in our migration workspace. Export is always run under an administrator account with the List-Export-All-Fields privilege to avoid role-gated field restrictions.
Owner and account mapping with reconciliation
We extract every distinct Oracle Owner from Account, Contact, Opportunity, and Activity records and match by email address against the destination Odoo res.users table. Any Oracle Owner without a matching Odoo user is placed in a reconciliation queue for the customer's Odoo admin to provision before record import resumes. Oracle Accounts are mapped to res.partner (company) records first so that Contact imports can resolve the parent_id reference at insert time.
Production migration in dependency order
We run production migration in strict dependency order: res.users (provisioned), res.partner as companies (from Oracle Accounts), res.partner as contacts (from Oracle Contacts with parent_id resolved), crm.lead as leads (from Oracle Leads), crm.lead as opportunities (from Oracle Opportunities with partner_id resolved), calendar.event (from Oracle Appointments), mail.activity (from Oracle Tasks and Calls), mail.message (from Oracle Notes), custom model records (last, with all lookups satisfied), and ir.attachment (attachments linked by res_model and res_id). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, delta sync, and workflow handoff
We freeze Oracle CRM On Demand writes during cutover, run a delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver a written inventory of Oracle Workflow Rules and Assignment Rules with their trigger events, conditions, and actions documented for Odoo Studio server-action rebuild. We do not rebuild Oracle workflows as Odoo automations inside the migration scope; that work is a separate engagement. We support a one-week post-cutover hypercare window for reconciliation issues.
Platform deep dives
Oracle CRM On Demand
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 Oracle CRM On Demand and Odoo CRM.
Object compatibility
3 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
Oracle CRM On Demand: 30 requests per minute per user session, counter resets at the end of each 1-minute period (not rolling).
Data volume sensitivity
Oracle CRM On Demand 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 Oracle CRM On Demand to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Oracle CRM On Demand 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 Oracle CRM On Demand
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.