CRM migration
Field-level mapping, validation, and rollback between Crust CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Crust CRM
Source
Odoo CRM
Destination
Compatibility
12 of 16
objects map 1:1 between Crust CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Crust CRM to Odoo CRM is a schema-discovery-first migration. Crust CRM's configurable module architecture means every organization carries unique custom objects that must be enumerated and mapped before any data can move. Odoo CRM uses the res.partner model for both individual contacts and companies (distinguished by the is_company flag) and crm.lead for opportunities and leads. We map Crust's Contact, Company, and Deal records to their Odoo equivalents, handle the separate tag and custom property layers, and use Odoo's XML-RPC API with batch chunking to preserve parent-child relationships between records. Crust's automated workflows and enterprise messaging metadata do not migrate as code; we deliver a written inventory of every active workflow and messaging channel so the customer's Odoo admin can rebuild them in Odoo Studio or via custom modules post-migration.
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 Crust 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.
Crust CRM
Contact
Odoo CRM
res.partner (is_company = False)
1:1Crust Contact records map to Odoo res.partner with is_company=False. Standard fields (name, email, phone, mobile, street, city, state_id, country_id, zip) map directly. The Crust lifecycle_stage property maps to a custom res.partner field (x_lifecycle_stage) since Odoo standard partner does not include lifecycle tracking. Owner assignment from Crust contact_owner_id resolves to Odoo res_users id by email match before partner insert.
Crust CRM
Company/Account
Odoo CRM
res.partner (is_company = True)
1:1Crust Company records map to Odoo res.partner with is_company=True. The company domain becomes the partner website field. We run deduplication against existing Odoo partners using company domain and company name as the dedupe key. After partner insert, we link any Crust Contacts with the same company_id by updating their partner_id field to the newly created company partner.
Crust CRM
Deal
Odoo CRM
crm.lead
1:1Crust Deal records map to Odoo crm.lead with type='opportunity'. The deal_name maps to crm.lead name, deal_amount maps to planned_revenue, close_date maps to date_deadline, and probability maps to Odoo probability (or is calculated from stage mapping). Crust pipeline_id and dealstage_id map to crm.lead team_id and stage_id respectively, requiring a pre-migration pipeline-stage translation table built during discovery.
Crust CRM
Pipeline and Stage
Odoo CRM
crm.team and crm.stage
lossyCrust pipelines map to Odoo crm.team records, and Crust pipeline stages map to crm.stage records linked to each team. We collect the full Crust pipeline-stage map during discovery, generate a translation table that preserves stage order and probability, and create the Odoo teams and stages before any crm.lead import begins. Closed-Lost and Closed-Won stages in Crust map to Odoo's lost_status and won_status defaults.
Crust CRM
Lead
Odoo CRM
crm.lead (type='lead')
1:1Where Crust CRM uses a distinct Lead object from Contact, we map to Odoo crm.lead with type='lead'. Crust lead_status property maps to crm.lead activity state or a custom tag field. Leads that exist in Crust but have no corresponding opportunity are migrated as Odoo leads, which can be converted to opportunities later via Odoo's Lead to Opportunity wizard.
Crust CRM
Owner/User
Odoo CRM
res.users
1:1Crust user records map to Odoo res.users by email match. We extract every distinct Crust owner_id referenced on Contact, Company, Deal, and Engagement records. Owners without a matching Odoo user go to a reconciliation queue for the customer's Odoo admin to provision before record import resumes. Active/inactive status maps directly.
Crust CRM
Activity: Email
Odoo CRM
mail.message
1:1Crust email activities map to Odoo mail.message records linked to the parent res.partner (for contact emails) or crm.lead (for deal emails). The Crust email body migrates as mail.message body (HTML), sender and recipient map to email_from and partner_ids respectively, and message_date preserves the original timestamp for activity timeline ordering.
Crust CRM
Activity: Call
Odoo CRM
crm.phone.call.log or mail.activity
1:1Crust call activities map to Odoo crm.phone.call.log if the Odoo instance has the VoIP module installed, or to mail.activity with activity_type=call. Call duration, disposition, and recording URL map to call log custom fields. ActivityDate from Crust preserves for timeline ordering.
Crust CRM
Activity: Meeting
Odoo CRM
calendar.event
1:1Crust meeting activities map to Odoo calendar.event with start, stop, duration, and location preserved. Attendees map to calendar.event attendee records linked to res.partner records. Meeting notes migrate as mail.message attached to the calendar.event.
Crust CRM
Activity: Note
Odoo CRM
note.note
1:1Crust note activities map to Odoo note.note records linked via mail.activity.mixin to the parent res.partner or crm.lead. Note body preserves rich text. We flag notes with file attachments for separate file migration handling.
Crust CRM
Activity: Task
Odoo CRM
project.task or mail.activity
1:1Crust task activities map to Odoo project.task if the project module is active, or to mail.activity with activity_type=todo. Task status, priority, due_date, and assigned owner map directly with owner resolved via email match to res.users.
Crust CRM
Tag
Odoo CRM
crm.tag or res.partner.category
lossyCrust tags on Contacts map to Odoo res.partner.category records. Crust tags on Deals map to Odoo crm.tag records. Tags stored as multi-checkbox custom properties map to Odoo crm.lead tag_ids. We document tag strategy during scoping since Odoo does not have a global tag model shared across all objects.
Crust CRM
Custom Object
Odoo CRM
Custom model (ir.model + ir.model.fields)
1:1Crust custom objects require schema pre-creation in Odoo before migration. We create Odoo custom models via the ir.model and ir.model.fields API, define field types that match Crust field types (char, text, integer, float, date, datetime, many2one, one2many, many2many), and then import the custom object data via XML-RPC with the newly created model API name. This is the most complex object in the migration and requires a dedicated discovery phase.
Crust CRM
Custom Property (field-level)
Odoo CRM
Custom field via Studio or ir.model.fields
lossyCrust custom properties on standard objects (Contact, Company, Deal) migrate to Odoo custom fields. We create the custom field via Odoo Studio before migration, or via ir.model.fields if the field type is not supported by Studio. Selection fields (picklist) in Crust map to Odoo selection fields with the same options list.
Crust CRM
Attachment
Odoo CRM
ir.attachment
1:1Crust attachments stored per-record migrate as Odoo ir.attachment records linked via res_model and res_id to the parent record (res.partner or crm.lead). We export files individually preserving filename and association, re-attach in Odoo, and map the original Crust attachment URL to the Odoo ir.attachment external URL field if Odoo version supports it.
Crust CRM
Enterprise Messaging Metadata
Odoo CRM
note.note or mail.message (documentation only)
lossyCrust enterprise messaging channels and identity management modules are recorded as metadata during export and delivered as a written inventory document. Odoo does not have a direct equivalent messaging module; the inventory documents the channel names, members, and message counts so the customer's admin can recreate channels in Odoo Discuss (mail) or a third-party messaging integration.
| Crust CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (is_company = False)1:1 | Fully supported | |
| Company/Account | res.partner (is_company = True)1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline and Stage | crm.team and crm.stagelossy | Fully supported | |
| Lead | crm.lead (type='lead')1:1 | Fully supported | |
| Owner/User | res.users1:1 | Fully supported | |
| Activity: Email | mail.message1:1 | Fully supported | |
| Activity: Call | crm.phone.call.log or mail.activity1:1 | Fully supported | |
| Activity: Meeting | calendar.event1:1 | Fully supported | |
| Activity: Note | note.note1:1 | Fully supported | |
| Activity: Task | project.task or mail.activity1:1 | Fully supported | |
| Tag | crm.tag or res.partner.categorylossy | Fully supported | |
| Custom Object | Custom model (ir.model + ir.model.fields)1:1 | Fully supported | |
| Custom Property (field-level) | Custom field via Studio or ir.model.fieldslossy | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Enterprise Messaging Metadata | note.note or mail.message (documentation only)lossy | 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.
Crust CRM gotchas
No free trial limits pre-migration evaluation
Self-hosting shifts infrastructure responsibility to the customer
Custom object schemas require explicit discovery before migration
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 schema audit
We audit the source Crust CRM instance across all modules, enumerating standard objects (Contact, Company, Deal, Activity), custom objects, custom properties, pipeline definitions, stage names, owner assignments, and attachment storage backend. For cloud-hosted Crust we use the REST API; for self-hosted we use SSH or database credentials. The discovery output is a written migration scope document including the complete Crust object inventory, custom field type list, and pipeline-stage translation requirements.
Destination schema pre-creation
We pre-create the Odoo destination schema before any data import. This includes creating crm.team records for each Crust pipeline, crm.stage records with correct sequence and probability for each Crust stage, res.partner.category or crm.tag records for each Crust tag, custom fields via Odoo Studio for all Crust custom properties on standard objects, and custom models via ir.model and ir.model.fields for all Crust custom objects. Schema is validated in a non-production Odoo environment before production migration begins.
Owner reconciliation and user provisioning
We extract every distinct Crust owner_id referenced on any migrating record and match by email against the Odoo destination's res.users table. Owners without a matching Odoo user go to a reconciliation queue. The customer's Odoo admin provisions any missing users before record import resumes. OwnerId references are required on most standard object inserts, so this step gates the record import phases.
Sandbox migration and reconciliation
We run a full migration into a non-production Odoo environment using production-like data volume. The customer's Odoo admin reconciles record counts (partners in, leads in, opportunities in, activities in), spot-checks 25-50 random records against the Crust source, validates pipeline-stage assignment, and signs off the schema and mapping before production migration begins. Any mapping corrections happen here.
Production migration in dependency order
We run production migration in record-dependency order: res.users (manual provisioning validated), res.partner companies (is_company=True), res.partner contacts (is_company=False with parent_id linking), crm.lead (type=lead and type=opportunity with team_id and stage_id resolved), crm.tag and res.partner.category, mail.message and calendar.event activity history (via XML-RPC batch), custom object records (last, with lookup fields resolved to Odoo IDs), ir.attachment records. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and workflow rebuild handoff
We freeze Crust 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, enterprise messaging metadata document, and Crust automation rebuild guide to the customer's Odoo admin. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. Workflow rebuild and Odoo Studio configuration are outside standard migration scope and require a separate engagement or internal admin work.
Platform deep dives
Crust CRM
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 Crust CRM 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
Crust CRM: Not enforced as a hard SaaS quota in the open-source distribution — limits depend on the deployment topology (Postgres sizing, container resources). Commercial Planet Crust deployments may add gateway-level throttling..
Data volume sensitivity
Crust CRM exposes a bulk API — large-volume migrations stream efficiently.
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 Crust CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Crust 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 Crust 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.