CRM migration

Migrate from ContactDB to Odoo CRM

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

ContactDB logo

ContactDB

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

50%

6 of 12

objects map 1:1 between ContactDB and Odoo CRM.

Complexity

CModerate

Timeline

1-2 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

ContactDB logo

ContactDB

What's pushing teams away

  • Lists become stale quickly as personnel change roles and companies shift; re-purchasing updated lists creates ongoing cost without accumulating owned CRM data.
  • No ownership or tracking of engagement data means teams lose visibility into which contacts responded, creating disconnected feedback loops between outreach and CRM records.
  • Limited post-purchase support and data enrichment options make it difficult to extend or verify contact records beyond the initial purchase fields.
  • Subscription costs scale with list volume and refresh frequency, making it expensive to maintain current data across multiple campaigns and regions simultaneously.

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

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)

maps to

Odoo CRM

Partner (res.partner)

1:many
Fully supported

ContactDB 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)

maps to

Odoo CRM

Lead (crm.lead)

lossy
Fully supported

If 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)

maps to

Odoo CRM

Partner (company record)

1:1
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner tags (mail.message.subtype or custom field)

lossy
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner function field or custom field

1:1
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner email field

1:1
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner phone and mobile fields

1:1
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner address fields

1:1
Fully supported

ContactDB 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

maps to

Odoo CRM

Custom Partner field sic_code__c

lossy
Fully supported

SICCODE 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

maps to

Odoo CRM

Custom Partner field company_size__c

lossy
Fully supported

ContactDB 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

maps to

Odoo CRM

Custom Partner field credit_rating__c

lossy
Fully supported

ContactDB 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

maps to

Odoo CRM

Partner country_id field

1:1
Fully supported

ContactDB 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.

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.

ContactDB logo

ContactDB gotchas

High

No public API requires manual CSV export

High

No engagement or lifecycle data to migrate

Medium

Segment membership is not a first-class object

Medium

Data freshness depends on purchase tier

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

  • ContactDB has no API: CSV export is the only extraction path

    ContactDB does not publish a REST or bulk API for programmatic data access. All data must be exported manually through the customer portal as a CSV or delimited file. The customer initiates the download, and the export is provided to FlitStack AI as a file ingest. Any future refresh cycles require the customer to repeat the manual download step. We document this dependency in the migration scope and recommend the customer export the full package before their ContactDB subscription renewal date to avoid access issues.

  • No engagement or activity data migrates; Odoo starts with blank timelines

    ContactDB is a purchased contact list database. It does not track email opens, clicks, call outcomes, meeting logs, or pipeline stages. When contacts land in Odoo CRM, the activity timeline is empty by default. We cannot migrate what does not exist. The customer's outreach tools (email sequencers, calling platforms) are the source of future engagement data, and we document the Odoo configuration steps for connecting email and call integrations post-migration.

  • Segment membership requires customer confirmation before import

    ContactDB segments contacts by industry, profession, title, country, and software usage, but these are not exported as standalone tag objects. We reconstruct segment membership as Odoo Partner tags, but the customer must confirm which segment categories carry business value post-migration. Importing all possible segment combinations creates tag clutter in Odoo. We provide a pre-import segment inventory document listing all unique segment values across the export, and the customer selects the categories to activate before we configure the custom field and tag schema.

  • Data freshness varies by ContactDB subscription tier

    ContactDB's Data Integrity Guarantee does not apply uniformly across all records at all times. Out-of-date records (person changed role, company rebranded, email bounced) may be present in the export. We apply a pre-import validation step that flags records with missing email formats, titles that do not match the ContactDB profession field, and company names that do not align with the ContactDB industry field. Flagged records are exported in a review CSV for customer inspection. We do not delete or modify records without explicit customer instruction.

  • Flat contact structure requires manual schema design for Lead vs Partner split

    ContactDB exports flat rows with no qualification status. Odoo CRM supports two entry models: crm.lead for unqualified prospects requiring follow-up before conversion, and res.partner for known contacts or companies. The customer must decide before migration whether all ContactDB contacts land as Leads (for sales reps to qualify through Odoo's pipeline) or directly as Partners (for teams that consider all purchased contacts sales-ready). We cannot infer qualification from ContactDB data because it carries no engagement or sales-readiness signals. This decision gates schema configuration and import sequencing.

Migration approach

Six steps for a successful ContactDB to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

ContactDB logo

ContactDB

Source

Strengths

  • Massive B2B contact database spanning 30M+ records with global country coverage.
  • Multiple segmentation axes: industry, profession, title, country, and business software usage.
  • Data Integrity Guarantee policy promises accuracy and updated records for campaign reliability.
  • Firmographic data includes SICCODE, company size, and credit rating for B2B targeting precision.

Weaknesses

  • No documented API for programmatic data export or integration with CRM platforms.
  • No engagement or activity data—purchased contacts carry no behavioral history.
  • List-based product model means data ownership remains with the vendor, not the buying team.
  • Limited ability to extend contact records with custom fields or internal annotations.
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?

Moderate CRM migration. 2 of 8 objects need a manual workaround.

C

Overall complexity

Moderate migration

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

  • Object compatibility

    C

    2 of 8 objects need a manual workaround.

  • 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

    ContactDB: Not applicable — no live API surface..

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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 consultation

Most ContactDB migrations land between one and two weeks for exports under 10,000 contacts with clean data and a confirmed segment strategy. Migrations over 50,000 contacts with overlapping list segments requiring deduplication, incomplete firmographic fields, or multiple geographic markets requiring country and state validation move to three to six weeks. The primary time driver is the segment confirmation step and the Odoo schema configuration, both of which require customer input before we can proceed.

Adjacent paths

Related migrations to explore

Ready when you are

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