CRM migration

Migrate from Cordial to Odoo CRM

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

Cordial logo

Cordial

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

67%

8 of 12

objects map 1:1 between Cordial and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Cordial to Odoo CRM is a structural migration from a marketing-centric JSON-flexible platform to an ERP-integrated relational model. Cordial organizes data into collections (Contacts, Products, Channels) with unlimited custom contact attributes stored as flattened properties, while Odoo CRM uses res.partner with a fixed schema and custom fields via Studio. Cordial's product-centric architecture with nested variant JSON maps to Odoo's product.template and product.product split, and any order data stored as custom events or attributes in Cordial requires pre-migration discovery before it can land as sale.order records in Odoo. We do not migrate Cordial Programs, automation workflows, or A/B test experiment results; we deliver a written inventory of these for your admin to rebuild in Odoo's workflow builder.

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

Cordial logo

Cordial

What's pushing teams away

  • Some users report that complex reporting and advanced analytics require workarounds, with out-of-the-box dashboards feeling insufficient for deep performance analysis.
  • Scaling large contact databases can introduce latency in segment queries and campaign execution, particularly when audiences exceed several million records.
  • The drag-and-drop interface, while easy to use for basic campaigns, can become limiting when building sophisticated multi-step automation logic that requires more programmatic control.

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

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

Cordial

Contacts

maps to

Odoo CRM

res.partner

1:1
Fully supported

Cordial Contacts map to Odoo res.partner records. We export the flat attribute schema (email, first_name, last_name, phone, address fields) and map each standard Cordial contact attribute to an Odoo custom field on res.partner. Array-type attributes (tags, favorite colors, behavioral lists) require schema normalization: we flatten to delimited strings or create a related res.partner.tag record with a many2many relationship, agreed upon with the customer during scoping. The res.partner record is the parent for all downstream lookups.

Cordial

Contact Attributes (Custom Fields)

maps to

Odoo CRM

res.partner Custom Fields

lossy
Fully supported

Cordial's unlimited custom contact attributes (string, number, geo, array types) map to Odoo custom fields on res.partner. We create each custom field via Odoo Studio or Python model migration before data import. Array-type attributes require the customer to choose between a multi-value char field, a dedicated res.partner.tag relation table, or separate normalization. Geo-type attributes (latitude, longitude) map to Odoo's res.partner partner_latitude and partner_longitude fields or to a separate geo.point relation.

Cordial

Lists

maps to

Odoo CRM

res.partner.category or mailing.contact

1:1
Fully supported

Cordial Lists (static contact sub-collections) map to Odoo res.partner.category records (tags) with a many2many relation to res.partner. Each Cordial list becomes a category record with the list name as the tag name, and list membership migrates as partner-category associations. If the customer uses Odoo Email Marketing, we alternatively map to mailing.contact for precise opt-in audience management.

Cordial

Channels

maps to

Odoo CRM

res.partner email/sms fields

1:1
Mapping required

Cordial Channels (email, SMS opt-in status and preferences per contact) map to Odoo res.partner fields: email becomes email, email_cohorts or opt-out flags become opt_out, and mobile preferences become mobile with SMS-specific opt-in mapped to a custom field cordialsms_optin__c. We export channel preferences as separate boolean fields and flag any non-standard channel types that have no Odoo equivalent.

Cordial

Products

maps to

Odoo CRM

product.template + product.product

1:many
Fully supported

Cordial Products with nested variant JSON arrays require unpacking. Each Cordial product record generates one product.template in Odoo. Each variant within the Cordial variants array (color, size, SKU pairs) generates a separate product.product record linked to the template via product.attribute.value. We preserve the parent Cordial product ID as an external reference field for reconciliation. If Odoo does not already have the relevant product attributes (color, size) defined, we create them during the migration schema setup.

Cordial

Orders

maps to

Odoo CRM

sale.order + sale.order.line

lossy
Mapping required

Orders are not a native Cordial object and require pre-migration schema discovery. We identify order-related custom attributes and custom event types (purchase events) during discovery, extract order records from the behavioral event log, and map them to Odoo sale.order and sale.order.line. Customer association resolves to the res.partner record; product association resolves to product.product via SKU lookup; pricing and quantity map directly. This phase is scoped separately because order data location varies per customer implementation.

Cordial

Companies

maps to

Odoo CRM

res.partner (company_type = company)

1:1
Fully supported

Cordial Companies stored in the Companies collection map to Odoo res.partner records with company_type = company. Address, domain, and industry fields map to standard Odoo partner fields. A separate res.partner contact record is created under the company partner for each related contact record, linked via parent_id. If Cordial Company is used only for enrichment and not as a separate collection, the company data is extracted from the contact attributes and applied to the partner record directly.

Cordial

Segments / Audiences

maps to

Odoo CRM

res.partner.category + domain filters

1:1
Mapping required

