CRM migration
Field-level mapping, validation, and rollback between Case.one and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Case.one
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between Case.one and Odoo CRM.
Complexity
BStandard
Timeline
5–10 business days
Overview
Case.one is a cloud-based legal practice management platform built around cases, contacts, documents, and time-and-billing records. Its data model centers on a Case object that carries client contacts, assigned attorneys, document attachments, and hourly fee entries. Odoo CRM organizes data around res.partner (the unified contact-company record), crm.lead (the single model for both leads and opportunities), crm.lead.tag for categorization, and ir_attachment for files. The core migration challenge is routing Case.one cases into Odoo leads and opportunities based on case status, and translating Case.one's per-case billing flags and custom fields into Odoo Studio custom fields on res.partner and crm.lead. We export Case.one records via its REST API, map and transform each record in our ETL layer, and load into Odoo through the xmlrpc API. Automations, document-assembly templates, and billing-rate rules from Case.one do not transfer — we export their definitions as a rebuild reference for your Odoo administrator. A delta-pickup window runs during cutover to capture any new cases or time entries modified in Case.one while the Odoo system is being validated.
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 Case.one 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.
Case.one
Contact
Odoo CRM
res.partner
1:1Case.one Contact maps directly to Odoo res.partner where the contact type is set to 'contact'. Standard fields including name, email, phone, street, city, state, zip, and country migrate on a one-to-one basis. The primary_company relationship from Case.one sets the res.partner.parent_id field to reference the corresponding mapped company partner record, preserving the contact-to-company hierarchy during migration.
Case.one
Company
Odoo CRM
res.partner
1:1Case.one Company maps to Odoo res.partner with type set to 'company'. The company name becomes partner name. Case.one's industry, website, and address fields map to the equivalent Odoo res.partner fields. Parent-child company hierarchies in Case.one become parent_id links in Odoo.
Case.one
Case
Odoo CRM
crm.lead
1:manyCase.one Cases split into Odoo crm.lead records based on status. Open and Pending cases route to crm.lead type 'opportunity' so they appear in the Odoo pipeline view. Closed and Won cases route to type 'lead'. Each split is configurable based on your case-status-to-pipeline-stage mapping plan before migration runs.
Case.one
Case Status
Odoo CRM
crm.stage
1:1Case.one Case Status pick-list values (Open, Pending, On Hold, Closed Won, Closed Lost) are mapped value-by-value to Odoo crm.stage records. Each stage belongs to a specific Odoo sales team. Stage sequence and probability values are applied per Odoo's stage configuration during the migration plan phase.
Case.one
Case Custom Fields
Odoo CRM
x_studio_custom_field on crm.lead
1:1Case.one custom fields on Cases (e.g., matter_type, practice_area, court_jurisdiction, lead_attorney) are pre-created in Odoo Studio before migration using the x_studio_ naming convention. Field types (char, selection, float, date) are matched to Odoo's equivalent field types. Custom field values populate after the field is created in Odoo.
Case.one
Contact Custom Fields
Odoo CRM
x_studio_custom_field on res.partner
1:1Case.one custom fields on Contacts (e.g., bar_number, department, billing_rate) are pre-created in Odoo Studio on res.partner before migration. Values migrate as text, selection, or float depending on the Case.one field type. Billing rate values are stored as float fields on the partner record for use in Odoo Timesheet or Odoo Billing if those modules are activated.
Case.one
Document / Attachment
Odoo CRM
ir_attachment
1:1Case.one documents attached to cases are downloaded from Case.one storage and re-uploaded into Odoo as ir_attachment records linked to the corresponding crm.lead. Attachment filename, mimetype, and create_date are preserved. Odoo's attachment size limit (default 25MB per file) applies; files exceeding this are flagged before migration for manual handling.
Case.one
User / Attorney
Odoo CRM
res.users
1:1Case.one users and attorneys are resolved by email match against Odoo res.users. Unmatched users are flagged before migration — your team either creates the Odoo user first or assigns their Case.one cases to a fallback Odoo user. Active status and user_type (internal vs. portal) are set based on Case.one user role. Attorney-specific role data migrates as a custom field on the mapped crm.lead.
Case.one
Time Entry / Billing
Odoo CRM
x_studio_time_entry on crm.lead / res.partner
1:1Case.one time entries and billable hour records are summarized and stored as custom float fields on the linked crm.lead (for case-based billing) and res.partner (for attorney rate tracking). Odoo's timesheet and billing modules require separate configuration if you want full time-tracking in Odoo; the migration preserves the historical data for reporting continuity.
Case.one
Case Activity / Note
Odoo CRM
mail.message / crm.lead
1:1Case.one case notes and activity logs migrate as mail.message records linked to the corresponding crm.lead in Odoo. Original author, timestamp, and body text are preserved. Odoo's mail thread model displays these as a chronological activity log on each lead or opportunity record in the chatter widget.
Case.one
Billing / Invoice Record
Odoo CRM
x_studio_billing on crm.lead
1:1Case.one invoicing records (invoice number, amount, status, date) do not map to Odoo Account objects because Odoo Accounting is a separate module. We store invoice metadata as custom fields on the crm.lead so billing history is visible alongside the case record. If Odoo Accounting is activated, invoice records are created separately post-migration.
Case.one
Case Tag / Category
Odoo CRM
crm.tag
1:1Case.one tags or categories applied to cases (e.g., litigation, corporate, real_estate) are mapped to Odoo crm.tag records. Tags are linked to crm.lead records via the crm_lead_tag_rel many-to-many table. Tags that have no Odoo equivalent are created during migration as new crm.tag records before records are loaded.
| Case.one | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Case | crm.lead1:many | Fully supported | |
| Case Status | crm.stage1:1 | Fully supported | |
| Case Custom Fields | x_studio_custom_field on crm.lead1:1 | Fully supported | |
| Contact Custom Fields | x_studio_custom_field on res.partner1:1 | Fully supported | |
| Document / Attachment | ir_attachment1:1 | Fully supported | |
| User / Attorney | res.users1:1 | Fully supported | |
| Time Entry / Billing | x_studio_time_entry on crm.lead / res.partner1:1 | Fully supported | |
| Case Activity / Note | mail.message / crm.lead1:1 | Fully supported | |
| Billing / Invoice Record | x_studio_billing on crm.lead1:1 | Fully supported | |
| Case Tag / Category | crm.tag1: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.
Case.one gotchas
Trust account balance migration requires financial reconciliation
Per-active-case pricing means closed matters do not count toward billing
Custom field schemas are firm-specific and require enumeration
Large document repositories may require chunked export with integrity 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
Audit Case.one data and map to Odoo schema specification
FlitStack AI reads all accessible Case.one objects via the REST API — contacts, companies, cases, activities, documents, users, and custom fields. We generate a data audit report showing record counts, custom field inventory, attachment volume, and any null or malformed values that need cleansing. We then produce an Odoo schema specification document: crm.stage list, Odoo Studio custom fields to create, user email mapping, and case-to-lead type routing rules. Your Odoo administrator uses this specification to configure Odoo before we run any data load.
Create Odoo Studio custom fields and pipeline stages
FlitStack AI creates Odoo Studio custom fields on res.partner and crm.lead using the Odoo Studio XML-RPC API — x_studio_case_number, x_studio_total_billed, x_studio_total_hours, x_studio_matter_type, x_studio_practice_area, x_studio_jurisdiction, and any additional custom fields from the Case.one inventory. We also create crm.tag records for Case.one tags. Your Odoo administrator configures the pipeline stages and sales team assignments during this window. The migration does not run until Odoo schema is validated.
Run sample migration with field-level diff
A representative slice of Case.one records (typically 100-500) is migrated first — spanning contacts across multiple companies, open and closed cases, attachments, and a sample of custom field values. FlitStack AI generates a field-level diff report showing every source field value and its Odoo destination value. You review the diff to confirm case-to-lead routing, custom field population, attachment linking, and user resolution before we commit to the full migration run.
Execute full migration and delta-pickup cutover
The full migration loads all Case.one records into Odoo in dependency order: res.partner companies first, then res.partner contacts, then crm.lead records with their custom fields and tag assignments. Documents are downloaded and re-uploaded as ir_attachment records. A delta-pickup window (24-48 hours after the full load) captures any new cases or time entries created in Case.one during the cutover validation period. All operations are logged in the audit trail. One-click rollback reverts the Odoo database to its pre-migration state if reconciliation finds unexpected discrepancies.
Deliver migration report and rebuild reference package
FlitStack AI delivers a migration completion report listing all records migrated, records skipped with reasons, attachment upload status, and any custom field values that could not be mapped. The rebuild reference package includes a JSON export of Case.one automation rules, a field-mapping CSV, and Odoo Studio configuration notes for your administrator to use when rebuilding Case.one workflows in Odoo's Automations module. Post-migration support is available for 30 days to address data quality questions.
Platform deep dives
Case.one
Source
Strengths
Weaknesses
Odoo CRM
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 Case.one and Odoo CRM.
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
Case.one: Not publicly documented.
Data volume sensitivity
Case.one 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 Case.one to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Case.one 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 Case.one
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.