CRM migration
Field-level mapping, validation, and rollback between CompanyHub CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
CompanyHub CRM
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between CompanyHub CRM and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from CompanyHub CRM to Odoo CRM is a migration from a purpose-built SMB sales CRM into a modular ERP with a CRM module. CompanyHub organizes data around Contacts, Companies, Deals with drag-and-drop pipelines, and Custom Tables for domain-specific objects; Odoo uses crm.lead for both Leads and Opportunities, res.partner for Contacts and Companies, and project.task for tasks. We resolve the structural split: CompanyHub Deals map to Odoo crm.lead with type=opportunity, CompanyHub Companies map to res.partner with address_type=contact, and CompanyHub Contacts attach as contact_id on the partner record. Custom Tables require pre-provisioning of Odoo custom fields or a custom module before row migration. UTrons automation flowcharts, email automation sequences, and reporting dashboards do not migrate; we deliver a written inventory of each requiring rebuild in Odoo's Action Automations and Studio reporting.
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 CompanyHub 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.
CompanyHub CRM
Contact
Odoo CRM
res.partner
1:1CompanyHub Contacts map to Odoo res.partner records with partner_type set to contact. The CompanyHub Contact's linked Company becomes the partner's parent_id, establishing the hierarchical relationship Odoo uses for address and billing grouping. Custom fields on the Contact transfer to custom res.partner fields, which we provision before import. Email, phone, title, and address fields map by API name. We use the partner's email as the dedupe key to prevent duplicate creation on re-runs.
CompanyHub CRM
Company
Odoo CRM
res.partner
1:1CompanyHub Companies map to Odoo res.partner with partner_type set to company. The company record is created before any linked Contact import so that the parent_id relationship is satisfied at Contact insert time. CompanyHub's company domain and industry fields map to website and industry_id respectively. Custom fields on the Company transfer to the company-type partner record. If both a Company and Contact share the same name during migration, we create a single partner record and attach the contact as a child.
CompanyHub CRM
Deal
Odoo CRM
crm.lead (type=opportunity)
1:1CompanyHub Deals map to Odoo crm.lead with type set to opportunity. The Deal's pipeline stage maps to a crm.stage that we configure in Odoo before migration. Deal amount transfers to planned_revenue, expected_revenue, and probability fields. The Deal's linked Contact becomes the lead's partner_id contact_id reference, and the linked Company becomes the partner_id. Closed-won and closed-lost status from CompanyHub sets the lead stage to won or lost and the active flag to False.
CompanyHub CRM
Pipeline Stage
Odoo CRM
crm.stage
lossyCompanyHub pipeline stages are user-defined text values. We capture the full stage list during discovery and provision matching crm.stage records in Odoo in the same sequence order. Each stage gets the same sequence number, and probability values map to stage_default_probability on each crm.stage. If the customer has multiple pipelines in CompanyHub, we create separate stage categories in Odoo or use tags to distinguish pipeline membership since Odoo's standard CRM does not support multiple named pipelines without custom development.
CompanyHub CRM
Task
Odoo CRM
project.task
1:1CompanyHub Tasks map to Odoo project.task records. The task's linked Contact and Deal become the task's partner_id and project_id references. Due date, priority, and assigned user transfer to date_deadline, priority, and user_ids respectively. Tasks created by UTrons are included in the migration but the triggering automation logic does not transfer. We note the Utron that created each task in a custom description field for the admin to review during post-migration rebuild.
CompanyHub CRM
Custom Table
Odoo CRM
Custom fields or custom.res.model
lossyCompanyHub Custom Tables (domain-specific objects like Properties, Courses, Payments) require pre-provisioning in Odoo. We request the customer provide Custom Table field layouts during discovery because the CompanyHub API does not expose table schemas programmatically in all cases. For simple tables (5-10 fields, no lookups to other objects), we provision custom fields on the relevant Odoo model (res.partner, crm.lead) using Odoo Studio. For complex tables with cross-object relationships, we create a custom Odoo model via a module that we provision alongside the migration data.
CompanyHub CRM
Custom Fields (on Contacts, Companies, Deals)
Odoo CRM
Custom fields on res.partner and crm.lead
lossyCompanyHub custom fields on standard objects map to Odoo custom fields on res.partner and crm.lead. We read the field definitions from the CompanyHub API (field name, type, options) and create matching fields in Odoo via Studio before import. Picklist options in CompanyHub become selection fields or relational fields in Odoo depending on whether the options represent a fixed set or references to other records.
CompanyHub CRM
Quote
Odoo CRM
sale.order
1:1CompanyHub Quotes map to Odoo sale.order records. Line items transfer to sale.order.line with product_id resolved by SKU match, quantity, and price. Quote totals and tax calculations are preserved. The linked Deal becomes the sale.order's opportunity_id. Signed quote PDFs and attachments migrate as ir.attachment records linked to the sale.order. Quote templates from CompanyHub do not migrate; we document the template structure for the customer to rebuild in Odoo's sale.quote template system.
CompanyHub CRM
Owner
Odoo CRM
res.users
1:1CompanyHub users (owners) map to Odoo res.users. We match by email address. Any CompanyHub Owner without a matching Odoo User goes into a reconciliation queue for the customer's admin to provision before record import resumes. Active and inactive status transfers from CompanyHub to Odoo. Owner-level field visibility rules in CompanyHub do not transfer; Odoo's record rules are configured post-migration based on the customer's access requirements.
CompanyHub CRM
Activities: Emails
Odoo CRM
mail.message
1:1CompanyHub email activity records map to Odoo mail.message with message_type=email. The linked Contact or Deal becomes the res_id and model reference on the message. Email body content migrates as the message body; we note that CompanyHub may truncate email content in API responses, and we flag any records with missing body text in the reconciliation report. Open tracking metadata transfers to mail.message tracking values if the destination Odoo instance has the email tracking addon enabled.
CompanyHub CRM
Activities: Notes
Odoo CRM
mail.message
1:1CompanyHub Notes map to Odoo mail.message with message_type=comment. The note body becomes the message body, and the linked Contact or Deal becomes the res_id reference. Notes created by UTrons retain a reference in the message body indicating the automation that generated them.
CompanyHub CRM
Users/Owners (field-level visibility)
Odoo CRM
res.users and record rules
lossyCompanyHub field-level and record-level visibility settings (Enterprise tier) do not migrate programmatically. We document the visibility matrix during discovery and provide a written specification for Odoo record rules and field groups to configure post-migration. The customer's Odoo admin applies these rules based on the organizational structure.
| CompanyHub CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Deal | crm.lead (type=opportunity)1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| Custom Table | Custom fields or custom.res.modellossy | Fully supported | |
| Custom Fields (on Contacts, Companies, Deals) | Custom fields on res.partner and crm.leadlossy | Fully supported | |
| Quote | sale.order1:1 | Fully supported | |
| Owner | res.users1:1 | Fully supported | |
| Activities: Emails | mail.message1:1 | Fully supported | |
| Activities: Notes | mail.message1:1 | Fully supported | |
| Users/Owners (field-level visibility) | res.users and record ruleslossy | 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.
CompanyHub CRM gotchas
Admin-only export gate blocks non-admin migration scoping
Custom Table schema is not self-describing in the API
UTrons workflow logic does not survive migration
API key cap of 5 limits concurrent migration jobs
Email body content may be truncated in activity API responses
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 Custom Table documentation
We audit the source CompanyHub account across pricing tier, custom fields on all standard objects, Custom Table list with row counts, UTrons automation list with trigger-action summaries, pipeline stage list, user list, and activity volume estimates. We specifically request the customer provide Custom Table schema documentation because the CompanyHub API does not export it. The discovery output is a written migration scope with record counts per object, a Custom Table layout form for the customer to complete, and a Utrons inventory form capturing each automation for rebuild documentation.
Destination schema provisioning in Odoo
We configure the Odoo CRM module before any data arrives. This includes creating crm.stage records matching the CompanyHub pipeline stages in sequence order, provisioning custom fields on res.partner and crm.lead via Odoo Studio, and creating custom Odoo models for complex Custom Tables that cannot be represented as custom fields alone. We deploy schema changes into the customer's Odoo environment (Online or Odoo.sh) and confirm the fields appear correctly before proceeding. This step prevents import errors caused by missing destination fields.
Owner reconciliation and user provisioning
We extract every distinct CompanyHub Owner referenced on Contact, Company, Deal, and Task record and match by email against the Odoo destination's res.users table. Owners without a matching Odoo User go to a reconciliation queue. The customer's Odoo admin provisions any missing Users before record import begins. This step is required because OwnerId references are mandatory on crm.lead and project.task records in Odoo. We do not create Odoo Users on behalf of the customer; that requires admin-level access the customer controls.
Sandbox migration and reconciliation
We run a full migration into an Odoo staging environment using production-like data volume. The customer reconciles record counts (Contacts in, Companies in, Deals in, Tasks in, Custom Table rows in), spot-checks 20-40 random records against the CompanyHub source, and signs off the schema and mapping before production migration begins. Any field mapping corrections, custom field additions, or stage name adjustments happen here. Odoo.sh customers use a duplicate database as staging; Odoo Online customers use a demo company environment.
Production migration in dependency order
We run production migration in record-dependency order: res.partner (companies first), res.partner (contacts with parent_id resolved to company partner), crm.lead (opportunities with partner_id and user_id resolved), project.task (tasks with partner_id and user_id resolved), mail.message (email and note history linked to the correct res_id and model), sale.order (quotes linked to opportunity_id), and Custom Table rows (linked to their parent object). Each phase emits a row-count reconciliation report before the next phase begins. We use Odoo's XML-RPC or JSON-RPC API with rate-limit handling and batch chunking for large record sets.
Cutover, validation, and automation rebuild handoff
We freeze CompanyHub writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo as the system of record. We deliver the Utrons inventory document specifying each automation's trigger, conditions, and actions mapped to Odoo Automated Actions equivalents. We deliver the Custom Table schema summary for the customer to review against the provisioned Odoo fields. We support a one-week hypercare window for reconciliation issues. We do not rebuild Utrons as Odoo automations inside the migration scope; that is a separate engagement.
Platform deep dives
CompanyHub CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between CompanyHub CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across CompanyHub CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between CompanyHub CRM 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
CompanyHub CRM: Not publicly documented.
Data volume sensitivity
CompanyHub 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 CompanyHub CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your CompanyHub 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 CompanyHub 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.