CRM migration
Field-level mapping, validation, and rollback between matrix and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
matrix
Source
Odoo CRM
Destination
Compatibility
13 of 13
objects map 1:1 between matrix and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Matrix stores CRM records—contacts, companies, deals, and activities—in its own relational schema. Odoo CRM uses crm.lead for both leads and opportunities, res.partner for contacts and companies, and crm.activity for logged tasks. FlitStack AI reads Matrix's API or export output, maps every standard and custom field into the correct Odoo model, and loads data via Odoo's xmlrpc interface. We preserve deal stage names, owner assignments, and original create dates as custom fields where Odoo's native fields differ. Workflows, automation rules, and scheduled sequences do not migrate—these have to be rebuilt in Odoo's Action Rules and Studio tools. Attachments re-upload to Odoo's ir.attachment storage. The migration runs in a staged sequence (partners first, then leads, then activities) so foreign-key constraints resolve cleanly. A 24–48 hour delta pickup window captures any records modified during cutover. Prior to loading, we validate field formats, de-duplicate contacts by email, and align country and state codes with Odoo's reference tables. Any unmapped custom fields are documented and a field-creation script is generated so your Odoo administrator can add them before the final data run. Post-migration, we provide a reconciliation report that compares record counts and key field values between Matrix and Odoo to confirm completeness.
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 matrix 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.
matrix
Contact
Odoo CRM
res.partner
1:1Matrix contacts map directly to Odoo res.partner records. Type is set to 'contact' (individual). Parent_id is left blank unless Matrix links the contact to a company—in that case parent_id points to the mapped company partner. Email, phone, address, and custom fields are transferred as direct fields or custom columns. Duplicate detection uses email address normalization to avoid creating multiple partner records for the same individual.
matrix
Company
Odoo CRM
res.partner (company type)
1:1Matrix companies map to Odoo res.partner with type='company'. These must load before contacts so that child-partner records can reference the correct parent_id. Website, industry, and employee count all transfer as direct fields on the partner. Company address components are split into street, street2, city, state_id, zip, and country_id. If Matrix stores locations for a company, location is created as a child partner of type 'contact' linked to the parent company.
matrix
Deal / Opportunity
Odoo CRM
crm.lead
1:1Matrix deals become Odoo crm.lead records. The type field is set to 'opportunity' so they appear in the Odoo pipeline view. Stage names are looked up in the target crm_team's stage set and mapped value-by-value. Planned revenue, probability, and close date transfer as fields. Any custom fields are mapped to x_studio columns on crm.lead. If the deal has attachments, they are linked via ir.attachment after the lead record is inserted.
matrix
Lead / Prospect
Odoo CRM
crm.lead (type='lead')
1:1Matrix leads that have not been converted to deals land in Odoo as crm.lead with type='lead'. They appear in the Leads menu rather than the Pipeline. Converting them in Odoo creates the partner record and links the opportunity. Lead source, tags, and fields transfer to the crm.lead record. Stage defaults to the team’s default stage. If the lead has an email, Odoo links it to the matching partner on conversion.
matrix
Pipeline / Stage
Odoo CRM
crm.stage + crm.team
1:1Matrix pipeline stage names map to Odoo crm.stage records. Each stage is scoped to a crm.team via team_id. If Matrix has multiple pipelines, we create multiple Odoo teams and assign their respective stages so stage pick-lists stay correct per team.
matrix
Task / Activity (planned)
Odoo CRM
crm.activity
1:1Matrix scheduled tasks (calls, follow-ups) map to Odoo crm.activity. Activity type_id links to the correct crm.activity.type (call, meeting, etc.) and res_model='crm.lead' attaches the activity to the target opportunity. The mapping also includes the activity's deadline (date_deadline), responsible user (user_id), and optional description. If the activity references a specific contact, the res_id points to the related crm.lead or res.partner record. Unmapped activity types are logged as generic 'Other' and can be reclassified after migration.
matrix
Email / Meeting log
Odoo CRM
mail.message
1:1Logged emails and completed meetings become Odoo mail.message records with model='crm.lead'. The message body and subject transfer; original timestamps are preserved as write_date for audit continuity. Each message record stores the author, body, and creation timestamp. The model field is set to 'crm.lead' and res_id references the target opportunity. Attachments linked to the message are migrated as separate ir.attachment records. Any HTML content is converted to plain text for consistency.
matrix
Note
Odoo CRM
mail.message (note)
1:1Matrix notes migrate as Odoo mail.message records with subtype='mt_note'. They attach to the target crm.lead or res.partner via res_id/res_model. Plain-text formatting is preserved; HTML notes are stripped to plain text to match Odoo's note rendering. The note subtype is set to 'mt_note', ensuring it appears in the Odoo chatter as an internal note. If the original note contains any mention of a contact or deal, the res_id is linked accordingly. Rich-text formatting is simplified to plain text.
matrix
Attachment / File
Odoo CRM
ir.attachment
1:1Matrix file attachments download from the source and re-upload to Odoo's ir.attachment table, linked to the migrated record via res_model and res_id. File name, mimetype, and create date are all preserved. During extraction, file metadata including name, mimetype, and create date are captured. Files are uploaded via Odoo's ir.attachment controller using base64 encoding. Theattachment is linked to the appropriate res_model and res_id. Duplicate files are detected by hash to avoid re-uploading.
matrix
Owner / User
Odoo CRM
res.users
1:1Matrix owner IDs are resolved by email against Odoo res.users. Where no matching user exists, the record is assigned to the migration fallback user and the original owner ID is stored in x_matrix_owner_id for manual reassignment. If the email lookup fails, the record is assigned to a designated fallback user and a custom field x_matrix_owner_id stores the original Matrix owner identifier. The fallback user is configurable and can be changed post-migration. Owner resolution is logged for audit.
matrix
Tag
Odoo CRM
crm.lead.tag
1:1Matrix tags map to Odoo crm.lead.tag records. Tags are de-duplicated (case-insensitive) during migration and written to the crm_lead_tag_rel junction table. Tags shared across multiple record types are preserved per lead. Tag names are normalized to title case and stripped of leading/trailing spaces before insertion. The migration script checks for existing tags in the Odoo database; matching tags are reused rather than duplicated. Tags are associated with leads via the crm_lead_tag_rel junction table.
matrix
Custom Object
Odoo CRM
Custom res.partner fields or ir.model.data
1:1Matrix custom objects with their own schema require Odoo custom field creation before data loads. We document the full custom object schema from Matrix and deliver an Odoo field-creation script as part of the pre-migration plan. For each custom object, we generate a field-creation script that defines the necessary custom fields in Odoo, using x_studio prefixes for Community and Enterprise. The script is reviewed and executed before data loading. Custom object relationships are mapped to many-to-one or one-to-many fields on the target model.
matrix
Lead Source / Campaign
Odoo CRM
utm.source + crm.lead.source_id
1:1Matrix lead source values map to Odoo utm.source records and link via source_id on crm.lead. Where Matrix uses campaign names not present in Odoo's default utm configuration, we pre-create the source records during the schema-setup phase. If a Matrix campaign does not exist in Odoo's utm.source list, the migration script pre-creates the record during the schema-setup phase. Source IDs are stored on crm.lead via source_id. The mapping also preserves medium and campaign tags when present. and ensures proper attribution reporting in Odoo's analytics.
| matrix | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Deal / Opportunity | crm.lead1:1 | Fully supported | |
| Lead / Prospect | crm.lead (type='lead')1:1 | Fully supported | |
| Pipeline / Stage | crm.stage + crm.team1:1 | Fully supported | |
| Task / Activity (planned) | crm.activity1:1 | Fully supported | |
| Email / Meeting log | mail.message1:1 | Fully supported | |
| Note | mail.message (note)1:1 | Fully supported | |
| Attachment / File | ir.attachment1:1 | Fully supported | |
| Owner / User | res.users1:1 | Fully supported | |
| Tag | crm.lead.tag1:1 | Fully supported | |
| Custom Object | Custom res.partner fields or ir.model.data1:1 | Fully supported | |
| Lead Source / Campaign | utm.source + crm.lead.source_id1: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.
matrix gotchas
Platform identity ambiguity across product variants
Inconsistent export mechanisms across product versions
Custom field proliferation by firm
Glitch reports in user reviews may indicate data integrity risk
Limited free trial access complicates migration planning
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 Matrix schema and Odoo target environment
FlitStack AI connects to the Matrix API (or processes a full export) to inventory all object types, custom field definitions, pipeline configurations, and user list. In parallel, we inspect the target Odoo database via xmlrpc to confirm installed modules, existing custom fields, crm.team roster, and stage definitions. The discovery output is a data-map document listing every source field, its target Odoo equivalent, and any pre-creation steps required on the Odoo side.
Pre-create Odoo custom fields and team stage sets
Before any data loads, FlitStack generates an Odoo field-creation script for all x_studio custom fields needed for Matrix data. This script also creates crm.team records and their associated crm.stage entries for each Matrix pipeline discovered. Custom field technical names follow Odoo's x_studio naming convention. The script is reviewed and executed by your Odoo admin or FlitStack's technical team during a shared-screen session so the schema is ready before validation begins.
Validate owner and user email resolution
Matrix owner IDs are matched against Odoo res.users email addresses. Any Matrix owner with no matching Odoo user is flagged in a pre-flight report. Your team decides whether to create the missing Odoo user accounts, assign those records to a migration fallback owner, or leave them flagged for post-migration reassignment. No data loads until owner resolution reaches 100% or your team approves the fallback choice.
Run sample migration with field-level diff
A representative slice of 100–500 records—covering contacts, companies, leads, opportunities, activities, and attachments—is migrated to Odoo first. FlitStack produces a field-level diff showing source values, mapped target values, and any fields that could not map automatically. Your team reviews the diff to confirm stage routing, tag assignment, owner resolution, and custom field population. Adjustments to the mapping rules are applied before the full run commits.
Full migration with delta-pickup and rollback readiness
The complete dataset loads into Odoo in the correct dependency order: res.partner (companies), res.partner (contacts with parent_id), crm.lead (leads and opportunities), crm.activity, mail.message, and ir.attachment. A 24–48 hour delta-pickup window runs in parallel, capturing any Matrix records created or modified during the cutover period. The entire operation is logged to an audit table. If reconciliation identifies missing or duplicate records, FlitStack triggers a one-click rollback to the pre-migration snapshot.
Platform deep dives
matrix
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 matrix 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
matrix: Not publicly documented.
Data volume sensitivity
matrix 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 matrix to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your matrix 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 matrix
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.