CRM migration
Field-level mapping, validation, and rollback between m-savvy and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
m-savvy
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between m-savvy and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Migrating from m-savvy to Odoo CRM is a structural migration across two fundamentally different data models. M-savvy's Contact and Account (Company) pair maps to Odoo's Partner object, where the is_company flag determines whether a Partner represents a person or an organization. Deals map to Odoo CRM Opportunities with stage names remapped to match the destination pipeline. Leads map directly to Odoo CRM Leads for pre-qualification records, and qualified Leads or existing Contacts map to Opportunities. We run a full API discovery pass on the source m-savvy org before migration because m-savvy does not publish a public schema reference for custom objects or all standard fields. M-savvy's plan-tier restrictions on export volumes require plan verification during scoping, and attachment files require a separate file-export pass that is not included in standard record exports. Workflows, automations, and reporting configurations do not migrate; we deliver a written inventory of these for the customer's admin to rebuild in Odoo Studio post-migration.
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 m-savvy 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.
m-savvy
Contact
Odoo CRM
Partner
1:manyM-savvy Contact records map to Odoo CRM Partner records. When a m-savvy Contact has a linked Account (Company), we create a parent Partner with is_company=True and a child Partner record with is_company=False for the individual contact. If m-savvy Contact has no Account link, it becomes a Partner with is_company=False. The original m-savvy lifecycle stage, phone, email, address, and owner fields migrate to the corresponding Odoo Partner fields. Custom contact properties discovered during API scoping migrate as custom fields on res.partner.
m-savvy
Account (Company)
Odoo CRM
Partner (parent, is_company=True)
1:1M-savvy Account records map to Odoo Partner records with is_company=True. Industry, size, billing address, and domain fields from the Account map to Odoo Partner fields including industry_id, website, and address fields. Account is created before Contact import so that the parent relationship is resolved at Contact insert time. If a m-savvy Contact has no linked Account, we create a standalone individual Partner.
m-savvy
Deal
Odoo CRM
CRM Opportunity
1:1M-savvy Deal records map to Odoo CRM Opportunity records. Deal stage, amount, close date, probability, and custom fields migrate directly. The m-savvy pipeline assignment maps to an Odoo CRM Team and pipeline, and Deal stage names are remapped to the destination pipeline stage sequence. Closed-won and closed-lost reasons from m-savvy custom fields migrate as Odoo Lost Reason or custom fields on crm.lead.
m-savvy
Pipeline and Pipeline Stages
Odoo CRM
CRM Pipeline and Stage
lossyM-savvy pipeline definitions and stage names are read from the live API during discovery. Each m-savvy pipeline becomes an Odoo CRM Pipeline (crm.team or crm.pipeline), and stage names are mapped to Odoo stage records within that pipeline. We flag any stage name or count mismatch and propose a stage mapping table for customer approval before migration.
m-savvy
Lead
Odoo CRM
CRM Lead
1:1M-savvy Lead records map directly to Odoo CRM Lead records. Lead status, lead source, and any scoring fields migrate as Odoo Lead fields. The m-savvy owner (sales rep) resolves to an Odoo User by email match. If a m-savvy Lead is already qualified and should be treated as a Contact or Opportunity in Odoo, the customer defines the rule during scoping and we apply it at migration time.
m-savvy
Activity (emails, calls, tasks, meetings)
Odoo CRM
Task, Meeting, Call
1:1M-savvy Activity records are discriminated by type during extraction and mapped to the corresponding Odoo object: email-type activities map to Odoo Mail Message records linked to the Partner or Opportunity; task-type activities map to Odoo Project Task or CRM Activity records; meeting-type activities map to Odoo Calendar.Event records with attendee links to the Partner. We preserve the original timestamp and body content. Archived or deleted activities are excluded.
m-savvy
Custom Objects
Odoo CRM
Custom Model
1:1M-savvy custom objects are not documented in a public schema reference. We inspect the live org via API during the discovery phase to enumerate custom object types, field definitions, and relationships. Each discovered custom object becomes a custom Odoo model with matching field names and types, including many2one lookups to standard objects (Partner, Opportunity) and many2many relationships. The schema map is shared with the customer for confirmation before any data moves.
m-savvy
Attachments
Odoo CRM
ir.attachment
1:1Attachment files in m-savvy are stored separately from record data and require a dedicated file-export pass using m-savvy's file storage API endpoints. We download files to our staging environment, then upload to Odoo via the ir.attachment model, setting res_model to the destination object (res.partner, crm.lead, etc.) and res_id to the migrated record ID. Any file whose parent record failed to migrate is flagged and held for manual review.
m-savvy
Owner (User)
Odoo CRM
User
1:1M-savvy Owner records map to Odoo User records by email address match. We extract every distinct owner referenced on Contact, Account, Deal, and Activity records and match against the destination Odoo User list. Any m-savvy owner without a matching Odoo User is placed in a reconciliation queue for the customer's admin to provision before record import resumes.
m-savvy
Sales Team / Pipeline Assignment
Odoo CRM
CRM Team
1:1M-savvy pipeline and stage assignments on Deal records map to Odoo CRM Teams. Each distinct pipeline in m-savvy becomes a CRM Team in Odoo, and Deals are assigned to the corresponding team member's pipeline view. The customer configures team membership in Odoo before migration begins.
m-savvy
Notes
Odoo CRM
Mail Message
1:1M-savvy Notes attached to Contact, Account, or Deal records migrate as Odoo Mail Message records on the related Partner or Opportunity. Rich text formatting is preserved. Note attachments (files within a note) migrate as ir.attachment records linked to the same parent object.
m-savvy
Tags / Labels
Odoo CRM
Tags
lossyM-savvy tag values on Contact, Account, or Deal records migrate to Odoo CRM tags (ir.model.data for crm.lead.tag). Tags used for classification purposes become tag records in Odoo and are linked via the many2many relationship on the Lead and Opportunity models.
| m-savvy | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Partner1:many | Fully supported | |
| Account (Company) | Partner (parent, is_company=True)1:1 | Fully supported | |
| Deal | CRM Opportunity1:1 | Fully supported | |
| Pipeline and Pipeline Stages | CRM Pipeline and Stagelossy | Fully supported | |
| Lead | CRM Lead1:1 | Fully supported | |
| Activity (emails, calls, tasks, meetings) | Task, Meeting, Call1:1 | Fully supported | |
| Custom Objects | Custom Model1:1 | Mapping required | |
| Attachments | ir.attachment1:1 | Mapping required | |
| Owner (User) | User1:1 | Fully supported | |
| Sales Team / Pipeline Assignment | CRM Team1:1 | Fully supported | |
| Notes | Mail Message1:1 | Fully supported | |
| Tags / Labels | Tagslossy | 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.
m-savvy gotchas
Custom object schemas require manual discovery before migration
Plan tier restrictions limit exportable record volumes
Attachment files are not embedded in record exports
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 plan verification
We audit the source m-savvy org via API across all record types present, including Contacts, Accounts, Deals, Leads, Activities, and any custom objects discovered through live API inspection. We verify the customer's current m-savvy plan tier to confirm export volume limits and identify whether a temporary upgrade is needed. We enumerate attachment volumes via the file storage API. The discovery output is a written schema map, record count inventory, and a migration scope document that the customer approves before any data moves.
Schema design and mapping specification
We design the destination Odoo CRM schema based on the discovery output. This includes confirming Partner records (is_company=True for Account-level, is_company=False for individual Contact records), creating custom fields on the Partner model for any m-savvy contact properties not natively supported, designing the CRM pipeline and stage sequence mapped from m-savvy pipeline definitions, and provisioning any custom Odoo models for discovered m-savvy custom objects. The mapping specification is a shared document reviewed by the customer's Odoo admin before implementation begins.
Owner reconciliation and user provisioning
We extract every distinct owner referenced on Contact, Account, Deal, and Activity records and match by email address against the destination Odoo User table. Owners without a matching Odoo User are placed in a reconciliation queue. The customer's Odoo admin provisions any missing users (active status determined by whether the original m-savvy owner is still active in the system). Migration cannot proceed past this step because Odoo requires a valid user reference for record assignment.
Sandbox migration and reconciliation
We run a full migration into a staging or development Odoo environment using production-equivalent data volumes. The customer reconciles record counts (Partners in, Leads in, Opportunities in, Activities in), spot-checks 25-50 records against the m-savvy source, and approves the schema and mapping before production migration begins. Any mapping corrections are made during this phase. Odoo access control configuration is also validated in staging to confirm record visibility behaves as expected.
Production migration in dependency order
We run production migration in record-dependency order: Users (provisioned, validated), Partners from Accounts (parent records), Partners from Contacts (child records with parent Partner resolution), CRM Leads, CRM Opportunities with pipeline and stage assignment, Activity history (Mail Messages, Tasks, Calendar Events via Odoo RPC), Custom Objects (last, with lookups to standard records resolved), and attachment files (linked after parent records are confirmed). Each phase emits a row-count reconciliation report before the next phase begins. We apply exponential backoff and batch chunking on the Odoo XML-RPC API to stay within rate limits.
Cutover, validation, and workflow rebuild handoff
We freeze writes in m-savvy during the cutover window, run a final delta migration of any records modified during the migration run, then mark Odoo CRM as the system of record. We deliver a written inventory of all m-savvy workflows, automations, and reporting configurations not migrated, with a rebuild recommendation for Odoo Studio or custom development. We support a one-week hypercare window for reconciliation issues. We do not rebuild workflows or automations inside the migration scope; that is a separate engagement or an internal Odoo admin task.
Platform deep dives
m-savvy
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 m-savvy and Odoo CRM.
Object compatibility
3 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
m-savvy: Not publicly documented.
Data volume sensitivity
m-savvy 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 m-savvy to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your m-savvy 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 m-savvy
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.