CRM migration

Migrate from CRM Service to Odoo CRM

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

CRM Service logo

CRM Service

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

80%

12 of 15

objects map 1:1 between CRM Service and Odoo CRM.

Complexity

BStandard

Timeline

4-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from CRM Service to Odoo CRM is a data model consolidation, not a simple record copy. CRM Service maintains separate Account and Contact objects with a many-to-one relationship; Odoo CRM uses res.partner as a unified contact-and-company record with a commercial partner flag for organizations and a contact flag for people. We resolve that structural difference during scoping by creating Odoo Partners in two passes: first as organizations (with commercial_partner_id set to self), then as contacts linked to the organization. Custom fields from CRM Service migrate as Odoo column definitions installed via a custom module before data load. Workflow Rules, Process Builder flows, and Approval Processes do not migrate; we deliver a written automation inventory for Odoo's Action Rules and Studio automations to be rebuilt post-migration. API extraction from CRM Service uses the Bulk API at Enterprise and above, with REST API chunking for Professional tier, and the data loads into Odoo via the xmlrpc interface with partner-resolution sequencing.

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

CRM Service logo

CRM Service

What's pushing teams away

  • Requires dedicated Salesforce administrator or ongoing consultant engagement for configuration changes that other CRMs handle through self-service
  • Per-user pricing compounds significantly as teams grow, with essential features like workflow automation and advanced reporting gated behind Enterprise and above
  • Complex data model with multiple object types and custom fields creates migration complexity and data cleaning requirements before switching platforms
  • Implementation costs add approximately 35% to base subscription price when accounting for professional services, training, and change management
  • Limited features in lower tiers force organizations into expensive upgrades when growth requires capabilities like advanced pipeline management or AI-powered insights

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 CRM Service objects map to Odoo CRM

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

CRM Service

Account

maps to

Odoo CRM

res.partner (organization)

1:1
Fully supported

CRM Service Accounts map to Odoo res.partner records where is_company = True. We extract Account.Name as partner name, Account.BillingAddress as address fields, Account.Industry as a custom selection field, and Account.AnnualRevenue as a float field. The commercial_partner_id on the created partner record points to itself (self) marking it as the top-level organization. Account is created first so that Contact import can resolve the parent partner reference immediately.

CRM Service

Contact

maps to

Odoo CRM

res.partner (contact)

1:1
Fully supported

CRM Service Contacts map to Odoo res.partner records where is_company = False and parent_id = the mapped Account. We extract Contact.FirstName and Contact.LastName concatenated into partner name, Contact.Email as email, Contact.Phone as phone, Contact.Title as function/title. The parent_id field links the contact to its organization partner record. Contacts without an Account are created as individual partners (is_company = False, parent_id = null) and flagged for manual review.

CRM Service

Opportunity

maps to

Odoo CRM

crm.lead (type = opportunity)

1:1
Fully supported

CRM Service Opportunities map to Odoo crm.lead with type = 'opportunity'. We extract Opportunity.Name as lead name, StageName as stage_id (mapped to Odoo stage sequence), Amount as planned_revenue, CloseDate as date_deadline, Probability as odoo_probability (custom float field), and Owner as user_id via email match to Odoo res.users. The partner_id field links the opportunity to the mapped Account partner record.

CRM Service

Lead

maps to

Odoo CRM

crm.lead (type = lead)

1:1
Fully supported

CRM Service Leads map to Odoo crm.lead with type = 'lead'. Where the destination Odoo instance has the Lead Management module installed (standard on CRM app), leads are tracked as separate crm.lead records until converted to opportunities. We preserve LeadStatus as a custom selection field on the lead. Lead score or rating migrates to priority field. Leads with a CompanyName are created with is_company = True on the linked partner; those without are attached as contacts to the company if one is found by domain match.

CRM Service

Opportunity Stage

maps to

Odoo CRM

crm.stage

lossy
Fully supported

CRM Service Opportunity stages map to Odoo crm.stage records within the appropriate crm.team sequence. We create stages in the same order as the source, preserving the probability percentage (rounded to nearest integer) and won/lost flags. Stage names are mapped by sequence position rather than by name string because stage names are org-specific in CRM Service.

CRM Service

