CRM migration
Field-level mapping, validation, and rollback between MyCase and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
MyCase
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between MyCase and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
MyCase is a legal practice management platform centered on Cases, Contacts, Companies, Time Entries, and integrated billing. Odoo CRM models leads and opportunities in crm.lead, contacts and companies in res.partner, and cross-references them through partner_id and partner_email fields. The fundamental structural difference is that MyCase treats a Case (matter) as the primary entity with Contacts nested inside it; Odoo CRM treats Opportunities (crm.lead) and Contacts (res.partner) as co-equal objects joined by relational fields. This migration carries MyCase records into Odoo by creating res.partner entries for every Contact and Company, then creating crm.lead records for every Case — storing the original MyCase case number, case type, practice area, and responsible attorney as custom fields on each crm.lead. Time entries migrate as mail.message records on the relevant crm.lead so activity history is preserved. Custom fields defined in MyCase are recreated as ir.model.field definitions in Odoo before data lands. Workflows, automations, and document templates do not transfer — FlitStack exports their definitions for your Odoo administrator to rebuild using Odoo Studio or server actions. The migration runs against Odoo's xmlrpc API, respecting Odoo's per-database connection limits and PostgreSQL-backed transaction integrity.
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 MyCase 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.
MyCase
Contact
Odoo CRM
res.partner
1:1MyCase contacts map 1:1 to Odoo res.partner records. The email field is used as the unique matching key for owner resolution. Contacts without an email receive a generated placeholder email and are flagged for manual review before the full migration commits.
MyCase
Company
Odoo CRM
res.partner (company_type = 'company')
1:1MyCase companies map to Odoo res.partner with company_type set to 'company'. The primary address, phone, and website fields migrate directly. Parent-company relationships in MyCase map to res.partner parent_id — the parent company must be created before the child to resolve the foreign key.
MyCase
Case
Odoo CRM
crm.lead
1:1MyCase cases become Odoo crm.lead records. The case number (e.g., '2024-CIV-001') is stored in a custom field x_mycase_case_number on crm.lead. Case type (litigation, transactional, estate) maps to a custom selection field x_practice_area on crm.lead. The crm.lead name field is populated with the case title for Odoo pipeline visibility.
MyCase
Case.assigned_attorney
Odoo CRM
crm.lead.user_id
1:1The MyCase assigned attorney (user_id) resolves to an Odoo res.users record by email match. If the attorney does not have an Odoo user account, their MyCase ID is stored in x_mycase_former_owner for admin assignment after migration. Unresolved owners are reported before the migration run.
MyCase
Case.status / case_stage
Odoo CRM
crm.lead.stage_id
1:1MyCase case status values (Active, Pending, Closed, Archived) map to corresponding Odoo CRM stage IDs. Stage names are mapped value-by-value. If MyCase has custom status labels, Odoo stage names are created to match them — the admin reviews stage colors and probability settings post-migration.
MyCase
Time Entry
Odoo CRM
mail.message ( subtype = 'mt_note' )
1:1MyCase time entries become mail.message records attached to the parent crm.lead. Each message preserves the original description, hours, rate, and date as message body text. Billable vs non-billable flags are stored in a custom boolean field x_mycase_billable on the message record. This approach preserves activity history without creating Odoo account.analytic.line records.
MyCase
Invoice / Billing Record
Odoo CRM
account.move (custom field linkage)
1:1MyCase invoices are not migrated as Odoo account.move records because Odoo invoicing requires chart-of-accounts and fiscal position configuration that is destination-side setup. Instead, MyCase invoice IDs, amounts, and statuses are stored in custom fields on the associated crm.lead as a billing reference record for your accountant to reconstruct in Odoo Accounting.
MyCase
Custom Field (Contact-level)
Odoo CRM
ir.model.field on res.partner
1:1MyCase contact custom fields (e.g., bar_number, malpractice_carrier) are created as ir.model.field definitions on res.partner before the migration run. Field types map: text to char/text, picklists to selection, dates to date. The field x_mycase_record_id is created on every object to store the original MyCase ID for traceability.
MyCase
Document / Attachment
Odoo CRM
ir.attachment
1:1MyCase file attachments are downloaded and re-uploaded to Odoo ir.attachment records. Each attachment is linked to the target res.partner or crm.lead via res_model and res_id. File size limits follow Odoo's default. Inline images in MyCase notes are extracted and stored as binary attachments. Folder hierarchy is flattened — the original MyCase Drive folder path is preserved in the attachment's description field.
MyCase
Trust / IOLTA Account
Odoo CRM
account.journal (IOLTA configuration)
1:1MyCase trust account balances and transaction history have no direct Odoo CRM equivalent. The trust account name, type, and last known balance are stored as a custom note on the relevant res.partner for reference. Rebuilding trust accounting requires Odoo Accounting app configuration with dedicated IOLTA journals — handled separately from the CRM migration.
MyCase
Workflow / Automation
Odoo CRM
ir.actions.server (Odoo Action Rules)
1:1MyCase workflows and task-automation templates do not migrate. Their definitions are exported as a JSON schema document listing each workflow trigger, condition, and action. Your Odoo administrator uses this as a rebuild reference for Odoo Studio server actions and action rules — the logic models are fundamentally different between the two platforms.
MyCase
Client Portal Access
Odoo CRM
portal.group on res.partner
1:1MyCase's client-facing portal access and permissions have no direct Odoo CRM equivalent. Portal access in Odoo is controlled by the portal group and requires the website module or a dedicated portal configuration. Client-facing access is not migrated — it must be re-established after Odoo is configured.
| MyCase | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company_type = 'company')1:1 | Fully supported | |
| Case | crm.lead1:1 | Fully supported | |
| Case.assigned_attorney | crm.lead.user_id1:1 | Fully supported | |
| Case.status / case_stage | crm.lead.stage_id1:1 | Fully supported | |
| Time Entry | mail.message ( subtype = 'mt_note' )1:1 | Fully supported | |
| Invoice / Billing Record | account.move (custom field linkage)1:1 | Fully supported | |
| Custom Field (Contact-level) | ir.model.field on res.partner1:1 | Fully supported | |
| Document / Attachment | ir.attachment1:1 | Fully supported | |
| Trust / IOLTA Account | account.journal (IOLTA configuration)1:1 | Fully supported | |
| Workflow / Automation | ir.actions.server (Odoo Action Rules)1:1 | Fully supported | |
| Client Portal Access | portal.group on res.partner1: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.
MyCase gotchas
QuickBooks sync is strictly one-directional
Advanced API access is tier-gated
Document migration requires offline file transfer
Bulk rate updates on historical time entries are not supported
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
Discover MyCase data model and Odoo schema requirements
FlitStack reads MyCase export data via its API (Advanced tier) or Full Data Backup tool, cataloging every object type, custom field definition, and relationship. Simultaneously, we inspect the target Odoo database to identify installed apps, existing custom fields, and stage configuration. This discovery output is a data map document listing every MyCase field, its Odoo target (res.partner, crm.lead, mail.message, ir.attachment), the mapping type, and any pre-requisite Odoo field creation required. This document is the shared planning artifact between FlitStack and your Odoo administrator before any data moves.
Create Odoo custom fields and stage configuration
Before any data loads, FlitStack creates all required ir.model.field definitions in Odoo via the xmlrpc API — custom fields on res.partner and crm.lead, custom selection values for case type and practice area, and the x_mycase_record_id traceability field on every object. Simultaneously, we map MyCase case statuses to Odoo stage_id values, creating new CRM stages if the MyCase status labels have no Odoo equivalent. If Odoo Community edition is detected (no API access), this step switches to a manual field-creation guide delivered to your admin with exact field names, types, and selection options to create in Odoo Studio.
Resolve owners and users by email match
MyCase user and attorney IDs are matched to Odoo res.users records by email address. FlitStack generates a pre-migration owner resolution report listing matched users, unmatched users, and suggested fallback assignments. Your team either creates missing Odoo user accounts or designates a fallback owner before the migration run. No record lands in Odoo without a resolved user_id — records with unresolved owners are held in a staging crm.lead tagged with x_mycase_former_owner for post-migration manual assignment.
Run a sample migration with field-level diff
A representative slice migrates first — typically 200–500 records covering contacts, companies, cases, time entries, and documents across multiple case types. FlitStack generates a field-level diff comparing source values in MyCase against the destination values in Odoo for every mapped field. You review the diff to verify case number mapping, practice area translation, time entry formatting, and document attachment links before the full run commits. This is the validation gate: if any field-level check fails the acceptance criteria, the mapping is adjusted and the sample re-runs before cutover.
Execute full migration with delta-pickup window
The full migration runs in dependency order: companies (res.partner, company_type = 'company') first, then contacts, then cases (crm.lead) with foreign keys resolving correctly. Documents and attachments migrate after their parent records are confirmed in Odoo. A delta-pickup window of 24–48 hours runs concurrently with your team's final MyCase data entry, capturing any cases created or modified during the cutover period. FlitStack's audit log records every record operation — insert, update, skip, or error — and one-click rollback is available if reconciliation reveals systematic data issues. After rollback window closes, the audit log is delivered as a CSV for your compliance record.
Deliver workflow export and post-migration rebuild reference
FlitStack exports your MyCase workflow definitions as a structured JSON document covering every automated task template, case-stage trigger, and document assembly rule. This document is handed to your Odoo administrator as a rebuild specification for Odoo Studio server actions. We do not migrate automations automatically — the logic models are incompatible between platforms. The workflow export includes the exact MyCase UI labels and condition logic so your admin can replicate the business rules in Odoo's action-rule framework without reverse-engineering the original intent from scratch.
Platform deep dives
MyCase
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 MyCase 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
MyCase: 25 requests per second per client.
Data volume sensitivity
MyCase 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 MyCase to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your MyCase 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 MyCase
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.