CRM migration

Migrate from erxes to Odoo CRM

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

erxes logo

erxes

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

83%

10 of 12

objects map 1:1 between erxes and Odoo CRM.

Complexity

BStandard

Timeline

3-6 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from erxes to Odoo CRM is a migration from a plugin-based open-source CRM to a modular open-source ERP whose CRM module is one component of a broader suite. erxes organizes data around Contacts, Companies, Deals in Pipelines, and Tasks organized into Teams and Cycles, all extracted via paginated GraphQL queries since no native bulk export UI exists. Odoo CRM uses a Partner record for both individuals and organizations, differentiated by Partner Type (contact vs company), with Opportunities linked to Partners and organized into stages within a single Pipeline. We resolve the erxes Company-to-Odoo Partner mapping and the erxes Contact-to-Odoo Partner mapping as separate import phases, using Odoo's partner deduplication on name and email to avoid creating duplicate records. Deal amounts, stage assignments, and custom fields migrate to Odoo Opportunity. Conversation history migrates to Odoo Mail Message records linked to the parent Partner. Workflows, automations, and Channels do not migrate as code; we deliver a written inventory of every active erxes automation and its Odoo Server Action or Automated Action equivalent for the customer's admin to rebuild.

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

erxes logo

erxes

What's pushing teams away

  • Steep learning curve for non-technical teams who expect a point-and-click CRM without touching code or GraphQL
  • Limited enterprise-grade documentation and support outside the paid Enterprise tier leaves self-hosted teams troubleshooting alone
  • Plugin ecosystem lacks the third-party integrations available on established platforms, requiring custom development for niche tools
  • Mobile app has stability issues according to App Store reviews, with login failures reported by multiple users
  • Performance and stability can degrade with large datasets when running on underpowered self-hosted infrastructure

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

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

erxes

Contact

maps to

Odoo CRM

Partner (Partner Type = Individual)

1:1
Fully supported

erxes Contact records map to Odoo Partner records with Partner Type set to Individual. The erxes primaryEmail becomes the Odoo email field; firstName and lastName split from erxes fullName on the first space. Phone and mobilePhone migrate to Odoo Partner phone and mobile fields. We run Odoo's partner deduplication on email before insert to avoid creating duplicate partners for records that appear in both the erxes Contact and Company objects. Custom field values from erxes Contacts migrate as Odoo custom fields on the res.partner model, with field type mapping (text to char, date to date, select to selection) verified against the Odoo field definition.

erxes

Company

maps to

Odoo CRM

Partner (Partner Type = Company)

1:1
Fully supported

erxes Company records map to Odoo Partner records with Partner Type set to Company. The erxes domain field becomes the Odoo website field, and parentId on linked Contacts resolves to this Partner after Company import. We set Odoo's industry_id from erxes industry by matching against the Odoo res.partner.industry selection list. Companies without a domain or website are created as Odoo Partner records without the website field populated, and deduplication runs on company name to avoid duplicates from import retries.

erxes

Deal

maps to

Odoo CRM

Opportunity

1:1
Fully supported

erxes Deals map to Odoo CRM Opportunity (crm.lead model). The erxes pipelineId and stageId translate to Odoo's team_id (Sales Team) and stage_id. Deal amount migrates to Odoo's expected_revenue and planned_revenue fields. The erxes createdAt timestamp preserves as Odoo's create_date. We resolve the partner_id on Odoo Opportunity by matching the erxes primaryCompanyId against the Partner records created in the Company import phase, falling back to matching by contact email if no Company link exists.

erxes

Pipeline

maps to

Odoo CRM

Team + Stage

lossy
Fully supported

erxes Pipelines map to Odoo Sales Teams (crm.team model), and each erxes Pipeline Stage maps to an Odoo Stage within that Team. Stage names, probabilities, and order migrate. Odoo restricts Stages to a single sequence per team by default; if the erxes source uses multiple pipelines, we create a corresponding Odoo Sales Team per pipeline and map Deals accordingly. Stage probability percentages migrate to Odoo's probability field on crm.lead, rounded to nearest integer.

