CRM migration

Migrate from MARS to Odoo CRM

Field-level mapping, validation, and rollback between MARS and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

MARS logo

MARS

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

71%

10 of 14

objects map 1:1 between MARS and Odoo CRM.

Complexity

CModerate

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from MARS to Odoo CRM is a data restructuring migration, not a record copy. MARS stores Contacts, Companies, and Deals as separate primary objects; Odoo CRM uses the res.partner model for both individual contacts and organizations, with opportunities linked as crm.lead records. We resolve the MARS Company-to-res.partner mapping during scoping, splitting company-level data onto a commercial partner record and contact-level data onto a separate contact partner record, with proper address inheritance. Activity history in MARS migrates to Odoo's mail.message and crm.activity models via XML-RPC batch insertion with parent-record resolution. Workflows, email templates, and reporting configurations do not migrate; we deliver a written inventory of these for the customer to rebuild in Odoo Studio or through custom development.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

MARS logo

MARS

What's pushing teams away

  • Limited public footprint makes peer validation impossible and slows due diligence.
  • No publicly documented developer API restricts integration into modern BI, marketing, and automation tools.
  • Smaller vendor scale translates to thinner partner ecosystem and integration libraries.
  • Mobile, cloud-native UX, and modern admin tooling typically lag market leaders.
  • Pricing and contract terms are sales-led with no transparency for early-stage evaluation.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How MARS objects map to Odoo CRM

Each row shows how a MARS 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.

MARS

Contact

maps to

Odoo CRM

res.partner (individual)

1:1
Fully supported

MARS Contact records map to Odoo res.partner with partner_type set to 'contact'. The MARS first_name and last_name fields concatenate to the res.partner name field. Email maps to email, phone to phone, and mobile to mobile. Street, city, state, zip, country from MARS address fields map to street, city, state_id (resolved from country/state table), zip, and country_id. We create the res.partner record first so that it is available as a parent_id for any MARS Contact records that share the same company.

MARS

Company

maps to

Odoo CRM

res.partner (company)

1:1
Fully supported

MARS Company records map to Odoo res.partner with partner_type set to 'company' and is_company set to True. The company name becomes res.partner name. Website, industry, employee_count, and annual_revenue map to website, industry_id, employee_count, and revenue fields respectively. We use the MARS company domain to populate website without the http prefix. The commercial partner (contact of the company contact) is created for company-level contacts that exist in MARS as Company-linked individuals.

MARS

Deal

maps to

Odoo CRM

crm.lead (opportunity)

1:1
Fully supported

MARS Deal records map to Odoo crm.lead with type set to 'opportunity'. The MARS deal name maps to name, expected_close_date to date_deadline, amount to planned_revenue, and probability to probability (with stage-based defaults overridden if MARS stores explicit probability). partner_id (the commercial partner lookup) is resolved from the MARS deal's linked company or contact via email domain match against res.partner. user_id maps to the Odoo res.users owner resolved by email.

MARS

Deal Stage

maps to

Odoo CRM

crm.stage

lossy
Fully supported

Each MARS pipeline stage becomes an Odoo crm.stage record within the relevant crm.team's stage pool. Stage sequence order and name migrate directly. Probability percentages migrate to the probability field on each stage. If MARS stores won/lost as stage properties, these map to fold (archived won) and stage_type (won/lost). We configure stage before opportunity migration so that stage_id lookups resolve during import.

MARS

Pipeline

maps to

Odoo CRM

crm.team + crm.stage pool

lossy
Fully supported

MARS deal pipelines map to Odoo crm.team records (one per pipeline). Each crm.team gets its own stage pool via team_use = 'multi' in the crm.team configuration. Stage assignments in MARS determine which crm.team a crm.lead belongs to via the team_id field. This mapping requires crm.team to be created before opportunities are imported.

MARS

Owner

maps to

Odoo CRM

res.users

1:1
Fully supported

MARS Owner records are resolved by email match against Odoo res.users. The MARS owner_id on each Contact, Company, and Deal record maps to the user_id or user_ids field in Odoo on the corresponding model. Any MARS Owner without a matching Odoo res.users is placed in a reconciliation queue for the customer's admin to provision the User before record import resumes.

MARS

Activity: Email

maps to

Odoo CRM

mail.message

1:1
Fully supported

MARS email engagements map to Odoo mail.message records with message_type = 'email'. The email subject maps to subject, body to body (HTML preserved), and date to date. The mail.message record is linked to its parent res.partner via res_id and model = 'res.partner'. We batch insert via XML-RPC in chunks of 100 to respect Odoo's request size limits.

MARS

Activity: Call

maps to

Odoo CRM

crm.activity

1:1
Fully supported

MARS call engagements map to Odoo crm.activity records with activity_type_id referencing the phone call activity type. Call duration, disposition, and notes map to custom fields on crm.activity. The activity is linked to the parent res.partner (contact) via res_id and model. Activity date preserves the original MARS timestamp for timeline ordering.