Product2

maps to

Odoo CRM

product.product

1:1
Fully supported

CRM Service Products map to Odoo product.product records. We extract Product2.Name as name, ProductCode as default_code, and Description as description. A corresponding product.template record is also created. If the CRM Service product has a standard price, it is set on the template.

CRM Service

OpportunityLineItem

maps to

Odoo CRM

sale.order.line

lossy
Fully supported

CRM Service Line Items are not directly migratable as standalone records in Odoo because Odoo models line items in the context of a sale.order. We map line items to crm.lead optional lines if Odoo CRM is used without the Sale app. If the customer installs the Sale app during migration, line items are migrated as draft sale.order.line records linked to a draft sale.order record created per Opportunity.

CRM Service

Campaign

maps to

Odoo CRM

crm.tag or utm.campaign

lossy
Fully supported

CRM Service Campaigns map to Odoo utm.campaign records if the Marketing app is installed. Campaign member responses (Responded, Sent) are preserved as crm.tag values on the linked leads and opportunities. If the Marketing app is not installed, campaign names are stored as crm.tag records and applied to relevant crm.lead records.

CRM Service

Task

maps to

Odoo CRM

mail.activity

1:1
Fully supported

CRM Service Tasks migrate to Odoo mail.activity records linked to the target res.partner or crm.lead. We extract Task.Subject as activity title, Task.Status as state (done vs open), Task.ActivityDate as date_deadline, Task.Priority as priority, and Task.Description as note. Completed tasks become activities with activity_type_id = 'mail.mail_activity_data_meeting' or a configured type; open tasks become planned activities. Owner resolution is via email match to res.users.

CRM Service

Event

maps to

Odoo CRM

calendar.event

1:1
Fully supported

CRM Service Events migrate to Odoo calendar.event records. We extract Event.Subject as name, Event.StartDateTime as start, Event.EndDateTime as stop, Event.Location as location, and Event.IsAllDayEvent as allday. Attendees (EventWho) are resolved to res.partner records and added as calendar.attendee records. The linked WhatId (Account, Contact, or Opportunity) is mapped to the event's res_model and res_id.

CRM Service

EmailMessage

maps to

Odoo CRM

mail.message

1:1
Fully supported

CRM Service EmailMessage records migrate to Odoo mail.message records on the relevant res.partner (Contacts and Accounts) and crm.lead. Email body and subject migrate as message_body and subject fields. The From and To addresses are resolved to res.partner records where possible; raw email addresses are stored as a fallback. HasAttachment migrates as a flag for manual file attachment review.

CRM Service

Note (ContentNote)

maps to

Odoo CRM

mail.message (note subtype)

1:1
Fully supported

CRM Service Notes migrate as Odoo mail.message records with subtype = 'note' on the parent record (Contact, Account, Opportunity). The note body transfers as plain text. Notes attached to multiple records in CRM Service are migrated to the primary parent and flagged as duplicates for manual review in Odoo.

CRM Service

Custom Object (__c)

maps to

Odoo CRM

Custom model (ir.model)

1:1
Fully supported

CRM Service custom objects are migrated to Odoo custom models created via a custom module. We generate an ir.model entry, create the corresponding database table, and define fields via ir.model.fields. Lookup relationships to standard objects (Account, Contact, Opportunity) map to Odoo many2one fields pointing to res.partner or crm.lead. The Odoo module is installed in the destination database before any data is loaded. Custom object migration requires Odoo Community or Odoo.sh; Odoo Online SaaS does not allow custom module installation.

CRM Service

User

maps to

Odoo CRM

res.users

1:1
Fully supported

CRM Service Users are not migrated as records but resolved as references during migration. We extract all OwnerId values from Opportunities, Tasks, and Events and map them by email to existing Odoo res.users. Inactive CRM Service users without an Odoo counterpart are assigned to a migration placeholder user for admin reconciliation.

CRM Service

Attachment

maps to

Odoo CRM

ir.attachment

1:1
Fully supported

CRM Service Attachments (ContentDocument and Attachment objects) are exported to a staging directory with their parent record reference. We import them as Odoo ir.attachment records linked via res_model and res_id to the migrated parent record (res.partner, crm.lead). File size limits in Odoo are set by the hosting configuration; large files are flagged for manual handoff if they exceed the configured limit.

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.

