CRM migration

Migrate from Concord CRM to Odoo CRM

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

Concord CRM logo

Concord CRM

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

71%

10 of 14

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

Complexity

BStandard

Timeline

4-8 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Concord CRM to Odoo CRM is a self-hosted-to-modular-suite migration that consolidates CRM, sales, and often accounting into a single platform. Concord CRM stores Contacts, Companies, Deals, Products, and Activities with a single-pipeline model and exports them via CSV or REST API with a 100-record pagination cap. Odoo CRM uses the crm.lead model for incoming prospects and crm.lead-to-Opportunity conversion for sales pipeline entries; a Concord Deal maps to an Odoo Opportunity attached to the migrated Account. We pre-create Odoo's custom fields to match Concord's UUID-keyed schema before migration, preserve activity history as calendar events and mail messages with the correct parent-record references, and deliver a written workflow inventory for manual rebuild in Odoo Automated Actions. Concord's workflows do not fire during data import and cannot be migrated as automation code.

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

Concord CRM logo

Concord CRM

What's pushing teams away

  • Support response times are slow — G2 reviewers report waiting over a week for assistance with no video tutorials available to compensate.
  • Self-hosted model requires ongoing server maintenance, security updates, and PHP/Laravel version management that many teams lack resources for.
  • No built-in migration tool or guided export — teams transferring to another CRM must manually sequence CSV exports and handle relationship mapping themselves.
  • Server scaling and performance optimization fall entirely on the customer, with no SLA guarantees or managed hosting options available.
  • Limited ecosystem compared to major SaaS CRMs — fewer integrations, no marketplace of pre-built add-ons, and community resources are sparse.

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

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

Concord CRM

Contact

maps to

Odoo CRM

Contact (res.partner with customer_rank)

1:1
Fully supported

Concord CRM Contacts map to Odoo res.partner records with the customer_rank set to indicate commercial contact status. The Concord contact's company_id foreign key references the migrated Concord Company, which maps to the Odoo res.partner with supplier_rank = 0. Email, phone, job title, address, and custom fields migrate directly. Any Concord Contact without an assigned company_id becomes a standalone res.partner; we flag these for manual review during scoping to determine whether they should receive a parent company record.

Concord CRM

Company

maps to

Odoo CRM

Company (res.partner with supplier_rank)

1:1
Fully supported

Concord CRM Companies map to Odoo res.partner records with supplier_rank = 1 and customer_rank = 0, designating them as commercial entities rather than individual contacts. The company name, domain, address, phone, and all standard and custom fields migrate. Companies must be imported before Contacts in the migration sequence because the res.partner.id generated during the Company import is required as the parent_id on the Contact import to satisfy the many2one relationship.

Concord CRM

Deal

maps to

Odoo CRM

Opportunity (crm.lead with type = opportunity)

1:1
Fully supported

Concord CRM Deals map to Odoo crm.lead records with type = 'opportunity', attached to the parent res.partner Account via partner_id. Deal value maps to Odoo's planned_revenue field. Concord's deal stage names map to Odoo crm.stage names via the stage mapping matrix defined during scoping; we create Odoo stages with matching names and probability percentages before migration begins. Assigned user maps via email resolution to Odoo user_id. Expected close date migrates to date_deadline. Concord's pipeline concept maps to Odoo's crm.team; we assign the migrated deal to the relevant team based on Concord's pipeline assignment or owner territory.

Concord CRM

Product

maps to

Odoo CRM

Product (product.product)

1:1
Fully supported

Concord CRM Products map to Odoo product.product records with name, default_code (SKU), list_price, and standard_price preserved. The Concord product's description field migrates to Odoo's description field. Products are independent records with no foreign-key dependencies, so migration order is flexible. We recommend migrating Products before any Deal records that reference them if the customer plans to attach line items, though Concord Deals do not natively support line items without a custom extension.

Concord CRM

Activity (calls and meetings)

maps to

Odoo CRM

Calendar Event (calendar.event)

1:1
Fully supported

Concord CRM Activity records with type = 'call' or 'meeting' map to Odoo calendar.event. We reconstruct the parent association using Concord's linked_resource_type and linked_resource_id: if linked to a Contact, we set res_model = 'res.partner' and res_id = the migrated partner.id; if linked to a Deal, we set res_model = 'crm.lead' and res_id = the migrated opportunity.id. Start and stop times migrate to start and stop fields; duration recalculates from the time delta. Notes from Concord's activity body migrate as a calendar.event.description entry.

