CRM migration
Field-level mapping, validation, and rollback between Metis CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Metis CRM
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Metis CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Metis CRM to Odoo CRM is a structural migration from a CSV-export-only client management platform to a modular open-source ERP with a REST API. Metis organizes data around a client-centric model with Clients, Opportunities, Jobs, People, Timesheets, and Expenses as the primary zones; Odoo uses res.partner as the unified contact/account object, crm.lead for pipeline opportunities, project.project for job tracking, and hr_expense for expense reimbursement. Since Metis publishes no public REST API, all extraction runs through per-zone CSV exports, and we handle receipt images as a parallel file transfer. We sequence the migration starting with parent records (Clients, People) before child records (Opportunities, Jobs, Timesheets) to preserve relationships. Orphan time entries without a linked Job and resourcing report views (which are filtered views, not transactional objects) require explicit handling decisions from the customer during scoping. We do not migrate automations, workflows, or reporting configurations; these are documented for the customer's Odoo admin to rebuild in Odoo's studio environment.
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 Metis CRM 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.
Metis CRM
Clients
Odoo CRM
res.partner
1:1Metis Client records map to Odoo res.partner with company_type=company. We extract client name, address fields, contact details, and any custom client properties from the Clients zone CSV. The res.partner record is the parent object for all subsequent imports; we create partners before People to satisfy the customer relationship on any individual contact records that reference a client.
Metis CRM
People
Odoo CRM
res.partner
1:1Metis People records map to Odoo res.partner with company_type=person, linked to a parent company partner when a client association exists. Role, contact details, and related client references migrate as custom fields or tags on the partner record. People records that represent the same individual as a client contact (e.g., the primary client contact) are deduplicated against the client partner by email match.
Metis CRM
Opportunities
Odoo CRM
crm.lead
1:1Metis Opportunities map to Odoo crm.lead with type=opportunity. Stage name from Metis maps to stage_id, deal value maps to planned_revenue, and client association maps to partner_id via the Client partner lookup. We configure Odoo CRM pipeline stages to match Metis opportunity stages before migration, and probability percentages are set per stage during schema setup.
Metis CRM
Jobs
Odoo CRM
project.project
1:1Metis Jobs map to Odoo project.project with the client mapped to partner_id and job status mapped to project state. Job costing fields from Metis migrate as custom project fields or product-linked analytic accounts. We sequence Jobs migration after Clients so that partner_id lookups resolve on first pass rather than requiring a second reconciliation pass.
Metis CRM
Timesheets
Odoo CRM
account.analytic.line
1:1Metis Timesheet entries map to Odoo account.analytic.line with date, unit_amount (hours), and user_id resolved from the People record. We link timesheet lines to project_id (from the associated Job) where a Job association exists. Timesheet entries without a Job association are flagged as orphans in the pre-migration audit and presented to the customer for a mapping decision: assign to a default project, create placeholder projects, or exclude.
Metis CRM
People Expenses
Odoo CRM
hr_expense
1:1Metis People Expenses map to Odoo hr_expense with amount, date, category, and description fields. Receipt images are stored as separate files in the Metis export and migrate as hr_expense attachment records linked to the expense sheet. We handle receipt files as a parallel file transfer and flag each expense record with a re-attachment confirmation note in the migration log.
Metis CRM
Central Expenses
Odoo CRM
account.move
1:1Metis Central Expenses (agency-level overhead costs) map to Odoo account.move as vendor bills or journal entries depending on the expense category. Receipt files for Central Expenses migrate as attachments on the account.move record. Central Expenses that represent recoverable costs against a client may alternatively map to hr_expense sheets if the Odoo expense approval workflow applies.
Metis CRM
Opportunity Stage
Odoo CRM
crm.stage
lossyMetis opportunity stages are configured in Odoo CRM as crm.stage records within the appropriate sales team. We map each Metis stage name to a corresponding Odoo stage with matching sequence order and probability percentage. Stage configuration is completed before opportunity migration begins so that stage_id references resolve during the opportunity import.
Metis CRM
Job Status
Odoo CRM
project.project state
lossyMetis job status values (e.g., Active, Completed, On Hold, Cancelled) map to Odoo project state values or project.stage records. We configure project stages during the schema design phase to match the customer's operational workflow before job data is imported.
Metis CRM
Resourcing Report
Odoo CRM
Custom report or project.task
lossyMetis Resourcing Reports are filtered views combining People availability with Job assignments, not transactional records. We do not migrate resourcing reports as data. Instead, we extract the underlying People and Job assignment data and recommend rebuilding the resourcing view as an Odoo custom report using Odoo Studio or as a project.task-based allocation matrix. The customer decides on the preferred approach during scoping.
Metis CRM
Xero-friendly People Expenses
Odoo CRM
Not migrated
1:1The Xero-friendly People Expenses export is a destination-format variant designed for direct Xero import, not a general migration source format. We do not use this export as our source. Standard People Expenses CSV is the migration source, and Xero mapping is handled as a destination-side transformation if the customer also migrates to Odoo Accounting.
Metis CRM
Owner (People with role)
Odoo CRM
res.users
1:1Metis People records with a staff role map to Odoo res.users by email match. We resolve every distinct owner referenced on Opportunities, Jobs, and Timesheets against the Odoo user table. Any Metis owner without a matching Odoo user is held in a reconciliation queue for the customer's admin to provision before record import continues.
| Metis CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Clients | res.partner1:1 | Fully supported | |
| People | res.partner1:1 | Fully supported | |
| Opportunities | crm.lead1:1 | Fully supported | |
| Jobs | project.project1:1 | Fully supported | |
| Timesheets | account.analytic.line1:1 | Mapping required | |
| People Expenses | hr_expense1:1 | Mapping required | |
| Central Expenses | account.move1:1 | Mapping required | |
| Opportunity Stage | crm.stagelossy | Fully supported | |
| Job Status | project.project statelossy | Fully supported | |
| Resourcing Report | Custom report or project.tasklossy | Mapping required | |
| Xero-friendly People Expenses | Not migrated1:1 | Not supported | |
| Owner (People with role) | 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.
Metis CRM gotchas
No public API forces CSV-only migration paths
Receipt images exported as separate files outside the main CSV
Orphan time entries without a linked Job
Xero-friendly export is a destination format, not a source object
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
Discovery and zone export coordination
We audit the Metis account across all zones (Clients, Opportunities, Jobs, People, Timesheets, Expenses) to establish record counts, identify custom fields, and assess data quality. We coordinate with the customer to export each zone as a clean CSV from the Metis help center, validating column headers and flagging any renamed or missing fields. We also extract receipt image files from the Expenses zone for parallel transfer. The discovery output is a written scope document, a Metis field-to-Odoo field mapping draft, and an orphan time entry report.
Schema design and Odoo module planning
We design the destination schema in Odoo. This includes configuring CRM pipeline stages to match Metis opportunity stages, provisioning project.project stages to match Metis job statuses, configuring hr_expense sheet approval workflows, and planning any custom fields needed to carry Metis-specific data (e.g., client cost codes, job costing fields). We recommend which Odoo apps to install (CRM, Project, Timesheet, Expenses, and optionally Accounting) and whether Odoo Community or Enterprise is the appropriate destination edition based on the customer's module requirements.
Sandbox migration and reconciliation
We run a full migration into an Odoo test database using production-like data volume. The customer's team reconciles record counts (Clients in, People in, Opportunities in, Jobs in, Timesheets in, Expenses in), spot-checks 25-50 records against the Metis source, and validates that parent-record lookups (partner_id on opportunities, project_id on timesheets) resolve correctly. Orphan time entries are resolved according to the customer's chosen strategy from the scoping phase. Any mapping corrections happen in the test environment before production migration begins.
Owner and user reconciliation
We extract every distinct owner referenced on Opportunities, Jobs, and Timesheets and match by email against the Odoo destination's res.users table. Owners without a matching user go to a reconciliation queue. The customer's Odoo admin provisions any missing users (active or inactive depending on whether the original Metis user is still active). Migration cannot proceed past this step because timesheet lines, opportunity assignments, and project allocations all require a valid user_id in Odoo.
Production migration in dependency order
We run production migration in record-dependency order: res.partner records for Clients (first), res.partner records for People linked to Clients (second), crm.lead opportunities with partner_id and user_id resolved, project.project records with partner_id resolved, account.analytic.line timesheet entries with project_id and user_id resolved, hr_expense sheets with receipt attachments linked, and account.move central expense entries. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and automation handoff
We freeze Metis writes during the cutover window, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver a written inventory of Metis automation equivalents for the customer's Odoo admin to rebuild using Odoo Studio or custom module development, including CRM automation rules, stage-change triggers, and timesheet approval workflows. We do not rebuild automations as code inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
Metis CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Metis CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Metis CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Metis CRM 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
Metis CRM: Not publicly documented.
Data volume sensitivity
Metis CRM 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 Metis CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Metis CRM 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 Metis CRM
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.