CRM Service logo

CRM Service gotchas

High

API rate limits vary by edition without public documentation

Medium

Data Export frequency limited by edition tier

Medium

Custom object __c suffix causes field name mismatches in exports

High

Automations and flows do not migrate between platforms

Low

Multi-select picklist values may exceed destination field limits

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

  • CRM Service Account-Contact split does not map directly to Odoo Partner

    CRM Service maintains separate Account and Contact objects with explicit lookups, while Odoo CRM uses a single res.partner model with an is_company flag to distinguish organizations from people. Contacts must be imported after their parent Accounts to satisfy the parent_id foreign key. We run Account migration as a first pass and validate partner counts before beginning Contact import. Migrations that run Contacts before Accounts result in orphaned contact records with no organization linkage, which breaks the Odoo activity timeline and reporting.

  • CRM Service Leads and Opportunities merge into one Odoo crm.lead object

    CRM Service uses separate Lead and Opportunity objects with a Convert action that creates a Contact and Account from a Lead. Odoo CRM uses a single crm.lead object with type 'lead' and type 'opportunity' stored as a field value. We split CRM Service Leads into crm.lead type='lead' and CRM Service Opportunities into crm.lead type='opportunity' during the transform phase. Converting a Lead to Opportunity in Odoo updates the type field rather than creating a new record, which is a different behavior from CRM Service and must be communicated to the sales team during go-live training.

  • Custom fields (__c) require Odoo custom module development

    CRM Service custom fields with the __c suffix have no direct Odoo equivalent and cannot be added via the Odoo UI alone. We generate a custom Odoo module (ir.model, ir.model.fields entries plus Python field definitions) that defines the destination fields before any data is loaded. For Odoo Online (SaaS), where custom module installation is blocked, we map custom fields to existing Odoo fields and document unmapped fields in a field inventory for manual re-entry. Odoo Community and Odoo.sh allow full custom module installation.

  • CRM Service Workflow Rules, Flows, and Approvals do not migrate to Odoo Action Rules

    CRM Service automation (Workflow Rules, Process Builder, Approval Processes, Flow definitions) is configuration code that cannot be exported and imported into Odoo. Odoo Action Rules and Studio automations are structurally different and must be rebuilt. We deliver a written automation inventory during scoping, documenting each CRM Service workflow with its trigger object, conditions, and actions and a recommended Odoo Action Rule equivalent. We do not rebuild automations inside the migration scope. Customers should budget 1-2 hours per workflow for their admin or an Odoo partner to rebuild.

  • CRM Service Bulk API rate limits differ from Odoo xmlrpc throughput

    CRM Service enforces API rate limits that vary by edition, license type, and API type (Bulk vs REST). Odoo's xmlrpc interface has no published rate limit but is constrained by server resources and any reverse-proxy configuration. We extract from CRM Service using the Bulk API (Enterprise and above) or REST with chunking, then load into Odoo via xmlrpc with batch sizes calibrated to avoid Odoo worker timeouts. We monitor both sides during migration and adjust batch sizes dynamically. Self-hosted Odoo instances may require tuning of the Odoo worker configuration for high-volume imports.

Migration approach

