CRM migration
Field-level mapping, validation, and rollback between Actionstep and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Actionstep
Source
Odoo CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Actionstep and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours of clock time
Overview
Actionstep is a legal practice management platform centred on matters, participants, document management, and trust accounting workflows. Odoo CRM is a modular business suite that models leads as crm.lead records and contacts as res.partner entries, with pipeline stages defined by stage categories rather than matter types. The migration challenge is structural: Actionstep's matter-centric hierarchy (where participants, documents, and billing are sub-records of a matter) must be decomposed and distributed across Odoo's flat object model — leads become crm.lead rows, contact persons become res.partner records with an linked_id to the lead, and billing data is preserved as reference fields on the partner record. FlitStack AI reads Actionstep's REST API (respecting the 200-record pageSize limit and April-2024 rate limits), transforms matter data into crm.lead with the original matter type mapped to a custom Stage Category, and surfaces participant roles, document attachment URLs, and trust transaction references as Odoo custom fields. Workflow automations, document automation templates, and trust accounting rules cannot migrate — they require Odoo Studio rebuilds — but we export their definitions as a structured reference document. The migration runs in three passes: participants and contacts first (so res.partner IDs exist), then matters as leads (with responsible_user resolved by email match), then attachments re-uploaded to Odoo Documents.
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 Actionstep 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.
Actionstep
Matter
Odoo CRM
crm.lead
1:1Actionstep matters map 1:1 to Odoo crm.lead records. The matter type (e.g., litigation, corporate, family) maps to a custom field (matter_type__c) and also influences the lead's stage category in Odoo. The matter's responsible user is resolved to an Odoo res.users record by email match before import.
Actionstep
Matter.participant (role = Client / Contact Person)
Odoo CRM
res.partner
1:1Each Actionstep participant of type 'Client' or 'Contact Person' becomes a res.partner record. The participant's email address is the unique key for de-duplication. When a single participant appears on multiple matters, one res.partner record is created and linked to each relevant crm.lead via crm.lead.partner_id.
Actionstep
Matter.participant (role = Witness / Opposing Counsel / Other)
Odoo CRM
res.partner + res.partner.category
1:1Non-client participants are imported as res.partner with the participant role stored as a res.partner.category tag (e.g., 'Opposing Counsel', 'Expert Witness'). Odoo partner categories must be pre-created in Settings > Contacts > Contact Tags before migration runs. Each distinct role in Actionstep becomes a corresponding Odoo contact tag; tag names must match the Actionstep role labels exactly for correct assignment during the import pass. Participants without a defined role receive a default 'General Contact' category tag.
Actionstep
Matter.stage
Odoo CRM
crm.stage
1:1Actionstep matter stages (New, In Progress, On Hold, Closed Won, Closed Lost) map value-by-value to Odoo crm.stage records within the default pipeline. Stage names are preserved exactly; stage sequence order is carried over from Actionstep's step ordering. Custom stages in Actionstep are created as new crm.stage records in the target pipeline before migration, ensuring no stage mapping is skipped during the import pass.
Actionstep
Matter.description / Matter.notes
Odoo CRM
crm.lead.description
1:1Matter-level description text migrates as plain text into crm.lead.description. Rich-text formatting in Actionstep notes is stripped to plain text during transformation — we flag any HTML-formatted notes before import. If a matter has no description or notes, the crm.lead.description field is left blank. Bullet points and numbered lists from Actionstep are converted to plain text with line breaks preserved.
Actionstep
Matter.document (attachment)
Odoo CRM
ir.attachment
1:1Actionstep documents linked to a matter are downloaded and re-uploaded to Odoo's ir.attachment table, keyed to the corresponding crm.lead record via res_model='crm.lead' and res_id=<lead_id>. Binary file contents are base64-encoded. Inline images in notes are extracted and saved as separate attachments.
Actionstep
Matter.billing_line (time entry / invoice line)
Odoo CRM
account.move.line (reference only)
1:1Actionstep billing lines and time entries are preserved as a custom JSON field on the crm.lead (billing_lines__c) rather than as live account.move records, because Odoo accounting requires a chart of accounts to be configured first. We surface the billing data for your accountant to create proper invoices in Odoo after go-live.
Actionstep
Matter.trust_transaction
Odoo CRM
Custom field on res.partner
1:1Trust accounting balances and transaction history from Actionstep migrate as a custom text field (trust_balance__c) and a JSON log (trust_transactions__c) on the associated res.partner record. Odoo does not have native trust accounting — your finance team rebuilds this in Odoo Accounting using the exported reference data.
Actionstep
Matter.custom_data_field (custom matter fields)
Odoo CRM
ir.model.fields (custom) on crm.lead
1:1Actionstep Builder custom data fields defined on matter types are created as custom ir.model.fields on crm.lead in Odoo Studio before migration. Field type mapping: text → char, number → float or integer, date → date, picklist → selection. All custom field definitions are captured from Actionstep's data collection schema during the audit phase.
Actionstep
Matter.custom_data_field (on participants)
Odoo CRM
ir.model.fields (custom) on res.partner
1:1Custom fields attached to participant records in Actionstep are created as custom ir.model.fields on res.partner in Odoo Studio before migration begins. Participant-specific custom fields such as bar_number and jurisdiction are mapped to dedicated char fields with the original field label preserved for reference. Each custom field definition is captured from Actionstep's data collection schema during the audit phase, ensuring no participant-specific attributes are dropped during the transformation pass.
Actionstep
Matter.activity_log (calls, tasks, meetings)
Odoo CRM
mail.activity
1:1Actionstep task and activity records linked to a matter are imported as Odoo mail.activity records, linked to the crm.lead by res_model='crm.lead'. Original activity dates, user assignments, and descriptions are preserved. The mail.activity.type is inferred from Actionstep's activity category. Calls, tasks, and meetings each map to the corresponding Odoo activity type; any unmatched activity categories are logged for manual type assignment after migration.
Actionstep
Matter.related_matter (linked matters)
Odoo CRM
Custom relation field on crm.lead
1:1Actionstep allows matters to be linked in parent-child or reference relationships. In Odoo these map to a custom many2one field (related_matter_id__c) pointing to the related crm.lead. Circular references are flagged and resolved before the import commits. The relationship type (parent, child, related) is captured in a companion selection field for audit purposes.
| Actionstep | Odoo CRM | Compatibility | |
|---|---|---|---|
| Matter | crm.lead1:1 | Fully supported | |
| Matter.participant (role = Client / Contact Person) | res.partner1:1 | Fully supported | |
| Matter.participant (role = Witness / Opposing Counsel / Other) | res.partner + res.partner.category1:1 | Fully supported | |
| Matter.stage | crm.stage1:1 | Fully supported | |
| Matter.description / Matter.notes | crm.lead.description1:1 | Fully supported | |
| Matter.document (attachment) | ir.attachment1:1 | Fully supported | |
| Matter.billing_line (time entry / invoice line) | account.move.line (reference only)1:1 | Fully supported | |
| Matter.trust_transaction | Custom field on res.partner1:1 | Fully supported | |
| Matter.custom_data_field (custom matter fields) | ir.model.fields (custom) on crm.lead1:1 | Fully supported | |
| Matter.custom_data_field (on participants) | ir.model.fields (custom) on res.partner1:1 | Fully supported | |
| Matter.activity_log (calls, tasks, meetings) | mail.activity1:1 | Fully supported | |
| Matter.related_matter (linked matters) | Custom relation field on crm.lead1: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.
Actionstep gotchas
API is case-sensitive and requires exact casing
No system account access — API is user-centric
Rate limiting introduced April 2024 limits bulk export speed
Trust accounting transactions require special migration handling
Workflow automations are not API-exportable
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 Actionstep data and confirm API access
FlitStack connects to your Actionstep REST API using credentials from a dedicated migration user account. We run a discovery pass that enumerates all matter types, data collections, custom fields, participant roles, and document types across your Actionstep org. The audit output is a data map document that lists every source object, the record count per type, and the target Odoo model. We also confirm your Odoo edition and API availability during this phase so we can confirm whether the migration will use Odoo's XML-RPC API or CSV import. This step takes one to two business days and requires read-only API credentials for Actionstep.
Design Odoo schema and pre-create custom fields
Before any data is written to Odoo, our team creates the custom fields, partner categories, stage records, and tag definitions required by the object mapping. This includes crm.lead custom fields for matter_type__c, source_matter_id__c, billing_lines__c, and trust fields, plus res.partner custom fields for participant_role__c and bar_number__c. If you are on Odoo Community without external API access, we also prepare the CSV import templates with all column headers and pick-list values pre-populated so they are ready for Odoo's native import wizard. This step requires an Odoo admin user with Studio access to confirm field creation before we proceed.
Export and transform data in dependency order
The migration runs in four sequenced passes. Pass 1 extracts all Actionstep participants and writes them as res.partner records, building a participant_id lookup table keyed by email. Pass 2 extracts all matters and writes them as crm.lead records, resolving the responsible user by email match to Odoo res.users and linking the primary client participant via partner_id. Pass 3 uploads all document attachments to ir.attachment, keyed to the correct crm.lead by source matter ID. Pass 4 imports mail.activity records linked to the crm.lead rows created in Pass 2. Each pass validates foreign key integrity before the next pass begins — if a participant email cannot be resolved to a res.partner, the matter is flagged and the record held in a review queue rather than committed.
Run sample migration with field-level diff
A representative slice of 100–300 records — covering at least three matter types, ten participants, and a mix of attached documents and activities — migrates first. We generate a field-level diff report comparing the source Actionstep values against the destination Odoo values for every mapped field. You review the diff to confirm that matter types map correctly, participant roles are tagged as expected, and document attachment names match the source. Any field mapping errors discovered in the sample are corrected before the full migration runs. This step typically takes one to two business days.
Full migration with delta-pickup window
The full data set migrates using the validated mapping from the sample pass. During migration, your team continues working in Actionstep. A delta-pickup window of 24–48 hours captures any matters created or modified after the initial export snapshot. Audit logging records every record written, the source ID, the destination Odoo ID, and any records that received a fallback owner assignment. After the delta window closes, we run a reconciliation report comparing the final Odoo record count against the Actionstep source count by record type. One-click rollback is available if the reconciliation reveals discrepancies above your agreed tolerance threshold (typically 0.5% of records).
Platform deep dives
Actionstep
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Actionstep and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Actionstep and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Actionstep and Odoo CRM.
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
Actionstep: Rate limiting introduced April 2024 — limits not publicly documented per endpoint; page size capped at 200 records per request.
Data volume sensitivity
Actionstep 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 Actionstep to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Actionstep 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 Actionstep
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.