MARS

Activity: Meeting

maps to

Odoo CRM

calendar.event

1:1
Fully supported

MARS meeting engagements map to Odoo calendar.event records. Start datetime and end datetime migrate to start and stop. Location maps to location. Attendees are linked via calendar.attendee records pointing to the res.partner invitees. Meeting notes map to description. We create calendar.event records via XML-RPC after res.partner records are fully loaded.

MARS

Activity: Task

maps to

Odoo CRM

project.task or crm.activity

lossy
Fully supported

MARS task engagements map to Odoo project.task if the customer requires project management capabilities, or to crm.activity if tasks are scoped to CRM activity tracking. Task title, description, due date, priority, and completion status migrate directly. Assignment resolves to res.users via email match. The customer selects the target model during scoping.

MARS

Tag

maps to

Odoo CRM

crm.tag + crm.lead.tag.rel

1:1
Fully supported

MARS tags on Deals map to Odoo crm.tag records. The tag-to-record association migrates via crm.lead.tag.rel (many-to-many). Tags stored on Contacts map via res.partner.category (which is a generic tag model in Odoo used across multiple objects). Tag names preserve exactly as stored in MARS for consistency with existing reporting.

MARS

Custom Field

maps to

Odoo CRM

ir.model.fields

lossy
Fully supported

MARS custom fields on Contact, Company, and Deal objects require pre-creation in Odoo before migration begins. We use the ir.model.fields API to create custom fields with the correct field type (char, text, integer, float, boolean, date, datetime, selection, many2one, one2many, many2many) matched from MARS field types. Custom fields are created in the Odoo target database before any data import to avoid import-time validation errors.

MARS

Attachment

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

MARS file attachments linked to Contact, Company, or Deal records map to Odoo ir.attachment. The attachment name, mimetype, and binary content (datas as base64) migrate. Attachments are linked to their parent record via res_model (res.partner or crm.lead) and res_id. We export attachments separately as binary files referenced by URL or file path, then attach via XML-RPC after the parent record exists in Odoo.

MARS

Note

maps to

Odoo CRM

mail.message

1:1
Fully supported

MARS notes (free-text records separate from activities) map to Odoo mail.message with subtype = 'note' to distinguish from email-type messages. Note body preserves HTML formatting. Notes linked to Contact, Company, or Deal associate via res_model and res_id. Notes without a parent record are linked to the user's res.partner record as a general note.

Gotchas + challenges

What specifically takes care here

Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.

MARS logo

MARS gotchas

High

Low public information

High

Vendor-implemented deployments vary widely

Medium

No public API documented

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • res.partner handles both contacts and companies

    MARS stores Contacts and Companies as separate objects with a foreign key relationship. Odoo CRM uses a single res.partner model where is_company = True marks an organization and is_company = False marks an individual contact. Company-level data (industry, employee count, revenue) must be moved to the commercial partner record, while contact-level data (name, email, phone, title) moves to the individual partner record linked via parent_id. This split requires up-front schema design in Odoo and is the most common source of mapping errors in MARS to Odoo migrations. We compute the split during data extraction and apply it during the transform phase.

  • Phone, date, and currency formats must normalize before import

    Odoo enforces strict formatting on phone (character-only with optional country code), date (YYYY-MM-DD), and monetary fields (two-decimal float). MARS data often contains phone numbers with mixed formatting (parentheses, dashes, spaces, extensions), dates in localized formats, and currency values with inconsistent decimal precision. We run a normalization phase before import that strips non-numeric characters from phones, converts all dates to ISO format, and rounds monetary values to two decimal places. Faye Digital's migration analysis confirms that inconsistent formatting is a primary cause of post-migration data quality degradation.

  • Odoo requires custom field creation before data import

    MARS custom fields cannot be imported directly into Odoo as arbitrary columns. Each custom field must be explicitly created in Odoo via the ir.model.fields API (or through Settings > Technical > Custom Fields in the UI) before any records are imported. Field type mapping must be correct at creation time because Odoo does not allow in-place type changes. We create all custom fields in a pre-migration setup phase and document any MARS field types that require type coercion (for example, a MARS multi-select text field becoming an Odoo many2many or char field).

  • Workflows, automations, and email templates do not migrate

    MARS workflow rules, automated actions, and email templates are platform-specific configurations that have no Odoo equivalent in direct code form. Odoo uses its own action-server and automation framework (base_action_registry, ir.actions.server) that is structurally different. We do not migrate automation logic as executable code. We deliver a written inventory of every MARS workflow, automation trigger, condition, and action, with a recommended Odoo Studio or Python equivalent for the customer's admin to rebuild. Email templates require rebuilding in Odoo Mail Template editor.

  • Activity history requires batched XML-RPC insertion

    Odoo's XML-RPC interface has request size and execution time limits. Large activity histories (thousands of email, call, meeting, and task records) exceed single-request capacity and require chunked batch insertion with parent-record resolution. We use the Odoo XML-RPC /web/dataset/call_kw endpoint with batches of 50-100 records, sequential dependency ordering (partner records before activity records), and retry logic on transient errors. Without chunked batching, activity imports fail silently or time out, leaving gaps in the contact timeline.

