CRM migration
Field-level mapping, validation, and rollback between Corteza CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Corteza CRM
Source
Odoo CRM
Destination
Compatibility
9 of 14
objects map 1:1 between Corteza CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Corteza CRM to Odoo CRM is a schema translation from a module-based open-source platform to a record-type-based ERP suite. Corteza organizes CRM data into configurable modules (Lead, Account, Contact, Opportunity, Campaign, Case, Contract, Task, Event) with JSON API and namespace export/import paths; Odoo CRM uses res.partner in two modes (company vs individual), crm.lead in two types (lead vs opportunity), and a calendar.event model for meetings and calls. We audit the Corteza namespace for orphaned page references that block export, capture workflow definitions during discovery for the rebuild handoff, map every standard module to its Odoo equivalent, and resolve the res.partner split between company and individual contacts using the company_name field. Workflows, automations, and namespace configurations do not migrate as code; we deliver a written inventory for Odoo Studio rebuild.
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 Corteza 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.
Corteza CRM
Lead
Odoo CRM
crm.lead (type = lead)
1:1Corteza Lead records with conversion status of unconverted map to Odoo crm.lead with type = lead. Standard fields (first_name, last_name, email, phone, rating, source) translate to Odoo name, email_from, phone, and medium_id. We set type to lead at migration time and leave the opportunity conversion to occur natively in Odoo after go-live. Any Corteza lead_score or custom scoring fields map to crm.lead priority or a custom float field.
Corteza CRM
Account
Odoo CRM
res.partner (is_company = True)
1:1Corteza Account records map to Odoo res.partner with is_company = True. The company_name, industry, website, street, city, country, phone, and social media URL fields translate to Odoo partner fields (name, industry_id, website, street, city, country_id, phone, social_twitter/facebook/linkedin). We set parent_id = NULL for company partners and use the company_name field as the primary name field.
Corteza CRM
Contact
Odoo CRM
res.partner (is_company = False, parent_id to Account)
1:manyCorteza Contact records map to Odoo res.partner with is_company = False and parent_id pointing to the migrated Account partner. First name and last name concatenate into Odoo name. Email, phone, job_title, department, and the account relationship (AccountContactRole) translate to email, phone, function, department_id, and contact_type. If a Corteza Contact has no parent Account, we create an orphan partner record and flag it for the customer admin to resolve.
Corteza CRM
Opportunity
Odoo CRM
crm.lead (type = opportunity)
1:1Corteza Opportunity records map to Odoo crm.lead with type = opportunity. Stage, amount, probability, expected_close_date, and description map to stage_id, expected_revenue, probability, date_deadline, and description. We resolve the Account lookup by matching Corteza account_id to the migrated res.partner company record and set partner_id on the Odoo opportunity. OpportunityContactRole records create crm.lead.partner_involved_id entries linking the Opportunity to related Contact partners.
Corteza CRM
Campaign
Odoo CRM
crm.tag or utm.campaign
lossyCorteza Campaign records translate to Odoo utm.campaign for campaign tracking attribution (UTM tags on leads and opportunities). CampaignMember records linking Contacts and Leads to a Campaign migrate as crm.lead records tagged with the utm.campaign reference. Odoo does not have a native CampaignMember object; the campaign association is stored on the lead via campaign_id. If the customer requires campaign member tracking as a separate list, we recommend using Odoo Mass Mailing Lists (mailing.list) as the replacement.
Corteza CRM
Case
Odoo CRM
helpdesk.ticket
lossyCorteza Case records map to Odoo helpdesk.ticket if the customer licenses the Odoo Helpdesk app. Case status, priority, origin, and description translate to ticket stage_id, priority, origin, and description. Case-contact and case-account relationships map to ticket partner_id and the ticket's project_id if linked. If Helpdesk is not licensed, Cases map to crm.lead with a custom case_type tag and lose the service-level tracking features.
Corteza CRM
Contract
Odoo CRM
account.move or sale.subscription
lossyCorteza Contract records with line items (ContractLineItem) translate to Odoo account.move (invoicing) or sale.subscription (subscription management) depending on whether the contracts represent recurring billing or one-time agreements. Contract terms, dates, and related Account and Contact roles map to the corresponding fields. ContractLineItem pricing and quantities map to invoice lines or subscription line items. This mapping requires the customer to decide on the Odoo contract representation during scoping.
Corteza CRM
Task
Odoo CRM
project.task or calendar.event
1:1Corteza standalone Tasks with no parent CRM record map to Odoo project.task. Tasks related to CRM records (Lead, Account, Contact, Opportunity) map to Odoo calendar.event if they represent meetings or calls, or project.task if they represent action items. Status, due date, assignee, and description translate to stage_id, date_deadline, user_id, and description. Task assignment resolves Corteza user IDs to Odoo res.users by email match.
Corteza CRM
Event
Odoo CRM
calendar.event
1:1Corteza Event records (meetings, calls) map to Odoo calendar.event with start_datetime, stop_datetime, duration, location, and description preserved. Organizer and attendee references from Corteza resolve by email to Odoo res.users (organizer) and res.partner (attendees). EventRelation records in Odoo link attendees via calendar.event.res_partner_rel. We set the event's crm_lead_id if the Odoo event is linked to a migrated opportunity.
Corteza CRM
Quote
Odoo CRM
sale.order
1:1Corteza Quote records with line items (QuoteLineItem) map to Odoo sale.order. Quote status (draft, sent, accepted, lost) maps to Odoo state (draft, sent, sale_order, canceled). Related Opportunity maps via the order's opport_id to the migrated crm.lead opportunity. QuoteLineItem quantity, unit price, and discount map to sale.order.line quantity, price_unit, and discount. Product references resolve to Odoo product.product records via SKU match.
Corteza CRM
Product
Odoo CRM
product.product / product.template
1:1Corteza Product records map to Odoo product.template with product_variant_ids. Product name, SKU (hs_sku), list price, and cost map to name, default_code, list_price, and standard_price. If Corteza products have variants (size, color), we create Odoo product template with variant attributes. Pricebook and PricebookEntry records translate to Odoo product.pricelist and product.pricelist.item entries attached to the product.
Corteza CRM
Custom Module
Odoo CRM
ir.model / ir.model.fields
lossyCorteza's low-code module builder creates entirely custom module objects. We translate these to Odoo custom modules by pre-creating ir.model (x_custom_object) and ir.model.fields definitions in the destination Odoo database before data migration. Custom field types in Corteza (select, number, date, record reference) map to Odoo field types (selection, float, datetime, many2one). Custom validation rules, required field constraints, and default values translate to Odoo ir.model.constraint and ir.model.fields.default entries. The customer reviews the custom module mapping during staging.
Corteza CRM
Files and Attachments
Odoo CRM
ir.attachment
1:1Corteza file fields and standalone attachments migrate as Odoo ir.attachment records. We extract file binary content, name, and mime type from the Corteza export and create ir.attachment records linked via res_model and res_id to the migrated parent record (crm.lead, res.partner, etc.). Folder structure from Corteza's export is not preserved; all files land in a flat attachment list on each record. Bulk attachment export with full folder hierarchy may require supplemental file system handling beyond the API migration path.
Corteza CRM
Workflow and Automations
Odoo CRM
Inventory only (not migrated)
1:1Corteza Workflow definitions are captured during discovery as JSON exports and documented in the workflow rebuild handoff. We do not translate Corteza workflows to Odoo automated actions because the trigger models and action types differ structurally. The inventory document lists each Corteza workflow with its trigger (record create, update, stage change), conditions, sequence, and actions with Odoo Automated Action or Studio action equivalents recommended for rebuild in Odoo Studio. Lead conversion automation is flagged as requiring specific Odoo CRM action rules.
| Corteza CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | crm.lead (type = lead)1:1 | Fully supported | |
| Account | res.partner (is_company = True)1:1 | Fully supported | |
| Contact | res.partner (is_company = False, parent_id to Account)1:many | Fully supported | |
| Opportunity | crm.lead (type = opportunity)1:1 | Fully supported | |
| Campaign | crm.tag or utm.campaignlossy | Fully supported | |
| Case | helpdesk.ticketlossy | Fully supported | |
| Contract | account.move or sale.subscriptionlossy | Fully supported | |
| Task | project.task or calendar.event1:1 | Fully supported | |
| Event | calendar.event1:1 | Fully supported | |
| Quote | sale.order1:1 | Fully supported | |
| Product | product.product / product.template1:1 | Fully supported | |
| Custom Module | ir.model / ir.model.fieldslossy | Fully supported | |
| Files and Attachments | ir.attachment1:1 | Mapping required | |
| Workflow and Automations | Inventory only (not migrated)1: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.
Corteza CRM gotchas
Namespace export fails on orphaned page references
Workflow automation breaks after restore or upgrade
Field-level security does not cover all access scenarios
Federation is experimental and not production-ready
No publicly documented API rate limits
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 namespace audit
We audit the source Corteza instance across all modules in use, custom module definitions, workflow list, user roster, and attachment volume. We specifically run the namespace export audit to identify orphaned page references that would block export. We extract the complete workflow definition list in JSON format for the rebuild inventory. We pair this with a review of the target Odoo version (Odoo Online, Odoo.sh, or on-premise), the Odoo Apps already licensed (CRM, Project, Helpdesk, Sale, Invoice), and any custom module requirements. The discovery output is a written migration scope, namespace cleanup checklist, and workflow inventory draft.
Namespace cleanup and schema preparation
We clean up orphaned page references in the Corteza namespace (pages that reference deleted modules) so that namespace export can complete. We simultaneously begin Odoo schema preparation: configuring the Odoo CRM pipeline stages to match Corteza opportunity stages, creating res.partner address titles and industries, provisioning custom fields on crm.lead and res.partner for Corteza properties that do not map to standard Odoo fields, and configuring the crm.lead record types. If custom Corteza modules exist, we create Odoo custom module definitions (ir.model, ir.model.fields) in a staging database. If the Helpdesk app is licensed, we configure ticket stages to match Case statuses.
Staging migration and reconciliation
We run a full migration into a staging Odoo database (copy of production or a fresh Odoo Online database) using representative data volume. We validate record counts for each object (Accounts -> res.partner, Contacts -> res.partner, Leads -> crm.lead, Opportunities -> crm.lead, Cases -> helpdesk.ticket, Tasks -> project.task, Events -> calendar.event), spot-check 25-50 random records against the Corteza source for field accuracy, and confirm the parent_id relationships on res.partner records. Any mapping corrections and schema adjustments happen in staging before production migration begins.
User and Owner reconciliation
We extract every distinct user referenced on Corteza records (Leads, Opportunities, Cases, Tasks, Events) and match by email against the Odoo destination's res.users table. Users without a matching Odoo account go to a reconciliation queue for the customer's admin to provision before record import resumes. Inactive Corteza users require a decision (provision as inactive Odoo users, reassign records to active users, or exclude) during scoping.
Production migration in dependency order
We run production migration in record-dependency order: res.partner company records first (from Corteza Accounts), res.partner individual records second (from Corteza Contacts with parent_id resolved), crm.lead lead records (type = lead), crm.lead opportunity records (type = opportunity with partner_id and user_id resolved), helpdesk.ticket records, project.task records, calendar.event records, sale.order quotes, product.product records, and ir.attachment records last. Each phase emits a row-count reconciliation report before the next phase begins. Custom module data migrates after standard objects because custom module records may have many2one lookups to res.partner or crm.lead.
Cutover, validation, and workflow handoff
We freeze Corteza writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the workflow inventory document to the customer's admin team with Odoo Automated Action and Studio equivalents for each Corteza workflow. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild Corteza workflows as Odoo automated actions inside the migration scope; that work is handled by the customer's admin or an Odoo implementation partner using the delivered inventory.
Platform deep dives
Corteza CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Corteza CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Corteza CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Corteza 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
Corteza CRM: Not publicly documented.
Data volume sensitivity
Corteza 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 Corteza CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Corteza 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 Corteza 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.