Concord CRM

Activity (tasks)

maps to

Odoo CRM

Task (project.task)

1:1
Fully supported

Concord CRM Activity records with type = 'task' map to Odoo project.task records linked to the CRM project (project with use_tasks = True). The Concord task's title maps to Odoo's name field, description to the notes field, and due date to the date_deadline. Owner assignment resolves via email match to Odoo user_id. If the customer does not have the Project app enabled in Odoo, tasks are stored in crm.lead as mail.message records with a task flag, and we document this decision during scoping.

Concord CRM

Activity (notes)

maps to

Odoo CRM

Note (note.note)

1:1
Fully supported

Concord CRM Activity records with type = 'note' map to Odoo note.note records. We link the note to the parent record (Contact or Deal) using Concord's linked_resource_type and linked_resource_id with res_model and res_id. The note body migrates as the note.note content field. Activity timestamps are preserved in the note's create_date for audit ordering.

Concord CRM

Activity (emails)

maps to

Odoo CRM

Email Message (mail.message)

1:1
Fully supported

Concord CRM Activity records representing emails map to Odoo mail.message records with message_type = 'email'. Email body migrates as the message body; sender and recipient addresses map to mail.message's author_id and partner_ids. Parent resolution uses Concord's linked_resource_id to set res_model and res_id on the mail.message, linking the email to the correct Contact or Deal. Email attachments from Concord migrate as mail.message attachments, stored as ir.attachment records linked to the message.

Concord CRM

Custom Fields

maps to

Odoo CRM

Custom Fields (ir.model.fields)

lossy
Mapping required

Concord CRM custom fields are fully supported via API using the field UUID as the key. Before migration, we pre-create all matching Odoo custom fields using ir.model.fields with the appropriate field type (char, selection, integer, float, date, datetime, boolean, text) and assign them to the correct model (res.partner, crm.lead) and field group. Concord Boolean fields map to Odoo boolean fields; Concord select fields map to Odoo selection fields with the same options. We flag any Concord field types that have no Odoo equivalent (such as Concord-specific multi-select formats) during scoping for manual handling.

Concord CRM

Users

maps to

Odoo CRM

Users (res.users)

1:1
Fully supported

Concord CRM Users are resolved by email address against Odoo's res.users table. The migration user must have a matching Odoo user record to populate the owner_id (user_id) on migrated Deals and Activities. Any Concord user without a matching Odoo user goes to a reconciliation queue for the customer's Odoo admin to provision before record import resumes. Role and permission sets from Concord do not map directly to Odoo access rights; we document the Concord role assignments as a separate configuration step for the customer's Odoo admin.

Concord CRM

Pipeline Stage

maps to

Odoo CRM

Stage (crm.stage)

lossy
Fully supported

Concord CRM pipeline stages are stored as deal properties and export as stage names or IDs. We create Odoo crm.stage records with matching names and probability percentages before Deals are migrated. Concord's pipeline concept maps to Odoo's crm.team: each Concord pipeline becomes a separate crm.team in Odoo with its own stage sequence. Stage order and visual grouping in Concord map to Odoo's stage sequence within the team's pipeline.

Concord CRM

Tags

maps to

Odoo CRM

Tags (crm.tag)

1:1
Fully supported

Concord CRM tag values stored as comma-separated or multi-select fields map to Odoo crm.tag records. We extract unique tag values during the data audit, create matching crm.tag records in Odoo before the main migration, and populate tag_ids on crm.lead during import using the tag ID lookup. Tags used for contact classification versus deal classification require separate tagging strategies; we document this decision during scoping.

Concord CRM

Workflows

maps to

Odoo CRM

Automated Actions (ir.actions.server)

lossy
Not supported

Concord CRM workflow configurations (trigger: Company/Contact/Deal created, Deal stage changed; action: Create Activity, Send Email, Trigger Webhook) are explicitly not executed during data import. We audit all active workflows during scoping, document their trigger conditions and actions in a written inventory, and provide a recommended Odoo Automated Actions or Studio equivalent for each. The customer's Odoo admin rebuilds these post-migration; we do not convert Concord workflow logic to Odoo server actions as part of the migration scope.

Concord CRM

Attachments

maps to

Odoo CRM

Attachments (ir.attachment)

lossy
Not supported