Migration approach

Six steps for a successful MARS to Odoo CRM data migration

  1. Discovery and data audit

    We audit the MARS database across all primary objects (Contacts, Companies, Deals, Activities, Attachments) and custom fields. We extract record counts, identify null rates per field, map pipeline and stage configurations, and assess the activity history volume. We pair this with a review of the target Odoo configuration: edition (Community self-hosted, Odoo.sh cloud, or Odoo Online), installed modules, existing custom fields, and user count. The discovery output is a written migration scope document listing all objects, record counts, custom field definitions, and a preliminary field-mapping matrix.

  2. Schema design and res.partner split planning

    We design the Odoo destination schema based on the MARS data audit. This includes creating Odoo custom fields (via ir.model.fields) to match MARS custom fields, configuring crm.team records for each MARS pipeline, creating crm.stage records with probabilities for each pipeline stage, and designing the res.partner split plan that determines which MARS Contact records become company partners versus individual contacts. The schema design is deployed to the target Odoo instance (Odoo.sh, self-hosted XML-RPC, or Odoo Online database) in a pre-migration setup phase.

  3. Data cleansing and normalization

    We run a data quality pass on the MARS export before transformation. This includes deduplication (resolving contacts with identical email addresses), phone number normalization (removing non-numeric characters, adding country code prefixes), date format standardization to ISO 8601, currency value rounding to two decimal places, and null field handling (empty strings converted to False where Odoo expects null). We produce a data quality report showing duplicate counts, null rates, and format violation counts before migration begins.

  4. Sandbox migration and reconciliation

    We run a full migration into the target Odoo instance using a test environment (Odoo.sh staging, sandbox database, or clone of the production database). The customer reconciles record counts (Contacts in res.partner, Deals in crm.lead, Activities in mail.message), spot-checks 25-50 records per object against the MARS source, and validates that pipeline stage assignments, owner assignments, and custom field values match. Any mapping corrections are made before production migration. This step runs in one to two weeks.

  5. Production migration in dependency order

    We run production migration in record-dependency order: crm.team and crm.stage (required for opportunity team_id and stage_id), res.partner company records, res.partner contact records (with parent_id linking to company), crm.lead opportunities (with partner_id, team_id, stage_id, and user_id resolved), crm.tag tag records, activity history via XML-RPC batches (mail.message, crm.activity, calendar.event), project.task if selected, ir.attachment for files. Each phase emits a row-count reconciliation report showing imported count, skipped count (with reasons), and error count before the next phase begins.

  6. Cutover, validation, and automation inventory handoff

    We freeze MARS write access during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the workflow, automation, and email template inventory document to the customer's admin team with Odoo Studio equivalents noted. We support a one-week hypercare window to resolve any post-migration data reconciliation issues reported by the Odoo users. We do not rebuild MARS workflows as Odoo automated actions inside the migration scope; that work is documented and handed off as a separate engagement.

Platform deep dives

Context on both ends of the pair

MARS logo

MARS

Source

Strengths

  • Configurable to domain-specific workflows.
  • Direct vendor relationship for support and customization.
  • On-premise or private-cloud deployment options.
  • Tenant-specific schema flexibility.
  • Responsive support during onboarding (typical of smaller vendors).

Weaknesses

  • Limited public reviewer presence.
  • No publicly documented developer API.
  • Smaller integration ecosystem.
  • Mobile and cloud-native UX lags.
  • Sales-led pricing with limited transparency.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Moderate CRM migration. 8 of 8 objects need a mapping; the rest are 1:1.

C

Overall complexity

Moderate migration

Derived from compatibility, mapping clarity, API constraints, and data volume across MARS and Odoo CRM.

  • Object compatibility

    D

    8 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    MARS: Not publicly documented..

  • Data volume sensitivity

    B

    MARS doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your MARS to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about MARS to Odoo CRM data migrations

Answers to the questions buyers ask most during MARS to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your MARS to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Migrations under 15,000 Contacts, 3,000 Deals, and no custom objects land between three and five weeks for discovery through production cutover. Migrations with custom objects, complex company-contact hierarchies, large activity histories (over 200,000 records), or multi-company Odoo destinations move to eight to fourteen weeks because of res.partner split logic, custom field pre-creation, and activity batch tuning. Odoo edition selection (Community, Odoo.sh, or Online) does not significantly change timeline but affects deployment method for schema changes.

Adjacent paths

Related migrations to explore

Ready when you are

Move from MARS.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day