CRM migration
Field-level mapping, validation, and rollback between Odoo CRM and Nutshell. We move data and schema; workflows are rebuilt natively in Nutshell.
Odoo CRM
Source
Nutshell
Destination
Compatibility
7 of 10
objects map 1:1 between Odoo CRM and Nutshell.
Complexity
BStandard
Timeline
3-5 weeks
Try the reverse
Overview
Moving from Odoo CRM to Nutshell is a structural migration that reduces complexity on the destination side. Odoo uses a relational PostgreSQL data model where Leads and Opportunities share the crm.lead table with a type discriminator, pipeline Stages live in crm.stage ordered per team, and Activities are mail.activity records linked to leads. Nutshell uses a flatter People and Companies model with a single Lead object that covers both inbound prospects and open deals, custom fields scoped per record type (People, Company, Lead), and activities stored as a unified task log. We map Odoo's crm.lead type='lead' and type='opportunity' records to Nutshell Lead, preserve Odoo's stage names as Nutshell pipeline stage labels, and store the original Odoo type as a custom field for audit. Activity history migrates as Nutshell Tasks linked to the parent Lead. We do not migrate Odoo automation rules, AI lead scoring, or Enterprise-only modules — we deliver a written inventory of these for the customer's admin to evaluate against Nutshell's built-in automation alternatives.
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.
Source platform
Odoo CRM platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo CRM.
Destination platform
Nutshell platform overview
Scorecard, SWOT, gotchas, and pricing for Nutshell.
Data migration guide
The complete Nutshell migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Source platform guide
Odoo CRM migration guide
Understand the data you're exporting from Odoo CRM before mapping it.
Destination checklist
Nutshell migration checklist
Pre- and post-cutover tasks for moving onto Nutshell.
Source checklist
Odoo CRM migration checklist
Exit checklist for unwinding your Odoo CRM setup cleanly.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Odoo CRM object lands in Nutshell, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo CRM
Contact / Partner (res.partner)
Nutshell
Person
1:1Odoo's res.partner records with customer=True map to Nutshell Person. Standard fields (name, email, phone, street, city, state, country, website) migrate directly. Partners that are companies (is_company=True) map to Nutshell Company instead. We resolve the is_company flag at export time to direct records to the correct Nutshell object. Partner tags (res.partner.category) migrate as Nutshell Person tags.
Odoo CRM
Company (res.partner where is_company=True)
Nutshell
Company
1:1Odoo partners flagged is_company=True map to Nutshell Company. Company name, website, phone, and address fields migrate directly. The Nutshell Company is created before any Person import so that the Person-to-Company link is satisfied at insert time. Parent-company hierarchies in Odoo (commercial_partner_id) map to Nutshell's Parent Company relationship.
Odoo CRM
Lead (crm.lead where type='lead')
Nutshell
Lead
1:1Odoo Leads with type='lead' map directly to Nutshell Lead. Key fields include name, contact_name, email_from, phone, source_id (mapped to Nutshell Source), and stage_id. The original Odoo type discriminator is stored in a custom field odoo_record_type__c as 'lead' for audit and reconciliation. Lead priority maps from Odoo's priority field to Nutshell's Lead priority.
Odoo CRM
Opportunity (crm.lead where type='opportunity')
Nutshell
Lead
1:manyOdoo Opportunities (crm.lead with type='opportunity') map to Nutshell Lead with the original Odoo type stored in odoo_record_type__c as 'opportunity'. Expected revenue and probability from Odoo migrate to Nutshell Lead monetary fields and a custom probability field respectively. The Odoo opportunity-to-Lead conversion is not required in Nutshell because Nutshell uses a single Lead object for both inbound prospects and active deals; the customer's sales process determines whether a Lead represents a prospect or an active opportunity.
Odoo CRM
Pipeline Stage (crm.stage)
Nutshell
Pipeline Stage
lossyOdoo pipeline stages migrate to Nutshell pipeline stage labels. Stage names and order are preserved. We configure Nutshell pipeline stages during setup to match Odoo's crm.team.stage.rel ordering per team. Custom stages added via Odoo Studio are included in the export and created as Nutshell stage labels before Leads are imported. Probability percentages from Odoo's stage model migrate to informational custom fields in Nutshell since Nutshell's stage probabilities are system-managed.
Odoo CRM
Sales Team (crm.team)
Nutshell
Team
1:1Odoo Sales Teams (crm.team) map to Nutshell Teams for territory and quota management. Team member assignments (crm.team.member_ids) migrate as Nutshell Team membership records. We map team names and preserve the team-user assignment so that territory-based reporting continues in Nutshell. If Nutshell's team model does not support the customer's full team hierarchy, we document the gap in the migration findings report.
Odoo CRM
Activity / Task (mail.activity)
Nutshell
Task
1:1Odoo mail.activity records migrate to Nutshell Tasks linked to the parent Lead. Activity type, date_deadline, user_id (resolved via email to Nutshell User), and note migrate as Nutshell Task subject, due date, assigned User, and description. We preserve the original Odoo activity date for timeline ordering. High-volume activity exports are chunked and sequenced after parent Lead records are confirmed in Nutshell to avoid orphaned task references.
Odoo CRM
Custom Field (crm.lead custom columns)
Nutshell
Custom Field (People, Company, Lead)
lossyOdoo custom fields defined via Studio or custom addons are stored as columns in crm.lead. We export field definitions alongside data and map them to Nutshell custom fields by type: Odoo char/text maps to Nutshell Text or Long Text, Odoo float/monetary maps to Nutshell Currency, Odoo date/datetime maps to Nutshell Date, Odoo selection maps to Nutshell Dropdown, and Odoo many2one/many2many map to informational text fields in Nutshell since Nutshell does not support relational custom field types. The customer selects the field mapping strategy during scoping.
Odoo CRM
Tag (crm.tag)
Nutshell
Tag (People, Company, Lead)
1:1Odoo CRM tags are a many2many on crm.lead and map to Nutshell tags on the corresponding Lead record. Tag names are preserved as a flat list. Custom tags added via Odoo Studio are included in the export and created in Nutshell before Lead import. If the customer used tags for lead scoring classification, we note this in the findings report since Nutshell's tag model is label-only and does not carry numeric scores.
Odoo CRM
Attachment (ir.attachment linked to crm.lead)
Nutshell
File
1:1Odoo ir.attachment records linked to crm.lead via res_model/res_id are exported from the filestore and re-linked to the corresponding Nutshell Lead as file attachments. Large attachment volumes are chunked separately and uploaded after parent Lead records are confirmed. We do not migrate ir.attachment records linked to non-CRM Odoo models (e.g., account.invoice attachments) since those objects are outside CRM scope.
| Odoo CRM | Nutshell | Compatibility | |
|---|---|---|---|
| Contact / Partner (res.partner) | Person1:1 | Fully supported | |
| Company (res.partner where is_company=True) | Company1:1 | Fully supported | |
| Lead (crm.lead where type='lead') | Lead1:1 | Fully supported | |
| Opportunity (crm.lead where type='opportunity') | Lead1:many | Fully supported | |
| Pipeline Stage (crm.stage) | Pipeline Stagelossy | Fully supported | |
| Sales Team (crm.team) | Team1:1 | Fully supported | |
| Activity / Task (mail.activity) | Task1:1 | Fully supported | |
| Custom Field (crm.lead custom columns) | Custom Field (People, Company, Lead)lossy | Fully supported | |
| Tag (crm.tag) | Tag (People, Company, Lead)1:1 | Fully supported | |
| Attachment (ir.attachment linked to crm.lead) | File1: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.
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
Nutshell gotchas
Contact tier limits enforced on import
No bulk API endpoint requires paginated extraction
Email sequences not exportable via API
Foundation plan disables key sales features
Pair-specific challenges
Migration approach
Discovery and data audit
We audit the source Odoo database across edition (Community vs Enterprise vs Odoo.sh), version, installed modules, custom fields on crm.lead and res.partner, pipeline stage count and order, sales team configuration, activity volume estimates, and any custom addons that extend the CRM model. For Community sources without API access, we establish a read-only PostgreSQL connection to the Odoo database. The discovery output is a written migration scope document that lists every object to migrate, every custom field with its target Nutshell type, every Enterprise-only feature to flag, and the lead/opportunity split rule.
Field mapping design and Nutshell schema setup
We design the field mapping from Odoo to Nutshell for every standard and custom field, remapping Odoo relational types (many2one, many2many) to Nutshell text equivalents where no direct type exists. We create Nutshell custom fields on the People, Company, and Lead objects to carry Odoo's custom fields and the odoo_record_type__c discriminator. Pipeline stages are created in Nutshell with names and order matched to Odoo's crm.team.stage.rel configuration. This schema is validated in Nutshell's sandbox before any data loads.
Sandbox migration and reconciliation
We run a full migration into a Nutshell trial or sandbox environment using a representative data sample. The customer's CRM lead reconciles record counts (People in, Companies in, Leads in, Tasks in), spot-checks 20-40 random records against the Odoo source for field accuracy, and reviews the activity timeline on sample Leads. Any mapping corrections, field type issues, or stage configuration gaps surface here before production migration begins.
Owner reconciliation and User provisioning
We extract every distinct Odoo user referenced on crm.lead records (create_uid, write_uid) and activity records and match by email against the destination Nutshell team's User list. Owners without a matching Nutshell User go to a reconciliation queue for the customer's admin to provision before record import resumes. Activity assignments in Odoo map to Nutshell Task assignments by the same email-lookup resolution.
Production migration in dependency order
We run production migration in record-dependency order: Companies first (since People link to them), then People, then Leads (with odoo_record_type__c populated from the crm.lead type field), then Tags, then Activity history as Tasks linked to parent Leads. Each phase emits a row-count reconciliation report before the next phase begins. Custom fields are mapped per the approved field strategy. File attachments from Odoo's ir.attachment table are uploaded as Nutshell files linked to the corresponding Lead after parent-record confirmation.
Cutover, validation, and automation inventory handoff
We freeze Odoo writes during cutover, run a final delta migration of any records modified during the migration window, then designate Nutshell as the system of record. We deliver the written Odoo automation and scoring inventory document to the customer's admin team with Nutshell Workflow Rule equivalents documented for each automation. We support a five-business-day hypercare window for reconciliation issues raised by the sales team. We do not rebuild Odoo automation rules as Nutshell Workflow Rules inside the migration scope; that work uses the inventory document as its input and is an admin task or separate engagement.
Platform deep dives
Odoo CRM
Source
Strengths
Weaknesses
Nutshell
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 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 Odoo CRM and Nutshell.
Object compatibility
1 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
Odoo CRM: Not publicly documented; no published rate limit found in Odoo's official developer documentation.
Data volume sensitivity
Odoo 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 Odoo CRM to Nutshell migration scoping. Not seeing yours? Book a call.
Walk through your Odoo CRM to Nutshell migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo CRM
Other ways to arrive at Nutshell
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.