Concord CRM stores file attachments in storage/app with no standard export tool. We extract attachments via direct file system access scoped to the Concord installation, organize them by parent record type (Contact, Company, Deal) using the Concord attachment metadata export, zip by record, and upload to Odoo as ir.attachment records with res_model = 'res.partner' or 'crm.lead' and res_id pointing to the migrated record. This step adds a manual coordination requirement with the customer's server access and is scoped separately if file volume exceeds 5,000 attachments.

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.

Concord CRM logo

Concord CRM gotchas

High

Workflows do not fire during data import

Medium

Self-hosted data export requires role permission

Medium

API pagination cap at 100 records per page

Low

Domain transfer requires full server migration

Low

CSRF headers cause API auth failures

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

  • Concord CRM workflows do not execute during data import

    Concord CRM explicitly states that workflow actions do not fire during data import. This means any automation you have configured — such as Create Activity or Send Email triggers on Contact creation, or Deal stage change actions — will not run when we import your records into Odoo. We audit all active Concord workflow configurations during scoping and deliver a written inventory listing each workflow's trigger, conditions, and actions alongside a recommended Odoo Automated Actions or ir.actions.server equivalent. Your Odoo admin rebuilds these manually post-migration; we do not convert Concord workflow logic to Odoo code inside the migration scope.

  • Concord activity associations require parent-record lookup during migration

    Concord CRM Activities store parent associations as linked_resource_type (Contact/Company/Deal) and linked_resource_id (UUID). Odoo calendar.event and mail.message link to parent records via res_model and res_id (the Odoo record ID). We resolve the Concord UUID to the Odoo res_id at migration time by querying the migration staging table that maps Concord IDs to Odoo IDs. If a Concord activity references a record that was excluded from the migration (archived, deleted, or intentionally skipped), the activity is flagged with a null res_id and logged for manual review. Skipping this resolution step produces orphaned activity records with no visible parent in Odoo's CRM view.

  • Odoo CRM requires pre-created custom field schema before import

    Odoo requires custom fields to be defined in the database before data containing those field values can be inserted. Concord CRM custom fields are retrieved via API using the field UUID as the key, but Odoo expects ir.model.fields records with the correct ttype (char, selection, integer, boolean, date, datetime, text) and field groups. We pre-create all Concord custom fields in Odoo before any record migration begins, matching the field type and options where supported. Fields with Concord-specific multi-select formats that have no Odoo equivalent are flagged during scoping and migrated as text fields with manual review recommended post-import.

  • Concord CRM self-hosted export requires server-level file access for attachments

    Concord CRM stores file attachments in the storage/app directory on the self-hosted server with no export feature in the application UI or API. If attachment migration is in scope, we need SSH or FTP/SFTP access to the Concord server to extract files, along with the Concord attachment metadata export to map file paths to record IDs. The customer must provision this access and confirm the server's disk capacity for the file zip operation. This step is scoped separately if attachment count exceeds 5,000 files or total attachment size exceeds 10 GB.

  • Odoo major version upgrades across the suite require separate tooling

    If the customer's Odoo instance is on a significantly older version (v11-v13) that requires sequential upgrade paths to reach the current version, the Odoo upgrade itself is a separate engineering effort outside the CRM data migration scope. Odoo community forums (including odoo.com forum posts on CRM history migration) document that major version jumps require incremental database migrations that can introduce schema incompatibilities. We confirm the target Odoo version during scoping and flag version upgrade requirements as a dependency before data migration begins.