Cordial Segments (dynamic rule-based audiences) do not have a direct Odoo equivalent in the standard CRM module. We export segment definitions as rule summaries and document which contacts currently match each segment. For static lists we create res.partner.category records; for dynamic segments we document the rule logic so the customer's admin can implement Odoo Search Filters or domain filters on a saved search as the equivalent.

Cordial

Events / Contact Activities

maps to

Odoo CRM

mail.activity

1:1
Mapping required

Cordial Contact Activities (opens, clicks, purchases, custom events) map to Odoo mail.activity records linked to res.partner. We export activity data via the Contact Activity Export API with time-range and event-type filters. Each activity type (email_open, purchase, custom_event_name) becomes an activity with activity_type_id set to a custom Odoo activity type created during schema setup. ActivityDate maps to date_deadline and create_date preserves the original timestamp. If the customer uses the Odoo CRM module heavily, mail.activity provides a workable activity timeline; note that Odoo does not natively support the granular A/B engagement metrics that Cordial captures per message.

Cordial

Owner

maps to

Odoo CRM

res.users

1:1
Fully supported

Cordial Owners (sales reps assigned to contacts and products) map to Odoo res.users by email match. We extract every distinct owner referenced in the Cordial export, match against the Odoo destination User list, and flag any owner without a corresponding Odoo user for the customer's admin to provision before the migration proceeds. user_id on res.partner is set during import to maintain rep assignment.

Cordial

Message Analytics

maps to

Odoo CRM

mail.message (limited)

1:1
Mapping required

Cordial Message Analytics (opens, clicks, bounces, unsubscribes) migrate to Odoo mail.message records linked to the relevant res.partner. We preserve aggregate metrics (open count, click count, bounce status) as custom fields on the partner record. Experiment results (A/B and multivariate test outcomes) are explicitly not API-exportable from Cordial and cannot be migrated programmatically; we flag this gap during discovery and recommend exporting experiment data from the Cordial UI before cutover.

Cordial

Automation Programs

maps to

Odoo CRM

Server Actions (documentation only)

lossy
Fully supported

Cordial Programs (automation sequences and campaign logic) are not API-exportable. We deliver a written inventory of every active Program including trigger events, conditions, delay rules, and action sequence with a recommended Odoo Server Action or CRM Activity Plan equivalent. The customer's Odoo admin or implementation partner rebuilds the automations post-migration. We do not execute automation logic inside the migration scope.

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.

Cordial logo

Cordial gotchas

Medium

Message experiment results are not API-exportable

Medium

Rate limits are method- and endpoint-specific

Low

Custom contact attribute arrays require schema normalization

Low

Products collection uses nested JSON with variants

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

  • Orders stored as events or custom attributes require pre-migration discovery

    Cordial does not have a native order object. Order data, if it exists in the customer's implementation, is stored either as custom contact attributes (last_order_amount, total_orders) or as behavioral events (purchase events with SKU, amount, and timestamp). We cannot migrate what we cannot discover. We run a targeted API export during discovery to identify every custom event type and custom attribute that resembles order data, then agree with the customer on the extraction scope before migration begins. Skipping this step results in incomplete order migration or silent data loss.

  • Cordial Programs and automation workflows do not export via API

    Cordial's Program builder stores workflow logic, triggers, and delay rules in a proprietary format that is not accessible via the export API. We document the program structure from the UI during discovery, but the automation logic itself must be rebuilt in Odoo by the customer's admin or an Odoo implementation partner. We do not migrate automation logic as code. We deliver a Program inventory document with trigger points, conditions, and recommended Odoo equivalents, but the rebuild is outside our standard migration scope.

  • A/B test experiment results cannot be exported from Cordial

    Cordial's Message Analytics Export API explicitly excludes experiment results for batch and automated messages. If the customer has live A/B or multivariate tests in Cordial, those results will not transfer to Odoo CRM through our migration pipeline. We flag this gap during scoping and recommend exporting experiment history from the Cordial UI before cutover. Odoo CRM does not have a native A/B testing module, so the customer should plan to use an external experimentation tool or Odoo-specific reporting for post-migration campaign optimization.

  • Custom contact attribute arrays require schema normalization before Odoo import

    Cordial stores some contact properties as arrays (for example, tag lists, favorite colors, behavioral event history arrays). Odoo res.partner does not natively support array-type fields. We normalize these to delimited strings in a custom field or extract them into a related res.partner.tag many2many table, depending on the customer's reporting needs. This normalization strategy is agreed upon during the discovery phase before any data is written. If array fields are not identified and normalized, Odoo import will reject records with malformed field values.

  • Odoo field validation and required-field constraints can block import

    Odoo enforces required field constraints (name, email) and format validations (email format, phone digits) on res.partner. Cordial contact records with missing or malformed email addresses will fail Odoo import without preprocessing. We run a data quality audit against the Cordial export before migration and either cleanse the records (defaulting missing emails to a placeholder and flagging for manual correction) or use the Odoo-specific import configuration to bypass required-field enforcement during initial load, with a post-import cleanup queue.

