CRM migration
Field-level mapping, validation, and rollback between LegalServer and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
LegalServer
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between LegalServer and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
LegalServer is a cloud-hosted case management platform designed for civil legal aid, public defenders, and government law departments. Its data model centers on Cases (Matter), Contacts (Person), Organizations (Entity), and a flexible Custom Field architecture organized by module — Custom Matter, Custom Outreach, Custom Timekeeping. LegalServer tracks grant balances with billing types (Flat Hourly Rate, Variable Hourly Rate), poverty-level assessments, and contractor assignments through its Contractor Module. Odoo CRM uses a single crm.lead model that serves as both Lead and Opportunity, with res.partner for contacts and organizations. Odoo stores custom fields as ir.model.fields with an x_ prefix in Community edition or native fields in Enterprise. The Odoo API exposes Leads, Partners, and Opportunities via xmlrpc/jsonrpc, but stage names, tags, and sales team assignments are separate relational records. FlitStack AI extracts LegalServer data via its Core API (limited to 100 records per request, requiring pagination), maps Cases to crm.lead with LegalServer's case status preserved as a custom field, merges Contact and Organization into res.partner, and transfers custom matter fields as Odoo custom fields. Grant billing types and poverty percentages migrate to custom fields for reference. The Odoo module structure means automations, HotDocs document templates, and grant-management workflows must be rebuilt manually — FlitStack exports the LegalServer workflow definitions as a rebuild reference.
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 LegalServer 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.
LegalServer
Contact (Person)
Odoo CRM
res.partner
many:1LegalServer Contact (Person) merges with Organization (Entity) into a single res.partner record in Odoo. LegalServer's separate Person and Entity modules represent the same contact type that Odoo consolidates into one table. N:N case-contact relationships in LegalServer map to Odoo's crm.lead.partner_id Many2one relationship, with the primary contact stored as partner_id and secondary contacts linked via partner_tags.
LegalServer
Organization (Entity)
Odoo CRM
res.partner
many:1LegalServer Organization merges into res.partner alongside Contact. When a Contact is linked to an Organization in LegalServer, Odoo uses the Organization's res.partner as the primary partner and the Contact as a child contact (type='contact'). LegalServer organization hierarchies (parent/child) map to Odoo's parent_id on res.partner.
LegalServer
Case (Matter)
Odoo CRM
crm.lead
1:1LegalServer Case (Matter) maps directly to Odoo crm.lead. Each Case becomes a Lead record in Odoo CRM. LegalServer case status (Active, Closed, Pending) migrates as a custom selection field on crm.lead. Case number and matter ID preserved as external identifier fields for traceability.
LegalServer
Custom Matter Fields
Odoo CRM
crm.lead (x_ custom fields)
1:1LegalServer's Custom Matter fields (module-scoped under Admin > Custom Field Management) map to Odoo custom fields on crm.lead. Each LegalServer Custom Matter field requires an Odoo x_ field to be created before migration. Field type mapping: bool → boolean, lookup → selection, lookup_custom → selection, duration → char.
LegalServer
Custom Outreach Fields
Odoo CRM
res.partner (x_ custom fields)
1:1LegalServer Outreach module custom fields map to custom fields on res.partner. Outreach-specific data such as referral source, outreach type, and contact method are stored as Odoo custom selection or char fields on the partner record for reference and reporting segmentation.
LegalServer
Custom Timekeeping Fields
Odoo CRM
account.analytic.line (x_ custom fields)
1:1LegalServer timekeeping entries with custom fields map to Odoo Timesheets (account.analytic.line). Timekeeping data requires Odoo's Timesheet app to be installed and active on the target database. LegalServer hours, dates, and staff assignments transfer as timesheet lines with custom fields for case-matter reference and billing attribution.
LegalServer
Grant / Billing Type
Odoo CRM
x_grant_billing_type (custom field on crm.lead)
1:1LegalServer grant billing types (Flat Hourly Rate, Variable Hourly Rate) have no direct Odoo CRM equivalent. We map them as a custom selection field (x_grant_billing_type) on crm.lead with the same pick-list values preserved. Grant balance tracking remains in LegalServer or a separate grant management tool.
LegalServer
Financial Information / Poverty Percentage
Odoo CRM
x_poverty_percentage (custom field on res.partner)
1:1LegalServer's financial information screen calculates Percentage of Poverty based on client income and household size relative to federal guidelines. This migrates as a custom float field (x_poverty_percentage) on res.partner. The underlying calculation logic using federal poverty guidelines is not replicated in Odoo — only the resulting percentage value transfers for reporting and eligibility tracking.
LegalServer
Contractor / Panel Attorney
Odoo CRM
res.partner (category_id)
1:manyLegalServer Contractor Module tracks panel attorneys and outside counsel with case assignments. In Odoo, contractors are res.partner records tagged with a Contractor category (using res.partner category). Case-to-contractor assignments map to crm.lead.partner_id where the contractor is flagged as type='contractor' rather than type='contact'.
LegalServer
Document / Attachment
Odoo CRM
ir.attachment
1:1LegalServer documents attached to cases and contacts migrate to Odoo's ir.attachment table linked to crm.lead or res.partner records. File names, dates, and original storage paths are preserved in the attachment metadata. Large files (over 25MB) may require Odoo file storage configuration adjustments.
LegalServer
Prescreen / Intake
Odoo CRM
crm.lead (stage_id)
1:1LegalServer prescreens and intake records are Cases created before a full matter is opened. These migrate to Odoo crm.lead with a dedicated intake stage (New, Qualification, etc.) mapped from LegalServer's prescreen status. LegalServer intake form responses stored as custom fields on the lead record.
LegalServer
Process / Profile Configuration
Odoo CRM
No equivalent (metadata only)
1:1LegalServer dynamic processes, forms, and profiles define the structure of cases, contacts, and workflows. These are configuration metadata, not data records. FlitStack exports the process and profile definitions as JSON for Odoo Studio or developer reference, but the configuration must be rebuilt in Odoo using Studio or custom modules.
| LegalServer | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact (Person) | res.partnermany:1 | Fully supported | |
| Organization (Entity) | res.partnermany:1 | Fully supported | |
| Case (Matter) | crm.lead1:1 | Fully supported | |
| Custom Matter Fields | crm.lead (x_ custom fields)1:1 | Fully supported | |
| Custom Outreach Fields | res.partner (x_ custom fields)1:1 | Fully supported | |
| Custom Timekeeping Fields | account.analytic.line (x_ custom fields)1:1 | Fully supported | |
| Grant / Billing Type | x_grant_billing_type (custom field on crm.lead)1:1 | Fully supported | |
| Financial Information / Poverty Percentage | x_poverty_percentage (custom field on res.partner)1:1 | Fully supported | |
| Contractor / Panel Attorney | res.partner (category_id)1:many | Fully supported | |
| Document / Attachment | ir.attachment1:1 | Fully supported | |
| Prescreen / Intake | crm.lead (stage_id)1:1 | Fully supported | |
| Process / Profile Configuration | No equivalent (metadata only)1: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.
LegalServer gotchas
Dynamic vs static contact record split
v2 API 100-record hard cap on all result sets
Custom fields on versioned subtables require exact path mapping
Grant billing types require pre-migration decision on deduction logic
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
Inventory LegalServer modules and custom field scopes
FlitStack audits your LegalServer configuration via API and admin access to catalog all active modules (Cases, Contacts, Organizations, Grants, Contractors, Timekeeping), custom field definitions under each module scope (Custom Matter, Custom Outreach, Custom Timekeeping), and lookup list values used in billing types, case types, and poverty assessments. This inventory drives the Odoo field creation plan and identifies any LegalServer fields with no Odoo equivalent that will require custom field setup before migration.
Create Odoo custom fields matching LegalServer custom matter and outreach field schemas
Based on the LegalServer field inventory, we create the corresponding Odoo custom fields on crm.lead (for case/matter data), res.partner (for contact and poverty data), and account.analytic.line (for timekeeping). We use Odoo Studio in the target database or direct SQL for Community edition where Studio is unavailable. Field types map: LegalServer bool → Odoo boolean, lookup/lookup_custom → selection, duration → char, text/textarea → text. Billing type and poverty percentage fields are created as selection and float respectively.
Extract LegalServer data via paginated Core API with chunked writes to Odoo
FlitStack runs paginated extraction against LegalServer's Core API v2, handling the 100-record cap per request. We extract Contacts, Organizations, Cases, Grants, Contractors, and Timekeeping entries in separate API calls, preserving foreign-key relationships (contact-to-case, organization-to-contact) for reconstruction in Odoo. For each record type, we write to Odoo via xmlrpc/jsonrpc in migration batches of 500 records, with rollback snapshots at each batch boundary.
Resolve staff-to-user mapping and partner deduplication
LegalServer staff assignments on cases and timekeeping entries resolve to Odoo res.users by email address. Unmatched staff members are flagged and assigned to a fallback Odoo user or held for creation. LegalServer Contact and Organization records that represent the same entity (based on shared email domain or explicit linking) are deduplicated into single res.partner records with the Contact as the primary name.
Run sample migration with field-level diff and validate partner/lead relationships
A representative slice of LegalServer records — typically 100–500 spanning contacts, organizations, cases, and a few timekeeping entries — migrates first. We generate a field-level diff comparing LegalServer source values against Odoo destination values for all mapped fields. Partner-to-lead relationships (primary contact, secondary contacts by tag) are validated against the original LegalServer N:N associations. Grant billing type and poverty percentage values are spot-checked for accuracy before the full run commits.
Execute full migration with delta-pickup window and audit log
The full LegalServer dataset migrates to Odoo CRM with all custom fields populated. A delta-pickup window of 24–48 hours captures any LegalServer records created or modified during the migration window. FlitStack maintains an audit log of every record operation (create, update, link) with source LegalServer ID and destination Odoo ID. One-click rollback is available if reconciliation fails. Post-migration, document templates and automations remain in LegalServer and require Odoo Studio rebuild using the exported workflow definitions.
Platform deep dives
LegalServer
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 LegalServer 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
LegalServer: Not publicly documented; v2 APIs enforce a 100-result hard cap per request regardless of page size.
Data volume sensitivity
LegalServer 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 LegalServer to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your LegalServer 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 LegalServer
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.