Migration approach

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

  1. Discovery and scoping audit

    We audit the Concord CRM installation via REST API and CSV export across all objects: Contacts, Companies, Deals, Products, Activities, Custom Fields, Users, Pipeline Stages, Tags, and Attachments. We confirm export permissions (Concord CRM role-based access restricts export by default to admin users), verify the API token bearer credentials, and test pagination with per_page = 100 to measure total record counts. We also audit active Concord workflow configurations for the written inventory. For the Odoo side, we confirm the Odoo edition (Community vs. Enterprise), installed apps, and existing res.partner and crm.lead record counts to establish a pre-migration baseline. The discovery output is a written migration scope document covering record counts, custom field inventory, pipeline stage mapping matrix, owner reconciliation list, and any exclusions.

  2. Odoo schema pre-configuration

    We configure the destination Odoo CRM before any data arrives. This includes creating crm.stage records matching Concord's pipeline stage names and probabilities; creating crm.team records for each Concord pipeline; pre-creating custom fields via ir.model.fields with correct field types and field groups on res.partner and crm.lead; configuring tag records in crm.tag; and setting up any required Odoo access rights for the migration user. If the customer uses Odoo multi-company or multi-currency configurations, we align these with Concord's data during this phase. Schema configuration happens in an Odoo Sandbox or development environment first for validation.

  3. Sandbox migration and reconciliation

    We run a full migration into the Odoo staging environment using production-equivalent data volumes extracted from Concord. The customer's CRM lead reviews record counts (Accounts in, Contacts in, Opportunities in, Calendar events in, mail messages in), spot-checks 25-50 random records against the Concord source for field accuracy and custom field population, and validates that activity associations link to the correct parent records in Odoo's activity timeline view. Any mapping corrections, stage name adjustments, or custom field type changes are made before production migration begins. This step typically takes one to two weeks depending on customer review cycle time.

  4. Owner and user reconciliation

    We extract every distinct Concord user referenced as an owner on Contact, Company, Deal, and Activity records and match by email against Odoo's res.users table. Users without a matching Odoo account go to a reconciliation queue. The customer's Odoo admin provisions any missing Odoo user accounts before production migration resumes. Concord role-based permissions (admin, sales rep, readonly) are documented separately and mapped to Odoo access rights groups (CRM > User, CRM > Manager) by the customer's admin during Odoo configuration. Migration cannot proceed past this step because OwnerId references on crm.lead require a valid res.users record.

  5. Production migration in dependency order

    We run production migration in strict dependency order: res.partner (Companies) first, then res.partner (Contacts) with parent_id resolved to the Company record, then crm.lead (Deals as Opportunities) with partner_id and user_id resolved, then calendar.event and mail.message (Activities) with res_model and res_id resolved via the ID mapping table, then crm.tag assignments on crm.lead, then ir.attachment records for file attachments (if in scope). Each phase emits a row-count reconciliation report showing imported versus expected, and no phase begins until the previous phase's report is signed off. Concord's CSRF header sensitivity requires our integration client to strip referer and origin headers on every API call to avoid Laravel Sanctum rejections.

  6. Cutover, validation, and workflow rebuild handoff

    We freeze Concord CRM writes during the cutover window, run a final delta migration of any records created or modified during the migration window, then mark Odoo CRM as the system of record. We validate the final record counts against the Concord source totals and spot-check a sample of migrated records for field-level accuracy. We deliver the Concord workflow inventory document to the customer's Odoo admin with recommended Automated Actions equivalents for each workflow trigger and action. We support a one-week hypercare window to resolve any reconciliation issues raised by the customer's team. We do not rebuild Concord workflows as Odoo Automated Actions inside the migration scope; that is a separate configuration engagement.

Platform deep dives

Context on both ends of the pair

Concord CRM logo

Concord CRM

Source

Strengths

  • One-time $64–$390 license with lifetime access and no per-user or per-contact recurring fees.
  • Full source code access enables deep customization, white-labeling (Extended License), and full data portability.
  • Unlimited users and unlimited data records as long as the server infrastructure supports it.
  • Native CSV/XLS/XLSX export for Contacts, Companies, Deals, Products, and Activities without requiring API access.
  • REST API with Bearer token auth supports custom integrations, automations, and programmatic data access.

Weaknesses

  • Self-hosted only — requires PHP/Laravel server setup, maintenance, and ongoing security management by the customer.
  • No built-in migration or import tool; workflow automations do not execute during data import.
  • Support limited to ticket system with documented delays of over a week for some requests.
  • Single installation per license with no SaaS-ready code out of the box.
  • Limited ecosystem, integrations, and community resources compared to major SaaS CRM platforms.
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 Concord CRM 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

    Concord CRM: Per-minute limits documented in X-RateLimit-Limit and X-RateLimit-Remaining response headers; exact values vary and are not publicly specified.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Migrations under 25,000 Contacts, 5,000 Deals, and no attachment file transfer typically complete in four to eight weeks. Complex migrations with large activity histories (over 200,000 calendar and mail records), multiple Concord pipelines mapped to multiple Odoo CRM teams, custom object schemas, or attachment file extraction move to ten to twenty weeks because of the parent-record ID resolution sequencing, attachment file system extraction, and multi-team stage mapping configuration.

Adjacent paths

Related migrations to explore

Ready when you are

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