erxes

Task

maps to

Odoo CRM

Task (Project-based or Direct)

1:1
Fully supported

erxes Tasks migrate to Odoo Task records. If the customer uses Odoo Project, tasks map to project.task; otherwise they map to crm.lead as internal notes or activities. Task title, description (as HTML), due date (date_deadline), and stage status migrate. Owner assignment resolves by matching erxes userId to Odoo res.users by email. erxes Cycle membership does not migrate as Odoo has no native Cycle equivalent; cycle-based task grouping is documented for manual reorganization in Odoo Project if the customer adopts it.

erxes

Conversation

maps to

Odoo CRM

Mail Message

1:1
Fully supported

erxes multi-channel Conversations (email, SMS, chat, WhatsApp) migrate to Odoo Mail Message records linked to the parent Partner. We preserve message body, direction (inbound/outbound), channel type, and createdAt timestamp as mail.message create_date. Channel credentials such as WhatsApp API keys and email integration tokens do not migrate; we flag these for manual reconfiguration in Odoo because they are destination-system credentials. Message threading order depends on the erxes server timestamp, which we preserve during import to maintain chronological fidelity.

erxes

Custom Field

maps to

Odoo CRM

Custom Field (ir.model.fields)

lossy
Fully supported

erxes custom fields defined on Contacts, Companies, Deals, and Tasks migrate to Odoo custom fields on the equivalent model (res.partner, crm.lead, project.task). We pre-create the Odoo field schema before data import, setting field type (char, text, date, selection, many2one) to match the erxes field type definition. erxes schema-less import behavior means field values may arrive as wrong types; we validate and cast values against the Odoo field type before insert, flagging any that fail cast.

erxes

User

maps to

Odoo CRM

User

1:1
Fully supported

erxes Users map to Odoo res.users records. We resolve by email match during import. Any erxes User without a matching Odoo User goes to a reconciliation queue for the customer's admin to provision before Deal and Task import resumes. erxes role and permission configurations are destination-platform-specific and documented for manual rebuild in Odoo Access Rights settings.

erxes

Channel

maps to

Odoo CRM

Configuration (flag for manual rebuild)

1:1
Fully supported

