CRM migration
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
Source
Odoo CRM
Destination
Compatibility
10 of 14
objects map 1:1 between Concord CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
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.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
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
Odoo CRM
Contact (res.partner with customer_rank)
1:1Concord 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
Odoo CRM
Company (res.partner with supplier_rank)
1:1Concord 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
Odoo CRM
Opportunity (crm.lead with type = opportunity)
1:1Concord 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
Odoo CRM
Product (product.product)
1:1Concord 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)
Odoo CRM
Calendar Event (calendar.event)
1:1Concord 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)
Odoo CRM
Task (project.task)
1:1Concord 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)
Odoo CRM
Note (note.note)
1:1Concord 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)
Odoo CRM
Email Message (mail.message)
1:1Concord 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
Odoo CRM
Custom Fields (ir.model.fields)
lossyConcord 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
Odoo CRM
Users (res.users)
1:1Concord 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
Odoo CRM
Stage (crm.stage)
lossyConcord 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
Odoo CRM
Tags (crm.tag)
1:1Concord 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
Odoo CRM
Automated Actions (ir.actions.server)
lossyConcord 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
Odoo CRM
Attachments (ir.attachment)
lossyConcord 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.
| Concord CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | Contact (res.partner with customer_rank)1:1 | Fully supported | |
| Company | Company (res.partner with supplier_rank)1:1 | Fully supported | |
| Deal | Opportunity (crm.lead with type = opportunity)1:1 | Fully supported | |
| Product | Product (product.product)1:1 | Fully supported | |
| Activity (calls and meetings) | Calendar Event (calendar.event)1:1 | Fully supported | |
| Activity (tasks) | Task (project.task)1:1 | Fully supported | |
| Activity (notes) | Note (note.note)1:1 | Fully supported | |
| Activity (emails) | Email Message (mail.message)1:1 | Fully supported | |
| Custom Fields | Custom Fields (ir.model.fields)lossy | Mapping required | |
| Users | Users (res.users)1:1 | Fully supported | |
| Pipeline Stage | Stage (crm.stage)lossy | Fully supported | |
| Tags | Tags (crm.tag)1:1 | Fully supported | |
| Workflows | Automated Actions (ir.actions.server)lossy | Not supported | |
| Attachments | Attachments (ir.attachment)lossy | Not supported |
Gotchas + challenges
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 gotchas
Workflows do not fire during data import
Self-hosted data export requires role permission
API pagination cap at 100 records per page
Domain transfer requires full server migration
CSRF headers cause API auth failures
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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.
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
Concord CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Concord CRM and Odoo CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
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
Concord CRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Concord CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave Concord CRM
Other ways to arrive at Odoo CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.