CRM migration
Field-level mapping, validation, and rollback between Customer Database App and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Customer Database App
Source
Odoo CRM
Destination
Compatibility
7 of 12
objects map 1:1 between Customer Database App and Odoo CRM.
Complexity
BStandard
Timeline
2-3 weeks
Overview
Customer Database App holds data as a single flat contact record with an entirely user-defined field schema. Odoo CRM uses a relational model built around res.partner (Contacts), crm.lead (Leads), and crm.lead (Opportunities), with a structured pipeline stage system and tag management via res.partner.category. There is no public API on Customer Database App, so we extract through CSV or VCF exports, infer the active field list from column headers, and map each custom field to an Odoo custom field of equivalent type. MySQL sync users hold a second copy of their data; we extract from MySQL where it is reachable as it typically contains records not yet synced back to the local app. Vouchers, phone call history, and caller-ID logs have no Odoo equivalent and do not migrate. We deliver a written Odoo pipeline and stage configuration before data moves, and a supplemental voucher export CSV for manual re-entry.
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 Customer Database App 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.
Customer Database App
Contact
Odoo CRM
res.partner
1:1Customer Database App Contacts map directly to Odoo res.partner records. We infer the complete field list from the CSV column headers, then create Odoo custom fields of matching type (char, text, date, integer, float, selection) in the Odoo Settings before import. Free-text fields with embedded commas are sanitized during the transform. The res.partner is created as customer=True to mark it as an external contact rather than an internal user.
Customer Database App
Pipeline Stage
Odoo CRM
crm.stage
lossyCustomer Database App Kanban stages export as a label column on each contact record. We map each distinct stage name to a corresponding crm.stage sequence in Odoo, preserving the original ordering. Probability percentages can be set per stage if the customer provides the weighting; otherwise stages default to Odoo's standard probability ladder. The stage sequence is configured before contact import so that Opportunities can reference the correct stage_id on insert.
Customer Database App
Contact (with stage label)
Odoo CRM
crm.lead (Opportunity)
lossyContacts that have a non-empty pipeline stage label in Customer Database App are candidates for crm.lead creation. We create a crm.lead per contact where a stage label exists, linking it to the corresponding res.partner via partner_id. This requires the partner to be inserted first so the foreign key resolves. The lead_name on crm.lead defaults to the contact's display name, and type='opportunity' is set to distinguish from pure Leads.
Customer Database App
Group / Tag
Odoo CRM
res.partner.category
1:manyCustomer Database App exports tags as comma-separated label strings on each contact row. We split these into individual tag names, create each res.partner.category record if it does not already exist, and link it to the corresponding res.partner via res.partner.category_id (many2many). Tags with special characters are normalized to lowercase alphanumeric for Odoo category name compatibility.
Customer Database App
Birthday
Odoo CRM
res.partner (date field or custom)
1:1Birthday exports from Customer Database App as a date field on the contact record. We map it to an Odoo res.partner.date field if the customer's Odoo instance has the Birthdate field enabled via Contacts configuration, or to a custom date field birthdate_date__c on res.partner if the standard field is not active. The date format is normalized to YYYY-MM-DD during the transform.
Customer Database App
Contact Image / PDF Export
Odoo CRM
ir.attachment linked to res.partner
1:1Customer Database App can export individual contact records as PDFs or store contact photos. We bundle these into a ZIP archive indexed by contact identifier, then attach each file to the corresponding res.partner record via ir.attachment with res_model='res.partner' and res_id pointing to the partner ID. PDF exports land as application/pdf; images land as image/png or image/jpeg.
Customer Database App
Voucher
Odoo CRM
Not migrated
1:1Vouchers are a standalone object in Customer Database App with no equivalent in Odoo CRM. Voucher balances are not exported via CSV and have no standard CRM representation. We do not migrate voucher records. We generate a supplemental voucher CSV with all available voucher fields for manual re-entry by the customer in Odoo or in a dedicated vouchers application they choose to install.
Customer Database App
Phone Call History
Odoo CRM
Not migrated
1:1Caller-ID logs and call history are transient device-level records that are not included in CSV or VCF exports from Customer Database App. These do not migrate. We recommend documenting call-handling procedures and any reference phone numbers separately for the customer's admin to re-enter manually if needed.
Customer Database App
MySQL Sync (if enabled)
Odoo CRM
Primary extraction source
1:1Customers with MySQL sync enabled hold two copies of their data. We extract from the MySQL database where it is reachable because it typically contains records not yet synced back to the local app and more complete field data. We reconcile the MySQL copy against any latest CSV export to detect records added or modified after the last sync cycle, then use the MySQL version as authoritative.
Customer Database App
Custom Property (arbitrary user-defined)
Odoo CRM
ir.model.fields (custom) on res.partner
lossyCustomer Database App supports unlimited user-defined fields with no enforced type or naming convention. We infer the type of each custom field from the exported data values (numeric strings become integer or float, ISO dates become date, everything else becomes char or text). We pre-create each custom field as an ir.model.fields entry in the customer's Odoo database before the contact import phase, so the import can populate them without schema errors.
Customer Database App
Owner / User
Odoo CRM
res.users
1:1Customer Database App does not have a multi-user model, but contact records may contain an owner or assigned-to field. We map owner references to res.users by email address where the email domain matches an active Odoo user. Unmatched owners are flagged in the reconciliation report for the customer's admin to provision before the contact import phase runs.
Customer Database App
GDPR / Data Export
Odoo CRM
res.partner archive
lossyCustomer Database App includes EU-GDPR tools for data export and deletion requests. If the customer's Odoo instance includes the gdpr module or a GDPR app from the Odoo Apps store, we preserve the gdpr_expiration_date and any consent records as custom fields on res.partner. Deletion requests are noted in the migration scope but are not automatically recreated as Odoo does not have a native gdpr.deletion.request model in standard CRM.
| Customer Database App | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Contact (with stage label) | crm.lead (Opportunity)lossy | Fully supported | |
| Group / Tag | res.partner.category1:many | Fully supported | |
| Birthday | res.partner (date field or custom)1:1 | Fully supported | |
| Contact Image / PDF Export | ir.attachment linked to res.partner1:1 | Fully supported | |
| Voucher | Not migrated1:1 | Fully supported | |
| Phone Call History | Not migrated1:1 | Not supported | |
| MySQL Sync (if enabled) | Primary extraction source1:1 | Fully supported | |
| Custom Property (arbitrary user-defined) | ir.model.fields (custom) on res.partnerlossy | Fully supported | |
| Owner / User | res.users1:1 | Fully supported | |
| GDPR / Data Export | res.partner archivelossy | Fully 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.
Customer Database App gotchas
No API means migration runs through CSV exports only
User-defined schema creates field mapping ambiguity
MySQL sync creates a parallel data source that must be reconciled
Voucher and birthday objects have no standard CRM equivalent
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
Export and schema inference
We request a full CSV export from Customer Database App, or connect to the paired MySQL database if sync is enabled and reachable. We parse the column headers to build the complete active field list and infer each field's data type from the exported values. We present the inferred schema to the customer for confirmation and flag any fields that appear to contain multiple values, embedded delimiters, or non-standard date formats. Any discrepancies between the export and the customer's field list trigger a re-export before we proceed.
Odoo custom field creation and pipeline stage configuration
We log into the customer's Odoo instance (Community or Online) and create all required custom fields on res.partner as ir.model.fields entries, specifying the correct field type (char, text, date, datetime, integer, float, boolean, selection) for each. We configure the crm.stage pipeline to match the stage names and ordering from Customer Database App, setting probability percentages per stage where the customer provides them. If the customer plans to use crm.lead as Opportunities, we configure the crm.team and assign a salesperson responsible for pipeline ownership.
Owner reconciliation and user provisioning
We extract every distinct owner or assigned-to reference from the Customer Database App export and match by email against the Odoo res.users table. Any owner without a matching Odoo user is flagged in a reconciliation report. The customer's Odoo admin provisions the missing users (or deactivates the reference if the original owner is no longer active) before we proceed to contact import. OwnerId resolution must complete before Opportunity import because crm.lead requires a valid user_id on insert.
Sandbox migration and reconciliation
We run a full migration into the customer's Odoo Sandbox or a staging database using production-equivalent data volume. The customer reconciles record counts (Contacts in, Opportunities in, Tags created), spot-checks 25-50 records against the source export, and verifies that custom fields populated correctly, tags assigned to the right contacts, and pipeline stages reflect the original Customer Database App order. The customer signs off the sandbox result before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (Contacts) first with all custom fields populated, then crm.lead (Opportunities) with partner_id resolved to the contact, res.partner.category (Tags) created individually and linked via many2many, ir.attachment records for contact images and PDFs via ZIP index, and birthday or anniversary dates on res.partner. Each phase emits a row-count reconciliation report before the next phase begins. The MySQL source is used as authoritative where it is accessible.
Cutover, validation, and supplemental export delivery
We freeze Customer Database App as the system of record once production migration is validated. We deliver the supplemental voucher CSV for manual re-entry and the written pipeline-stage configuration summary for the customer's admin to verify in Odoo. We do not migrate call history, caller-ID logs, or vouchers as these have no Odoo CRM equivalent. We support a three-day post-migration window to resolve any data discrepancies surfaced by the sales team during their first week in Odoo. Workflow and automation rebuilds are outside standard migration scope and are documented as a separate admin task.
Platform deep dives
Customer Database App
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Customer Database App and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Customer Database App and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Customer Database App and Odoo CRM.
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
Customer Database App: Not applicable — no API exists.
Data volume sensitivity
Customer Database App 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 Customer Database App to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Customer Database App 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 Customer Database App
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.