erxes Channels (email, SMS, chat, WhatsApp) define communication mediums and credentials connected to the platform. Channel API keys, webhook URLs, and third-party credentials do not migrate because they are source-system credentials that do not apply to Odoo. We deliver a written list of every active erxes Channel with its type, connected number or inbox, and a recommended Odoo equivalent configuration (Odoo Mail, a third-party WhatsApp integration app from the Odoo Apps store, or Odoo's SMS gateway) for the customer's admin to rebuild post-migration.

erxes

Automation Workflow

maps to

Odoo CRM

Configuration (flag for manual rebuild)

1:1
Fully supported

erxes Automation Workflows define trigger-action sequences for customer journeys. We extract the workflow structure including triggers, conditions, and actions as a written inventory document. We do not migrate automations as code because erxes and Odoo use different rule engines. Each erxes automation is mapped to an Odoo Server Action or Automated Action equivalent (or a Planned Action on ir.cron) with trigger, condition, and action documented for the customer's Odoo admin to rebuild. Complex conditions referencing erxes object IDs are flagged individually because ID namespaces differ between systems.

erxes

Activity (engagement subtypes)

maps to

Odoo CRM

Mail Activity

1:1
Fully supported

erxes engagement records with subtypes (call, email, meeting, note) map to Odoo Mail Activity records linked to the parent Partner or Opportunity. Activity type, subject, body, and due date migrate. Odoo Mail Activity supports types: call, meeting, email, upload_document, and task. We map erxes engagement subtype to the nearest Odoo activity_type_id. Owner assignment resolves via the User mapping by email.

erxes

Tag

maps to

Odoo CRM

Tag (crm.tag)

1:1
Fully supported

erxes tags on Contacts, Companies, and Deals migrate to Odoo CRM Tags (crm.tag model). Tags stored as multi-checkbox custom properties in erxes migrate to individual crm.tag records with many2many relation to crm.lead. Tag names are preserved verbatim; tag colors and categories do not migrate as Odoo CRM Tags has no color field by default.

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.

erxes logo

erxes gotchas

High

No native bulk export in Community edition

Medium

Plugin activation state affects data visibility

Medium

Custom fields have no type enforcement during import

Low

Conversation message ordering depends on server timestamps

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

  • erxes has no native bulk export endpoint

    erxes does not ship a bulk export UI or API endpoint in its open-source edition. All data must be extracted via paginated GraphQL queries against the erxes API. For migrations with 100,000 or more records, we implement chunking strategies and rate-limit management to avoid timeouts during extraction. We confirm all relevant erxes plugins (Sales, Marketing, Operations) are active during the pre-migration audit because deactivating a plugin makes its data inaccessible via the API even if records exist in the database. This extraction overhead is unique to erxes as a source and does not apply when erxes is the destination platform.

  • Odoo Partner model requires Contact-Company disambiguation at import time

    Odoo uses a single Partner record for both individuals and organizations, differentiated by Partner Type. erxes has separate Contact and Company objects with a many-to-many relationship. During migration we must decide whether each erxes Contact belongs to an erxes Company (and therefore maps to an Odoo Partner of type Company with the Contact as a child) or is standalone (maps to an Odoo Partner of type Individual). Migrations that skip this disambiguation create duplicate Partner records for the same entity. We resolve this using the erxes primaryCompanyId relationship and Odoo's partner deduplication on email before insert.

  • Odoo Workflow Automations require manual rebuild

    Odoo Server Actions, Automated Actions, and Workflow rules are destination-platform configurations stored in the Odoo database that do not receive data through standard import. We do not migrate erxes Automation Workflows as Odoo workflow code. We deliver a written inventory of every active erxes automation with its trigger, conditions, actions, and recommended Odoo equivalent for the customer's admin to rebuild post-migration. Automations with complex conditions referencing erxes object IDs are flagged individually because ID namespaces are not portable between platforms.

  • Odoo field-level validation can reject imported records silently

    Odoo enforces field-level constraints including required fields (name, email on Partner), format validation (email format, phone number patterns if configured), and selection list whitelists. Records that fail validation are logged but not inserted. We pre-validate all migrating records against the Odoo field schema before import and flag records with invalid email formats, blank required fields, or picklist values outside the configured selection. Data cleansing before migration is the most effective mitigation; post-import cleanup of rejected records is three to five times more expensive in labor hours.

  • Conversation message ordering depends on erxes server timestamps

    erxes Conversation messages store a createdAt timestamp from the erxes server at write time. When migrating Conversations, chronological order in Odoo depends on these server-side timestamps. We preserve the original createdAt values during import to maintain message ordering, but clock skew between the source erxes server and Odoo server may cause minor ordering discrepancies for messages with timestamps close together. We document this limitation in the migration report and recommend the customer verify conversation thread integrity during UAT.

Migration approach

Six steps for a successful erxes to Odoo CRM data migration

  1. Discovery and plugin-state verification

    We audit the source erxes installation across all active plugins, custom field definitions on Contacts, Companies, Deals, and Tasks, pipeline and stage count, user roster, active automation count, and conversation volume. We confirm all relevant erxes plugins are active during the pre-migration audit because deactivating a plugin before extraction renders its data inaccessible via the API. We pair this with an Odoo edition review: Odoo Online for hosted simplicity, Odoo.sh for git-based CI/CD deployments, or on-premise for strict data residency. The discovery output is a written migration scope document listing every object, field, pipeline, and automation in scope.

  2. Data cleansing and schema pre-creation in Odoo

    We run a data quality audit on the erxes export, identifying duplicate Contacts, blank required fields, malformed email addresses, and picklist values that will not map to Odoo selection lists. We cleanse records before migration rather than after because post-migration cleanup costs three to five times more in labor. In parallel, we pre-create the Odoo destination schema: custom fields on res.partner and crm.lead via ir.model.fields, CRM Tags via crm.tag, Sales Teams via crm.team, and Stage configurations. Schema is deployed to an Odoo Sandbox for validation before any production data loads.

  3. Sandbox migration and reconciliation

    We run a full migration into an Odoo Sandbox using production-equivalent data volume. The customer reconciles record counts (Partners from Contacts, Partners from Companies, Opportunities from Deals, Tasks, Mail Messages from Conversations), spot-checks 25-50 records against the erxes source, and signs off the schema and mapping before production migration begins. Any mapping corrections, field type cast failures, or deduplication rule adjustments happen in the Sandbox phase, not in production.

  4. GraphQL extraction from erxes in dependency order

    We extract erxes data via paginated GraphQL queries in record-dependency order: Companies first (to resolve companyId for Contact linking), then Contacts (with companyId reference), then Users (for owner mapping), then Deals (with pipelineId, stageId, and companyId resolved), then Tasks (with ownerId resolved), then Conversations (with contactId resolved). Large datasets (100,000+ records) are chunked with exponential backoff on API rate limit responses. Channel credentials, automation workflows, and plugin-specific data are extracted as metadata for the inventory document rather than as importable records.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Partners from erxes Companies (with Partner Type = Company), Partners from erxes Contacts (with Partner Type = Individual, deduplicated on email), Sales Teams and Stages (from erxes Pipelines), Opportunities (with partner_id resolved from Company import and team_id resolved from Pipeline import), Tasks (with user_id resolved via User mapping), Mail Messages from Conversations (with res_id and model resolved to parent Partner), and Tags. Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC API with batch chunking and retry logic for transient errors.

  6. Cutover, validation, and automation rebuild handoff

    We freeze erxes writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver the automation and channel inventory document to the customer's admin team for rebuild in Odoo Studio or via custom Python modules. We support a one-week hypercare window where we resolve reconciliation issues raised by the customer's team. We do not rebuild erxes automations as Odoo Server Actions inside the migration scope; that is a separate engagement or an internal admin task.

Platform deep dives

Context on both ends of the pair

erxes logo

erxes

Source

Strengths

  • True open-source with MIT license gives full code access and modification rights without vendor lock-in
  • Self-hosting option on DigitalOcean, AWS, or on-premise infrastructure provides complete data residency control
  • All-in-one platform consolidating marketing, sales, operations, and customer service modules
  • Plugin-based architecture allows activating only needed functionality without paying for unused features
  • Free Community edition offers generous feature set comparable to paid SaaS CRM tiers

Weaknesses

  • Steep technical learning curve requiring GraphQL knowledge and React familiarity for deep customization
  • Limited third-party integration marketplace compared to established CRM platforms
  • Documentation gaps make self-service troubleshooting difficult outside of paid support tiers
  • Mobile application stability issues reported in user reviews with authentication failures
  • Performance can degrade with large data volumes on underpowered self-hosted deployments
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. 1 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 erxes and Odoo CRM.

  • Object compatibility

    B

    1 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

    erxes: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Migrations under 20,000 Contacts, 5,000 Deals, and 10,000 Tasks with no custom objects land between three and six weeks. Migrations with large Conversation histories (over 100,000 messages), multiple erxes pipelines requiring Odoo Studio stage and team configuration, or custom objects needing schema pre-creation move to eight to fourteen weeks because of GraphQL pagination, deduplication logic, and Sandbox validation time.

Adjacent paths

Related migrations to explore

Ready when you are

Move from erxes.
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