Migration approach

Six steps for a successful Cordial to Odoo CRM data migration

  1. Discovery and schema mapping

    We audit the Cordial account across collections (Contacts, Companies, Products, Channels), custom contact attributes by type (string, number, geo, array), event types in the behavioral log, and any order-related custom attributes or custom event types. We pair this with an Odoo module inventory: which Odoo apps are installed (CRM, Sales, Inventory, Accounting), which are the target for migration, and whether Odoo Studio or custom Python models are needed for complex attribute types. The discovery output is a written migration scope document and a field-level mapping matrix covering every Cordial attribute.

  2. Odoo schema preparation and custom field creation

    We create the destination schema in the Odoo instance before any data import. This includes provisioning product.attributes and product.attribute.values for each Cordial product variant dimension (color, size, material), creating product.template and product.product records, and defining custom fields on res.partner for every Cordial custom attribute that does not map to a standard Odoo partner field. If array-type attributes require a normalization strategy, we create the supporting res.partner.tag model and many2many relation. Schema changes deploy into a non-production environment first for validation.

  3. Data quality audit and normalization

    We run a data quality audit against the Cordial export, identifying missing email addresses, malformed phone numbers, duplicate contacts, array-typed attributes requiring normalization, and order-related custom events requiring extraction. We present a data cleansing report to the customer and agree on a cleansing strategy before migration. Records that cannot be automatically normalized are flagged in a manual review queue. This step is critical because Odoo's field validation will reject records with invalid formats on the first import attempt.

  4. Staging migration and reconciliation

    We run a full migration into the customer's Odoo staging environment using production-like data volume. The customer reconciles record counts (Partners in, Products in, Activities in), spot-checks 25-50 random records against the Cordial source, and validates that custom field data is correctly populated. Any mapping corrections, missed custom attributes, or variant unpacking issues surface here and are resolved before production migration. No production data moves until staging sign-off.

  5. Production migration in dependency order

    We run production migration in record-dependency order: product.attributes and product.attribute.values first, then product.template, then product.product variants, then res.partner (companies first, then contacts with parent_id resolved), then mail.activity records linked to res.partner, then sale.order and sale.order.line (if order data exists and was scoped). Each phase emits a row-count reconciliation report before the next phase begins. Array-typed attributes normalize during the transform step before partner insert.

  6. Cutover, validation, and automation rebuild handoff

    We freeze writes in Cordial during the cutover window, run a final delta migration of any records modified during the window, and enable Odoo as the system of record. We deliver the Program inventory and automation rebuild guide to the customer's admin team, with Odoo Server Action and CRM Activity Plan equivalents documented per program. We support a one-week hypercare window for reconciliation issues. We do not rebuild Cordial automation programs inside the migration scope; that work requires an Odoo implementation partner or internal admin effort.

Platform deep dives

Context on both ends of the pair

Cordial logo

Cordial

Source

Strengths

  • Flexible JSON-based data model accommodating unlimited custom contact attributes without schema migration overhead.
  • Drag-and-drop Sculpt block editor for rapid email production without requiring developer resources.
  • Product-centric architecture treating SKUs, variants, and catalog data as native objects for personalization.
  • AI agents introduced in 2026 for automated email production and data intelligence workflows.
  • SFTP, AWS S3, and Google Cloud Storage integration for automated data export workflows.

Weaknesses

  • Message experiment results are explicitly not available via the export API, requiring manual UI-based export for A/B test data.
  • Reporting and analytics dashboards are described as insufficient by some users for deep performance analysis, often requiring supplemental BI tooling.
  • Segment logic and automation workflows lack a public export API, making migration of campaign automation a manual rebuild exercise.
  • Order data is not a native first-class object, often stored as custom attributes or behavioral events, requiring careful schema discovery before migration.
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. All 8 core objects map 1:1 between Cordial and Odoo CRM.

B

Overall complexity

Standard migration

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

  • Object compatibility

    A

    All 8 core objects map 1:1 between Cordial and Odoo CRM.

  • 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

    Cordial: Method- and endpoint-specific limits; default limits vary per tier; X-Rate-Limit-* response headers exposed; Retry-After header for backoff; limits are customizable per customer contract.

  • Data volume sensitivity

    A

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

Estimator

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

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

Can't find your answer?

Walk through your Cordial 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 products, and no order data stored as custom events typically complete in three to five weeks. Migrations with nested product variants, order data requiring extraction from behavioral events, large activity histories (over 200,000 event records), or multi-module Odoo destinations (CRM plus Sales plus Inventory) move to eight to fourteen weeks because of schema discovery complexity and the variant unpacking work. The discovery and staging phases alone add two to three weeks regardless of data volume.

Adjacent paths

Related migrations to explore

Ready when you are

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