CRM migration
Field-level mapping, validation, and rollback between RunSensible and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
RunSensible
Source
Odoo CRM
Destination
Compatibility
11 of 12
objects map 1:1 between RunSensible and Odoo CRM.
Complexity
BStandard
Timeline
24–72 hours
Overview
RunSensible organizes legal practice data around Clients, Matters, Leads, and Billing records — with trust accounting, statute-of-limitations tracking, and court-rules integration built into the core schema. Odoo CRM uses crm.lead for unqualified prospects and crm.opportunity for qualified deals, with res.partner as the unified contact record. The migration carries every RunSensible contact, matter, lead, and billing line into the corresponding Odoo model, applying IOLTA-compliant trust-account mapping to Odoo's account.account structure where relevant. Workflows, email automations, and court-rules triggers do not transfer — FlitStack exports workflow definitions as JSON for your Odoo consultant to rebuild in Odoo's Studio or Python-based automations. The migration engine uses Odoo's xmlrpc API with batched commits to handle large matter volumes without timeouts. We resolve RunSensible owner assignments by email match against Odoo res.users, flagging unmatched users before the first record loads. Billing records including LEDES-coded invoices and three-way IOLTA trust entries are mapped to account.move and account.move.line, with custom fields preserving the original trust transaction type (retainer, deposit, or disbursement) for your accountant to route to the correct IOLTA account after configuration.
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 RunSensible 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.
RunSensible
Client
Odoo CRM
res.partner
1:1RunSensible Client maps to Odoo res.partner with type='contact'. The primary email, phone, and address fields transfer directly. RunSensible's client-level billing flag (IOLTA vs. operating account) maps to a custom selection field on res.partner — Odoo Accounting handles the actual account routing post-migration.
RunSensible
Contact (on Client)
Odoo CRM
res.partner
many:1RunSensible sub-contacts (e.g., opposing counsel, co-counsel, billing contacts) attached to a client merge into Odoo res.partner records linked to the same parent_id. The contact's role label (e.g., 'Billing Contact', 'Primary Attorney') transfers as a custom char field on each partner record. If no parent-child relationship exists in RunSensible, contacts become sibling records without parent linkage.
RunSensible
Matter
Odoo CRM
crm.lead
1:1RunSensible Matters map to Odoo crm.lead when the matter is a prospective or active engagement. Matter name becomes crm.lead name; matter description becomes crm.lead description. Matter status (Open/Closed) maps to crm.lead stage_id — we create a custom stage sequence in Odoo's pipeline for legal-matter lifecycle states.
RunSensible
Matter
Odoo CRM
project.project
1:1Matters with active task tracking (court filings, discovery deadlines, client deliverables) may warrant a project.project record. We migrate the matter as crm.lead and surface a flag field (Matter_Needs_Project__c) for your consultant to create the project record and link it via crm.lead x_project_id.
RunSensible
Lead
Odoo CRM
crm.lead
1:1RunSensible Leads map 1:1 to Odoo crm.lead. The lead source field (e.g., 'Referral', 'Website') maps to crm.lead source_id via Odoo's utm.source mechanism. Lead priority (Low/Medium/High) maps to crm.lead priority field using value_mapping. Unqualified prospects from RunSensible become crm.lead records without an assigned user_id.
RunSensible
Time Entry
Odoo CRM
account.analytic.line
1:1Billable time entries from RunSensible map to Odoo account.analytic.line with product_id, unit_amount (in hours), and partner_id linked to the associated matter's client. Non-billable entries are imported with product_id left null and a note flag for your billing team to review.
RunSensible
Invoice / Bill
Odoo CRM
account.move
1:1RunSensible invoices and bills migrate to Odoo account.move with move_type='out_invoice' or 'in_invoice'. LEDES billing codes map to Odoo's account.account codes via a value-mapping table. The invoice line items reference the analytic lines so Odoo Accounting can reconcile the full matter ledger.
RunSensible
Trust Accounting Entry
Odoo CRM
account.move
1:1IOLTA trust transactions require Odoo Accounting with separate IOLTA and operating accounts configured. We migrate the transaction records with a custom trust_transaction_type field (retainer/deposit/disbursement). The account.account routing must be set up by your Odoo accountant before the records can post correctly.
RunSensible
Document / Attachment
Odoo CRM
ir.attachment
1:1RunSensible matter attachments are downloaded and re-uploaded to Odoo ir.attachment linked to the migrated matter's crm.lead record (res_model='crm.lead', res_id=mapped_lead_id). Large files are batched; inline images in documents are extracted and stored separately to avoid blob-size issues in PostgreSQL. E-signature status is preserved in a custom field on the attachment.
RunSensible
Calendar Event
Odoo CRM
calendar.event
1:1RunSensible matter deadlines and court-date reminders map to Odoo calendar.event with partner_ids linked to the associated res.partner client. Start datetime, stop datetime, and allday flag are preserved. Statute-of-limitations dates surface as all-day calendar events with a custom urgency flag for follow-up.
RunSensible
Custom Field (Matter)
Odoo CRM
ir.model.field
1:1RunSensible custom matter fields (e.g., 'Court District', 'Case Number', 'Statute of Limitations Date') are created as custom fields on crm.lead via Odoo's ir.model.fields API before data loads. Field types are matched: char → char, date → date, selection → selection, decimal → float.
RunSensible
User / Attorney
Odoo CRM
res.users
1:1RunSensible attorney and staff records are matched to Odoo res.users by email. Unmatched attorneys are flagged in a pre-migration report — your Odoo admin either creates the user first or assigns records to a fallback attorney. The RunSensible user role (Partner/Associate/Paralegal) becomes a custom field on res.users.
| RunSensible | Odoo CRM | Compatibility | |
|---|---|---|---|
| Client | res.partner1:1 | Fully supported | |
| Contact (on Client) | res.partnermany:1 | Fully supported | |
| Matter | crm.lead1:1 | Fully supported | |
| Matter | project.project1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Time Entry | account.analytic.line1:1 | Fully supported | |
| Invoice / Bill | account.move1:1 | Fully supported | |
| Trust Accounting Entry | account.move1:1 | Fully supported | |
| Document / Attachment | ir.attachment1:1 | Fully supported | |
| Calendar Event | calendar.event1:1 | Fully supported | |
| Custom Field (Matter) | ir.model.field1:1 | Fully supported | |
| User / Attorney | res.users1: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.
RunSensible gotchas
Trust account balance migration requires three-way reconciliation
Invoice-to-matter linkage is required for billable entries
API access is tier-gated and not available on Essential plan
AI Forms and Execute modules are separate paid add-ons
Client intake forms use conditional logic not preserved in standard export
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 RunSensible data and configure Odoo schema
We export a full inventory of RunSensible clients, contacts, matters, leads, time entries, invoices, documents, and custom fields. Your Odoo admin creates the custom fields on crm.lead and res.partner (case_number, billing_type, statute_of_limitations, attorney_role) before we load data. If you need IOLTA accounting, the Odoo accountant configures the trust and operating accounts in Accounting at this stage. We deliver a schema-setup checklist so nothing is missing when validation runs.
Match RunSensible users to Odoo res.users by email
We pull all RunSensible attorney and staff records and match them to existing Odoo res.users by email address. Any RunSensible user with no Odoo match is listed in a pre-migration report. Your team either creates the Odoo user first or assigns those RunSensible records to a fallback attorney. No matter or time entry loads without a confirmed owner — unowned records are held in a staging state until resolved.
Migrate clients and contacts before matters
Odoo crm.lead requires partner_id to link to res.partner. We sequence the migration so all clients load first, establishing the res.partner IDs that matter records reference. Sub-contacts and child partners load in the same batch, with the RunSensible role label preserved as a custom field on each partner. Any duplicate-client merges identified during the audit are resolved before bulk loading to avoid creating duplicate partner records.
Run a sample migration with field-level diff on 200–500 records
A representative slice of clients, matters, leads, time entries, and invoices migrates first. We generate a field-level diff report showing source vs. destination values for every mapped field, including custom fields and IOLTA flags. You verify that case_number populated correctly, statute-of-limitations dates landed in the right custom field, and time entries link to the correct analytic account. No full run commits until the diff is signed off.
Execute full migration with delta-pickup window
The full RunSensible dataset loads via batched xmlrpc commits with 2-second pauses between batches. During cutover, your team continues working in RunSensible. A 24–48 hour delta-pickup window captures any new matters, time entries, or documents created during the migration run. After the delta captures, we run a final reconciliation report comparing total record counts per object against RunSensible's export totals. Audit log records every insert and link operation.
Platform deep dives
RunSensible
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 RunSensible and Odoo CRM.
Object compatibility
2 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
RunSensible: Not publicly documented.
Data volume sensitivity
RunSensible 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 RunSensible to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your RunSensible 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 RunSensible
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.