CRM migration
Field-level mapping, validation, and rollback between SuperOffice CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
SuperOffice CRM
Source
Odoo CRM
Destination
Compatibility
9 of 14
objects map 1:1 between SuperOffice CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from SuperOffice CRM to Odoo CRM is a structural migration from a GDPR-first European CRM to an open-source all-in-one ERP-CRM suite. SuperOffice uses separate Contact and Company objects with a Quote-Alternative hierarchy for proposal versioning; Odoo CRM uses a unified Partner model (with person-company distinction) and a flat Sale Order model that does not natively support multi-version quote alternatives. We flatten Quote-Alternative structures to a primary Sale Order, store secondary alternatives as a JSON blob in a custom field, and deliver a written inventory of the alternatives for Odoo admins to rebuild as separate orders post-migration. We preserve Owner assignments by resolving SuperOffice associate emails to Odoo User records, and we export Selection lists as tagged Partner records so that Odoo's native tag filter can recreate dynamic segmentation. SuperOffice on-premises customizations, workflows, and integrations do not migrate; we deliver a written inventory of every automation requiring 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 SuperOffice 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.
SuperOffice CRM
Contact
Odoo CRM
res.partner (person type)
1:1SuperOffice Contact maps to Odoo res.partner with type = 'person'. The SuperOffice Contact's firstname and lastname concatenate to the Partner name field in Odoo, and we preserve the original split by storing firstname and lastname in custom fields partner_firstname__c and partner_lastname__c. Email, phone, and address fields map 1:1. The SuperOffice associate (Owner) maps to Odoo User by email resolution before Contact import begins.
SuperOffice CRM
Company
Odoo CRM
res.partner (company type)
1:1SuperOffice Company maps to Odoo res.partner with type = 'company'. The Company name becomes the Partner name, and domain/website maps to Odoo's website field. The Company-Contact link table is preserved by setting the parent_id on the Contact Partner record to point to the Company Partner record after both are imported.
SuperOffice CRM
Sale (Deal)
Odoo CRM
crm.lead (opportunity)
1:1SuperOffice Sale maps to Odoo crm.lead with type = 'opportunity'. The SuperOffice sale stage (lost/won/stage) maps to Odoo stage_id within the assigned crm.team. Amount and currency migrate to planned_revenue and currency_id. The SuperOffice SaleType and its linked stage list map to a specific Odoo crm.team and its stage sequence. Automations on sale stage changes do not migrate.
SuperOffice CRM
Quote
Odoo CRM
sale.order
lossySuperOffice Quote maps to Odoo sale.order. The Quote is linked to the corresponding Sale (Opportunity) via the Odoo crm.lead's opportunity_id reference on sale.order. Pricing, line items, and terms migrate directly. Note that Odoo sale.order does not support a multi-version quote model natively.
SuperOffice CRM
QuoteAlternative
Odoo CRM
sale.order (secondary) or custom JSON field
1:manySuperOffice QuoteAlternative records (secondary proposal versions with different pricing, technology, or terms) do not have a native Odoo equivalent. We designate the primary QuoteAlternative as the main sale.order and store secondary QuoteAlternative records as a JSON blob in a custom field quote_alternatives__c on the sale.order. We include line item detail, pricing, and the alternative name in the JSON. The post-migration handoff document lists every QuoteAlternative with its parent Sale so the Odoo admin can decide whether to create separate sale.order records for each.
SuperOffice CRM
Project
Odoo CRM
project.project
1:1SuperOffice Project maps to Odoo project.project. The ProjType and ProjStatus list values map to Odoo project tags or custom stage fields. Project-type-status links are preserved as custom fields on the Odoo project record. Note that Odoo's native Project app is a separate app install from CRM; we confirm CRM app is active before migration and flag if the Project app is not installed.
SuperOffice CRM
Activity
Odoo CRM
crm.activity or mail.message
1:1SuperOffice Activities (calls, tasks, appointments) map to Odoo crm.activity log records attached to the corresponding crm.lead. Call duration, disposition, and completion status migrate to custom fields on crm.activity. Meeting details (start/end time, location) map to the crm.activity description or a custom field. Activity associations to other records (Projects, Sales) are reconstructed via the Odoo model and res_id references after parent records are loaded.
SuperOffice CRM
Selection
Odoo CRM
res.partner (tagged)
lossySuperOffice Selections are named dynamic lists of Contacts, Companies, or Sales. Odoo has no native equivalent dynamic list concept. We export each Selection as a set of tags applied to the corresponding Partner records (Contacts and Companies) and produce a written inventory listing every Selection name, its criteria (e.g., all Contacts in the Nordics region with open Sales), and the Odoo tag name assigned. The Odoo admin recreates the dynamic filter using Odoo's native domain-based filter or a saved filter group.
SuperOffice CRM
Document
Odoo CRM
ir.attachment
1:1SuperOffice documents stored in the so_arc archive export as binary blobs with filename, MIME type, and create date metadata. We import them as ir.attachment records linked to the parent model (res.partner, crm.lead, project.project) via res_model and res_id. Document-link relationships that exist in SuperOffice are reconstructed via the attachment's res_model and res_id fields. Large document archives may require a staged import with throttling.
SuperOffice CRM
Custom Property
Odoo CRM
ir.model.field (custom)
lossySuperOffice userDefined fields on Contacts, Companies, Sales, and Projects map to Odoo custom fields created on the target model via the Settings > Technical > Custom Fields interface. Dropdown lists from SuperOffice map to Odoo selection fields with the same option values. We create the destination custom field schema before any data import so that the import pipeline can write values directly into typed fields rather than storing them in a catch-all note field.
SuperOffice CRM
User (Associate)
Odoo CRM
res.users
1:1SuperOffice Users (associates) map to Odoo res.users by email resolution. The SuperOffice Role (module-level access rights) does not map directly to Odoo's access rights model; we note the role name and access level in the handoff document for the Odoo admin to assign via Odoo's Access Rights tab. Inactive or archived SuperOffice users map to Odoo portal users or are excluded based on the customer's inclusion criteria.
SuperOffice CRM
Tag
Odoo CRM
res.partner.category
1:1SuperOffice Tags applied across Contact, Company, Sale, and Project objects map to Odoo res.partner.category (Tags app). Tags on Sales and Projects map to crm.tag or project.tag if those apps are installed. We export the tag taxonomy from SuperOffice and create the equivalent Odoo tags before any tagged records are imported. Duplicate tag names are deduplicated by name match.
SuperOffice CRM
Pipeline Stage
Odoo CRM
crm.stage
lossySuperOffice SaleType and its linked stage list table (stage name, order, probability) map to Odoo crm.stage records within the destination crm.team. Stage probability percentages migrate to Odoo's probability field. The SuperOffice stage list table is exported as a configuration object and applied during schema setup. We configure stage names to match SuperOffice labels so that the sales team's muscle memory is preserved as much as the data model allows.
SuperOffice CRM
Company-Contact Link
Odoo CRM
res.partner (parent_id)
1:1The SuperOffice associate table linking Contact to Company is a critical lookup dependency. We sequence Companies (type=company Partner) first in the import order, then Contacts (type=person Partner) with parent_id resolved to the Company Partner record. This ensures that when Contact records are imported into Odoo, the Company relationship is established at insert time rather than requiring a follow-up update pass.
| SuperOffice CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (person type)1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Sale (Deal) | crm.lead (opportunity)1:1 | Fully supported | |
| Quote | sale.orderlossy | Fully supported | |
| QuoteAlternative | sale.order (secondary) or custom JSON field1:many | Fully supported | |
| Project | project.project1:1 | Fully supported | |
| Activity | crm.activity or mail.message1:1 | Fully supported | |
| Selection | res.partner (tagged)lossy | Fully supported | |
| Document | ir.attachment1:1 | Fully supported | |
| Custom Property | ir.model.field (custom)lossy | Fully supported | |
| User (Associate) | res.users1:1 | Fully supported | |
| Tag | res.partner.category1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Company-Contact Link | res.partner (parent_id)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.
SuperOffice CRM gotchas
On-prem to cloud migration requires SuperOffice 7.1 minimum
Customizations and integrations may break after on-prem to cloud migration
Duplicate email addresses block user migration
Quote-Alternative hierarchy flattens in most destination CRMs
Activity-to-record associations require post-migration verification
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 Odoo app inventory
We audit the source SuperOffice installation across version (on-prem or cloud), user count, active associates, and every object volume (Contacts, Companies, Sales, Projects, Quotes, QuoteAlternatives, Activities, Selections, Documents, custom properties, and tags). We pair this with an Odoo instance review: which apps are installed (CRM, Project, Sales, Document), what Odoo version is running, and whether the destination is Odoo Online (cloud), On-Premise, or Odoo.sh. We also verify Odoo user licenses and access rights so that Owner mapping can proceed. The discovery output is a written migration scope document that includes the Quote-Alternative flattening strategy, Selection handling approach, and a list of any missing Odoo apps that must be activated before migration.
Schema setup in Odoo staging environment
We configure the destination Odoo environment in a staging or sandbox instance before any data moves. This includes creating custom fields on res.partner (person and company types), crm.lead, sale.order, and project.project to receive SuperOffice custom properties and preserve QuoteAlternative data. We create the crm.stage values mapped from SuperOffice SaleType stage lists, configure crm.team if multiple teams are in scope, and set up res.partner.category tags to receive SuperOffice tag taxonomy. Odoo Studio is used for any custom view adjustments. Schema is validated in staging before production migration begins.
Quote-Alternative flattening and transformation
We extract every SuperOffice Quote and its QuoteAlternative records, then run the flattening transform. The primary QuoteAlternative becomes the sale.order record with line items. Secondary QuoteAlternatives serialize to the quote_alternatives__c custom JSON field. We produce a reconciliation report listing every Quote with the count of alternatives so the customer can confirm the transformation before production import. This step runs as a separate transform pass before any record insert into Odoo.
Production migration in dependency order
We run the production migration in strict dependency order: res.partner (Companies first, type=company), res.partner (Contacts second, type=person with parent_id resolved to Company Partner), crm.team and crm.stage (stage configuration), crm.lead (Sales/Opportunities with OwnerId resolved by email), project.project (if Project app is active), sale.order (Quotes with Quote-Alternative flattening applied), crm.activity (Activities linked to crm.lead), ir.attachment (Documents linked to Partners and Opportunities), res.partner.category tags applied post-import. Each phase emits a row-count reconciliation report. We use Odoo's XML-RPC or JSON-RPC API with batch chunking and rate-limit handling.
Selection list export and tag application
We export every SuperOffice Selection by name, type (Contact/Company/Sale), and criteria. For each Selection, we apply a corresponding tag to every qualifying Partner record in Odoo. We produce the written Selection inventory document listing the Selection name, the Odoo tag name, the criteria definition, and the count of records tagged. The customer uses this document to recreate Odoo saved filters that approximate the original dynamic list behavior. Selections tied to Sales (Opportunities) are handled as crm.tag records if the CRM app supports tagging on opportunities.
Cutover, validation, and handoff
We freeze SuperOffice writes during the cutover window, run a final delta migration of any records modified during the migration process, and enable Odoo as the system of record. We validate a random sample of 25-50 records per object against the SuperOffice source and report discrepancies. We deliver the written Selection inventory, the Quote-Alternative handoff document, the Owner-Role mapping table, and the Workflow and customization rebuild inventory. We support a one-week hypercare window for reconciliation issues. We do not rebuild SuperOffice customizations as Odoo Studio workflows; that is a separate engagement.
Platform deep dives
SuperOffice CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between SuperOffice CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across SuperOffice CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between SuperOffice 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
SuperOffice CRM: Tiered: Starter 500 req/min, Professional 2,500 req/min, Enterprise 10,000 req/min.
Data volume sensitivity
SuperOffice 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 SuperOffice CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your SuperOffice 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 SuperOffice 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.