CRM migration
Field-level mapping, validation, and rollback between ContactDB and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
ContactDB
Source
Odoo CRM
Destination
Compatibility
6 of 12
objects map 1:1 between ContactDB and Odoo CRM.
Complexity
CModerate
Timeline
1-2 weeks
Overview
ContactDB is a purchased B2B contact list database with no API, no activity history, and no pipeline model. Moving to Odoo CRM is a structural migration from flat purchased records to a live CRM with Leads, Partners, and optional pipeline tracking. We extract the customer-provided CSV export, reconstruct Companies as Odoo Partners from firmographic attributes (company name, size, industry, SICCODE, credit rating), then load individual contacts as Odoo Leads or Partners depending on qualification status. Segment labels from ContactDB's industry, profession, title, country, and software-usage criteria are stored as multi-value tag fields on the Partner record. We do not migrate Workflows, automations, or reports because ContactDB does not expose them; we deliver a written schema of any Odoo automations the customer's team should configure post-migration. Odoo pricing runs per user per month ($31-$47 USD on Standard or Custom plans) plus the cost of any additional Odoo apps the customer activates beyond the CRM module.
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 ContactDB 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.
ContactDB
Contact (flat record)
Odoo CRM
Partner (res.partner)
1:manyContactDB exports flat contact records with individual name, email, phone, title, and firmographic fields (company name, industry, SICCODE, company size, credit rating) per row. We split each flat record into an Odoo Partner record representing the company (company_type = 'company') and a related Partner contact (company_type = 'person') linked via the parent_id relationship. The individual contact's name, email, phone, and title become fields on the child Partner record; firmographic attributes (company name, industry, SICCODE, size, credit rating) become fields on the parent Partner record. Deduplication by company name and domain is performed before import to prevent duplicate Partner records.
ContactDB
Contact (individual fields)
Odoo CRM
Lead (crm.lead)
lossyIf the customer intends to use Odoo's Lead-to-Opportunity conversion workflow, we load individual ContactDB contacts as crm.lead records rather than directly as Partners. Each lead inherits the contact's name, email, phone, title, and company name as partner_name. Lead source is set to 'ContactDB Import'. The customer decides during scoping whether contacts should land as Leads (requiring manual or automatic conversion) or directly as Partners (operational immediately). We cannot infer pipeline qualification because ContactDB has no engagement or sales-readiness data.
ContactDB
Company attributes (from flat contact)
Odoo CRM
Partner (company record)
1:1ContactDB firmographic fields (company name, industry, company size, SICCODE, credit rating) map to the parent Odoo Partner record. Company name maps to Partner name; industry maps to industry_id (Odoo's industry reference field); SICCODE maps to a custom Partner field sic_code__c; company size maps to a custom field company_size__c; credit rating maps to a custom field credit_rating__c. We create the company Partner record first, then link individual contacts as child Partner records via parent_id. Deduplication is performed using fuzzy matching on company name and domain extraction from email addresses.
ContactDB
Tags / Segment membership
Odoo CRM
Partner tags (mail.message.subtype or custom field)
lossyContactDB segments contacts by industry, profession, title, country, and software usage, but these segment labels are not exported as standalone tag objects. We reconstruct segment membership as Odoo Partner tags. We create a tag per unique segment category (Industry, Profession, Title, Country, Software) and apply tags to each Partner record based on the source contact's attributes. For multi-value segments, we create multiple tags and apply all applicable tags to each record. The customer confirms which segment categories carry business value before import to avoid importing irrelevant tags.
ContactDB
Title / Job function
Odoo CRM
Partner function field or custom field
1:1ContactDB title and profession fields map to the Odoo Partner function field (the partner's job title within the company context). For detailed title precision, we create a custom Partner field original_title__c to preserve the full ContactDB title string. Title-level segmentation (C-suite, VP, Director, Manager) can be derived from title parsing and stored as a custom picklist field if the customer intends to use Odoo's sales team or partner categorization features.
ContactDB
Email address
Odoo CRM
Partner email field
1:1ContactDB email maps directly to Odoo Partner email. We apply pre-import validation that flags records with missing email, malformed email format, or email addresses matching known disposable email domains. Flagged records are exported in a separate review CSV for the customer's admin to inspect and correct before import resumes. Email is the primary dedupe key for individual contacts.
ContactDB
Phone / mobile number
Odoo CRM
Partner phone and mobile fields
1:1ContactDB phone and mobile fields map to Odoo Partner phone and mobile. We normalize phone numbers to E.164 format where possible (stripping country-code prefixes and re-applying based on ContactDB's country field) to ensure Odoo's click-to-call integrations work correctly. Numbers that cannot be normalized are preserved in original format in a custom field original_phone__c.
ContactDB
Mailing address fields
Odoo CRM
Partner address fields
1:1ContactDB exports mailing address components (street, city, state, postal code, country) per contact. These map to Odoo Partner address fields (street, city, state_id, zip, country_id). Country is mapped to the Odoo res.country record by ISO code match. State is mapped to res.country.state records where applicable. We validate country codes against Odoo's country list before import and flag unrecognized country values for customer review.
ContactDB
SICCODE
Odoo CRM
Custom Partner field sic_code__c
lossySICCODE is a ContactDB firmographic field with no direct Odoo CRM equivalent. We create a custom Partner field sic_code__c of type Char to preserve the full four-digit SIC code. If the customer intends to use industry classification for segmentation or reporting, we can alternatively map SICCODE to Odoo's industry_id hierarchy, but this requires a mapping table from SIC code to Odoo's industry category values.
ContactDB
Company size / employee count
Odoo CRM
Custom Partner field company_size__c
lossyContactDB company size maps to a custom Partner field company_size__c of type Selection with common B2B size brackets (1-10, 11-50, 51-200, 201-500, 501-1000, 1000+). The raw numeric employee count from ContactDB, if available, is stored in a companion integer field employee_count__c for reporting flexibility.
ContactDB
Credit rating
Odoo CRM
Custom Partner field credit_rating__c
lossyContactDB credit rating is a proprietary firmographic signal with no Odoo CRM standard equivalent. We create a custom Partner field credit_rating__c of type Char to preserve the rating value verbatim. If the customer uses credit rating for segmentation or prioritization, we recommend converting it to a Selection field with standardized values during the pre-import data review phase.
ContactDB
Country / geographic coverage
Odoo CRM
Partner country_id field
1:1ContactDB exports contacts across US, UK, Canada, Australia, Singapore, Indonesia, and Malaysia markets. The country field maps to Odoo Partner country_id using ISO code lookup against Odoo's res.country table. All seven supported countries are present in Odoo's standard country list. Country data is also stored as a Partner tag for geographic segmentation in Odoo's sales team or territory assignment features.
| ContactDB | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact (flat record) | Partner (res.partner)1:many | Fully supported | |
| Contact (individual fields) | Lead (crm.lead)lossy | Fully supported | |
| Company attributes (from flat contact) | Partner (company record)1:1 | Fully supported | |
| Tags / Segment membership | Partner tags (mail.message.subtype or custom field)lossy | Fully supported | |
| Title / Job function | Partner function field or custom field1:1 | Fully supported | |
| Email address | Partner email field1:1 | Fully supported | |
| Phone / mobile number | Partner phone and mobile fields1:1 | Fully supported | |
| Mailing address fields | Partner address fields1:1 | Fully supported | |
| SICCODE | Custom Partner field sic_code__clossy | Fully supported | |
| Company size / employee count | Custom Partner field company_size__clossy | Fully supported | |
| Credit rating | Custom Partner field credit_rating__clossy | Fully supported | |
| Country / geographic coverage | Partner country_id field1:1 | 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.
ContactDB gotchas
No public API requires manual CSV export
No engagement or lifecycle data to migrate
Segment membership is not a first-class object
Data freshness depends on purchase tier
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
CSV export and source data review
The customer downloads the full ContactDB export package from their portal account and shares it with FlitStack AI. We ingest the CSV, count total rows, identify column headers, and assess data quality across email completeness, company name consistency, and segment field population. We produce a source data audit report listing row counts, missing-field rates, and the unique value counts per segment category. This report is the basis for the segment confirmation step.
Segment inventory and tag strategy confirmation
We run a unique-value analysis across all ContactDB segment columns (industry, profession, title, country, software usage) and present a segment inventory document to the customer's admin. The admin selects which segment categories to preserve as Odoo Partner tags, which to drop, and which to convert into custom fields. This confirmation gates the Odoo schema design step and prevents tag clutter in the destination CRM.
Odoo schema configuration
We configure the Odoo CRM environment before any data loads. This includes creating custom Partner fields (sic_code__c, company_size__c, credit_rating__c, employee_count__c, original_title__c, original_phone__c), creating Partner tags for the confirmed segment categories, and configuring country and state records for all geographic markets present in the export. If the customer chooses Lead-based entry, we configure the crm.lead model with a Lead to Partner conversion mapping that preserves the custom fields on converted records.
Data transformation and deduplication
We transform the flat ContactDB CSV into Odoo-compatible import format. This includes splitting each flat row into a company-level Partner record and an individual contact-level Partner record with the parent_id relationship set, normalizing phone numbers to E.164 format, validating email addresses and flagging malformed records, deriving country ISO codes from country names, and running deduplication by company name and email domain. Deduplicated records are merged with a merge log kept for customer review.
Partner import and parent-child relationship resolution
We load Partner records into Odoo in two passes: first pass creates all company-level Partners (company_type = 'company') using company name as the dedupe key, second pass creates all individual contacts (company_type = 'person') linked via parent_id to the matching company Partner. We use Odoo's XML-RPC API with batch chunking and exponential backoff on rate-limit responses. Each pass produces a row-count reconciliation report confirming record counts match the source export.
Cutover, validation, and post-migration handoff
The customer ceases writing new records to ContactDB and confirms the final export package. We run a delta import for any records added or modified after the initial export date. We deliver a final validation report with record counts by object, sample record spot-checks, and a segment coverage summary showing how many contacts received each tag category. We provide a written Odoo automation checklist covering recommended workflow triggers for new contact onboarding, lead assignment rules, and email integration setup. We do not configure Odoo automations as part of the migration scope; this checklist supports the customer's admin team or an Odoo implementation partner.
Platform deep dives
ContactDB
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Moderate CRM migration. 2 of 8 objects need a manual workaround.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across ContactDB and Odoo CRM.
Object compatibility
2 of 8 objects need a manual workaround.
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
ContactDB: Not applicable — no live API surface..
Data volume sensitivity
ContactDB 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 ContactDB to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your ContactDB 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 ContactDB
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.