CRM migration
Field-level mapping, validation, and rollback between CentraHub CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
CentraHub CRM
Source
Odoo CRM
Destination
Compatibility
9 of 13
objects map 1:1 between CentraHub CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from CentraHub CRM to Odoo CRM is a migration shaped by the absence of a public API on the source side. CentraHub has no documented REST endpoint for third-party access, so we work with its per-module CSV export, reconstruct record relationships from ID columns, and push into Odoo via its XMLRPC and JSON-RPC API endpoints. The core object model maps cleanly — CentraHub Accounts become Odoo Partners, Deals become Odoo CRM Leads, and Contacts attach to the Partner record via address roles — but pipeline stages, custom fields, and activity history require careful transformation work before insert. We do not migrate CentraHub Workflows, automations, or reports as code; we deliver a written inventory of every automation for the customer's admin to rebuild in Odoo Studio or with an Odoo partner. The 5-user minimum on every paid CentraHub tier also makes it a poor fit for small teams, which is a common trigger for this migration path.
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 CentraHub 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.
CentraHub CRM
Lead
Odoo CRM
crm.lead (type: lead)
1:1CentraHub Leads map directly to Odoo crm.lead records with type=lead. Lead source, status, owner assignment, and any lead-score custom fields migrate as fields on crm.lead. The Odoo lead create date is set to the original CentraHub creation timestamp. We resolve the owner by email lookup against Odoo res.users and flag any owner without a matching user in the reconciliation queue.
CentraHub CRM
Account
Odoo CRM
res.partner (company type)
1:1CentraHub Accounts map to Odoo res.partner records with is_company=True. The Account ID from CentraHub is preserved in a custom field centrahub_id__c on the Odoo partner record for audit traceability. Account is created before any Contact import so that the parent_partner_id lookup is satisfied at Contact insert time.
CentraHub CRM
Contact
Odoo CRM
res.partner (individual)
1:1CentraHub Contacts map to Odoo res.partner records with is_company=False, linked to their parent Account via parent_id pointing to the Odoo res.partner created from the CentraHub Account. Contact name, email, phone, job title, and address fields map directly. We resolve the parent Account reference by matching the CentraHub account_id against the centrahub_id__c custom field we set on import.
CentraHub CRM
Deal
Odoo CRM
crm.lead (type: opportunity)
1:1CentraHub Deals map to Odoo crm.lead records with type=opportunity. The deal amount becomes crm.lead.planned_revenue, the close date becomes date_deadline, and the deal name becomes the Odoo lead name. We link each opportunity to its primary contact (res.partner) via partner_id and to its owning team via team_id resolved from the CentraHub pipeline assignment.
CentraHub CRM
Pipeline and Deal Stages
Odoo CRM
crm.team + crm.stage
lossyEach CentraHub deal pipeline maps to a separate Odoo crm.team (sales team), and the CentraHub stage names map to Odoo crm.stage records scoped to that team via team_id. Probability percentages from CentraHub stage settings migrate to stage sequence order and probability. If CentraHub has a single pipeline, we create one crm.team and map all stages within it.
CentraHub CRM
Task
Odoo CRM
project.task (standalone)
1:1CentraHub standalone Tasks map to Odoo project.task records created in a dedicated migration project (not attached to a sales opportunity). Task title, due date (date_deadline), priority, and status map directly. Custom task types and priority values are mapped via a value translation table built during scoping. Tasks linked to specific Accounts or Contacts in CentraHub carry the Odoo partner_id reference resolved via centrahub_id__c lookup.
CentraHub CRM
Appointment
Odoo CRM
calendar.event
1:1CentraHub Appointments map to Odoo calendar.event records. Start datetime, end datetime, location, and description migrate directly. We normalize all timestamps to UTC before insert and flag any appointment with a start time more than 24 hours in the past that would fall outside Odoo's default calendar window. Attendee resolution links calendar.attendee records to Odoo res.partner records via email match.
CentraHub CRM
Activity (Call, Email, Note)
Odoo CRM
mail.message
1:1CentraHub Activity records (calls, emails, notes) map to Odoo mail.message records with message_type set to email, phonecall, or comment respectively. The message body and timestamp migrate directly. We resolve the message's res_id and model using the CentraHub record type and ID: contacts and accounts resolve to res.partner, leads and deals resolve to crm.lead. Activity history is reconstructed by inserting mail.message in chronological order and verifying the chatter thread count matches the source record count.
CentraHub CRM
Custom Fields
Odoo CRM
Custom Fields on res.partner and crm.lead
lossyCentraHub per-module custom fields (text, number, picklist, date, phone, email, website) map to Odoo custom fields created via Settings > Technical > Database Structure > Fields before migration begins. We extract the full CentraHub custom field schema per module during discovery, map each to an Odoo field type (char, float, selection, date, char, char, char respectively), and create the fields in Odoo before any data import. CentraHub's loose type enforcement means we validate all custom field values against the declared type and flag any record with a mismatched value before writing to Odoo.
CentraHub CRM
Tag
Odoo CRM
crm.tag (via crm.lead.tag_ids)
1:1CentraHub tags applied across objects migrate to Odoo crm.tag records (for lead/opportunity tags) or a custom tag field on res.partner for contact-level tags. We extract the full tag taxonomy from CentraHub, create matching tags in Odoo, and map tag applications via tag_ids on crm.lead or a custom partner_tags field on res.partner. Tags with no exact Odoo equivalent are held for the customer to resolve during acceptance testing.
CentraHub CRM
Attachment
Odoo CRM
ir.attachment
1:1CentraHub attachments are accessed via the CentraHub-Dropbox and CentraHub-Box pre-built connectors, which store files externally rather than inside the CentraHub database. We download attachment files to temporary storage, map each to its parent Odoo record (res.partner or crm.lead) via the Odoo ir.attachment API, and re-attach them post-import. Any attachment with no accessible URL (connector not active, file deleted from cloud storage) is logged with the CentraHub record reference for manual retrieval.
CentraHub CRM
Email Campaign
Odoo CRM
Not migrated (read-only inventory provided)
lossyCentraHub email campaign records with historical send, open, and click data are exported as a structured JSON read-only inventory. Active campaign state (scheduled sends, active sequences, cadence rules) cannot migrate because Odoo Email Marketing requires reconfiguration of templates, audiences, and send schedules. We deliver a written campaign inventory listing every CentraHub campaign, its target audience segment, and its send history for the customer's admin to rebuild in Odoo Email Marketing or a dedicated platform.
CentraHub CRM
Workflow
Odoo CRM
Not migrated (written inventory provided)
lossyCentraHub Workflows are stored as structured JSON with field-ID references (not field names), which break silently if any mapped field is renamed during migration. We export all workflow definitions as structured JSON during discovery and deliver them as a written inventory: trigger type, condition fields, condition operators, and actions. The customer's admin rebuilds these in Odoo Automated Actions (server actions triggered by on_create, on_write, or on_cron) or Odoo Studio workflows post-migration. This is outside standard migration scope.
| CentraHub CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Lead | crm.lead (type: lead)1:1 | Fully supported | |
| Account | res.partner (company type)1:1 | Fully supported | |
| Contact | res.partner (individual)1:1 | Fully supported | |
| Deal | crm.lead (type: opportunity)1:1 | Fully supported | |
| Pipeline and Deal Stages | crm.team + crm.stagelossy | Fully supported | |
| Task | project.task (standalone)1:1 | Fully supported | |
| Appointment | calendar.event1:1 | Fully supported | |
| Activity (Call, Email, Note) | mail.message1:1 | Fully supported | |
| Custom Fields | Custom Fields on res.partner and crm.leadlossy | Mapping required | |
| Tag | crm.tag (via crm.lead.tag_ids)1:1 | Fully supported | |
| Attachment | ir.attachment1:1 | Fully supported | |
| Email Campaign | Not migrated (read-only inventory provided)lossy | Fully supported | |
| Workflow | Not migrated (written inventory provided)lossy | 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.
CentraHub CRM gotchas
Five-user minimum applies to every paid tier
Workflows reference field IDs, not field names
No documented public API for bulk exports
Rebrand to Focus Softnet causes support and documentation drift
Custom field data type enforcement is loose on import
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 CentraHub data export
We request full per-module CSV exports from the customer's CentraHub instance: Leads, Accounts, Contacts, Deals, Tasks, Activities, and Custom Fields. We supplement with direct database reads where the Centra Hosted edition permits access. We verify the customer's account branding (CentraHub vs Focus Softnet) and adjust our runbook accordingly. The discovery output is a written data inventory: record counts per object, custom field schema per module, workflow definition JSON, tag taxonomy, and any known attachment URLs from active Dropbox or Box connectors.
Odoo schema setup and pipeline configuration
We provision the Odoo CRM schema before any data moves. This includes creating custom fields on res.partner and crm.lead to match the CentraHub custom field schema, creating crm.team records (one per CentraHub pipeline), creating crm.stage records within each team with sequence and probability values mapped from CentraHub stage settings, and adding a centrahub_id__c custom field on res.partner and crm.lead for cross-system record tracing. We configure the Odoo database in a staging environment first for validation before production setup.
Relationship resolution and parent-record migration
We resolve record dependencies in the correct order: CentraHub Accounts first (to res.partner with is_company=True, capturing the new Odoo partner ID mapped to the original CentraHub account ID), then Contacts (to res.partner with is_company=False, with parent_id pointing to the Odoo partner from the Account), then Leads (to crm.lead type=lead), then Deals (to crm.lead type=opportunity with team_id and stage_id resolved from the pipeline configuration). Each phase emits a reconciliation count comparing exported CentraHub record totals against inserted Odoo record totals.
Activity migration via XMLRPC with parent resolution
We extract all CentraHub activity records (calls, emails, notes, appointments), resolve each record's parent Odoo ID and model from the CentraHub ID mapping built in phase 3, and insert mail.message records in chronological order via Odoo XMLRPC. Calls insert with message_type=phonecall, emails with message_type=email, and notes with message_type=comment. We flag any activity with a parent ID not found in the Odoo database (orphaned activities) and deliver a separate orphan activity report for the customer's admin to review.
Tag, attachment, and campaign inventory migration
We migrate tags via crm.tag creation and application, mapping tag values to the Odoo tag taxonomy with a value map for any non-matching tags. We download accessible attachment files from Dropbox or Box (where connectors are active), map them to Odoo ir.attachment records via XMLRPC, and re-attach to the correct parent record. Email campaigns are not migrated as active state; we deliver a written campaign inventory document listing every CentraHub campaign, its audience segment criteria, send history, and open/click data for the admin to rebuild in Odoo Email Marketing.
Cutover, delta sync, and workflow handoff
We freeze CentraHub writes during the cutover window, run a delta migration of any records modified or created during the migration period, then confirm Odoo as the system of record. We deliver the CentraHub Workflow JSON inventory and a recommended Odoo Automated Action mapping for each workflow trigger type. We support a one-week hypercare window for reconciliation issues raised by the customer's team. We do not rebuild CentraHub workflows as Odoo Automated Actions inside the standard migration scope; that work is documented for the customer's admin or an Odoo partner.
Platform deep dives
CentraHub CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 CentraHub CRM and Odoo CRM.
Object compatibility
2 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
CentraHub CRM: Not publicly documented.
Data volume sensitivity
CentraHub 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 CentraHub CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your CentraHub 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 CentraHub 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.