Six steps for a successful CRM Service to Odoo CRM data migration

  1. Discovery and Odoo edition selection

    We audit the source CRM Service org across edition (Starter through Einstein 1), active custom objects, custom fields, pipeline count, active Workflow Rules and Flows, engagement volume (Task, Event, EmailMessage counts), and Attachment file size totals. We pair this with an Odoo destination audit: whether the target is Odoo Online (SaaS), Odoo.sh, or self-hosted Community/Enterprise, and which Odoo apps are installed (CRM, Sale, Timesheets, Project). The discovery output is a written migration scope document and an Odoo app recommendation. Custom object migration requires Odoo Community or Odoo.sh; Odoo Online SaaS cannot accept custom module installations.

  2. Custom module development and Odoo schema provisioning

    We develop a custom Odoo module that defines all migrated custom fields as Python field definitions (ir.model and ir.model.fields entries) before any data is loaded. The module is installed in the destination Odoo database. We also create the Odoo pipeline stages (crm.stage records) matching the CRM Service Opportunity stage sequence and probabilities, and configure crm.team records if the source uses multiple Salesforce sales territories or queues.

  3. Data extraction, audit, and cleansing

    We extract CRM Service data via Bulk API (Enterprise and above) or REST with chunking for Professional tier. The extraction covers Accounts, Contacts, Leads, Opportunities, Products, Campaigns, Tasks, Events, EmailMessages, Notes, and any custom objects. We run a data audit identifying duplicate records, missing required fields, inactive owners, and records with no activity history. We clean duplicates using a probabilistic match on name and email, and flag records with missing critical fields (Account without name, Contact without email) for the customer's admin to resolve before migration.

  4. Partner resolution and two-pass import sequencing

    We import Odoo res.partner records in two passes: first all Accounts as organizations (is_company = True, parent_id = null), then all Contacts as contacts (is_company = False, parent_id = mapped Account). CRM Service Opportunities and Leads migrate to crm.lead with type='opportunity' and type='lead' respectively, linking to the resolved partner_id. This two-pass approach is the critical sequencing step that prevents orphaned Contact records. Owner resolution (CRM Service OwnerId to Odoo user_id) happens by email match against res.users.

  5. Sandbox migration and validation

    We run a full migration into an Odoo test database (a cloned Odoo.sh branch or a duplicate self-hosted database). The customer's CRM lead reconciles record counts, spot-checks 25-50 records against the CRM Service source, and verifies pipeline stage mapping. Any field mapping corrections, custom field omissions, or stage probability adjustments happen in the test environment before production migration. We do not run production migration without passing sandbox validation first.

  6. Production migration and cutover

    We freeze CRM Service writes during cutover, run a final delta extraction for any records modified during the migration window, then execute production migration in dependency order: custom module installation, crm.stage configuration, res.partner organizations, res.partner contacts, crm.lead opportunities and leads, product.product, mail.activity, calendar.event, mail.message, ir.attachment. Each phase emits a reconciliation report. We enable Odoo CRM as the system of record and deliver the Workflow and Flow inventory document for the customer's admin or Odoo partner to rebuild. We do not rebuild CRM Service automations inside the migration scope; that is a separate engagement.

Platform deep dives

Context on both ends of the pair

CRM Service logo

CRM Service

Source

Strengths

  • Comprehensive standard object coverage including Accounts, Contacts, Opportunities, Leads, Campaigns, and Cases
  • Enterprise-grade API with bulk operations, webhooks, and OAuth 2.0 authentication across all editions
  • Highly customizable data model allowing unlimited custom objects with independent schemas and relationships
  • Large ecosystem of certified administrators, consultants, and implementation partners available for complex deployments
  • Advanced reporting and forecasting capabilities available at Enterprise and above tiers including Einstein AI

Weaknesses

  • Per-user pricing model scales linearly, making large teams expensive relative to flat-rate alternatives
  • Essential features gated behind higher tiers: workflow automation, approval processes, and advanced analytics require Enterprise minimum
  • Implementation costs add significant overhead: approximately 35% above subscription for professional services and training
  • Requires dedicated admin or consultant for configuration changes; self-service customization has practical limits without expertise
  • Custom objects and fields create migration complexity when switching platforms, often requiring field-by-field mapping
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?

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

B

Overall complexity

Standard migration

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

  • Object compatibility

    B

    3 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

    CRM Service: Varies by edition and license type; not publicly documented with specific numbers.

  • Data volume sensitivity

    A

    CRM Service exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your CRM Service 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 CRM Service to Odoo CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Straightforward migrations under 20,000 Contacts and 4,000 Opportunities with no custom objects complete in four to six weeks. Migrations with custom objects, multi-stage pipeline structures, large activity histories (over 200,000 Task/Event records), or self-hosted Odoo destinations requiring custom module packaging move to ten to sixteen weeks. Odoo Community and Odoo.sh self-hosted destinations add time because custom modules must be developed and tested before data load, whereas Odoo Online SaaS can begin data migration sooner with a simplified field mapping.

Adjacent paths

Related migrations to explore

Ready when you are

Move from CRM Service.
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