CRM migration
Field-level mapping, validation, and rollback between Enrich-CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Enrich-CRM
Source
Odoo CRM
Destination
Compatibility
15 of 18
objects map 1:1 between Enrich-CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Enrich-CRM is an enrichment overlay that appends firmographic and contact data to CRM records inside HubSpot rather than a system-of-record you export directly from. The migration path runs from HubSpot as the data source, with Enrich-CRM's enriched field outputs preserved and re-platformed into Odoo CRM. We map enriched Company records to Odoo Partner (is_company=True), enriched Contact records to Odoo Partner (is_company=False with parent_id), and job change alerts to mail.message notes attached to the relevant contact Partner. Odoo's native lead enrichment (available via email address or phone) replaces the Enrich-CRM credit cycle, meaning the customer can re-enrich records natively inside Odoo without a separate subscription. Custom lead scoring models and segmentation rules built inside Enrich-CRM are not accessible via API and must be documented during scoping and rebuilt in Odoo using tags, priority fields, or Odoo Studio automations as a post-migration configuration task. We do not migrate Zapier, Make, or n8n automation paths as code; we deliver a written inventory of every enrichment-triggered automation for the customer's admin to rebuild in Odoo Studio.
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 Enrich-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.
Enrich-CRM
Enriched Company Profile
Odoo CRM
Partner (is_company=True)
1:1Enrich-CRM's enriched company records map to Odoo Partner with is_company=True. Firmographic fields (industry, employee count, revenue, tech stack, SIRENE data) migrate to Odoo partner standard fields or custom Char/Integer fields created during schema setup. The original HubSpot company ID and Enrich-CRM enrichment timestamp migrate as custom fields (x_hs_company_id__c, x_enrichment_date__c) to preserve audit trail. Odoo Partner Name maps from the Enrich-CRM company name field; if Enrich-CRM stores a domain, it maps to Partner website.
Enrich-CRM
Enriched Contact Profile
Odoo CRM
Partner (is_company=False, type=contact)
1:1Enrich-CRM's enriched contact records map to Odoo Partner with is_company=False and a parent_id pointing to the company Partner record created in the company mapping phase. Personal fields (name, email, phone, title, seniority, LinkedIn URL, location) map to Odoo standard partner fields (function, email, phone, website). Any Enrich-CRM-specific properties (seniority tier, enrichment confidence score) migrate as custom Char fields on the Partner. The HubSpot contact ID migrates as a custom field (x_hs_contact_id__c) for source tracking.
Enrich-CRM
Job Change Alert
Odoo CRM
mail.message (on Partner or crm.lead)
1:1Enrich-CRM job change alerts are not standard CRM records; they are enrichment signals attached to contacts. We capture each alert as a mail.message note attached to the relevant contact Partner record. The message body contains the old company, new company, old title, new title, and detection date sourced from the Enrich-CRM alert payload. A custom Partner field (x_job_change_date__c) stores the date so the customer's team can build Odoo Studio automations to act on recent job changes. This signal does not trigger Odoo native automations without manual rebuild in Odoo Studio.
Enrich-CRM
Scoring and Segmentation Rules
Odoo CRM
crm.tag or custom priority field
lossyEnrich-CRM custom lead scoring models and contact segments are not exportable via API. We document the scoring criteria (score thresholds, property conditions, segment names) during scoping from screen captures and customer interviews, then design an equivalent scoring model in Odoo using crm.tag records for segment labels and a custom integer field (x_enrichment_score__c) for numerical scores. The rebuild is a configuration task performed by the customer's Odoo admin after migration and is scoped separately from the data migration engagement.
Enrich-CRM
HubSpot Company
Odoo CRM
Partner (is_company=True)
1:1HubSpot Company records (the base records Enrich-CRM enriches) map to Odoo Partner with is_company=True. This is the parent record for enriched contacts. The HubSpot company domain maps to the Odoo Partner website field as a dedupe key. If the customer runs multiple pipelines in HubSpot, Odoo's crm.team (sales team) and stage configuration handles pipeline scoping without needing a separate Deal object for pipeline isolation.
Enrich-CRM
HubSpot Contact
Odoo CRM
Partner (is_company=False, type=contact)
1:1HubSpot Contact records map to Odoo Partner with is_company=False. The parent_id references the Partner record created from the corresponding HubSpot Company. Lifecycle Stage from HubSpot migrates as a custom Char field (x_hs_lifecycle_stage__c) on the Partner for audit and reporting. Any Enrich-CRM enrichment properties appended to the HubSpot Contact (seniority, job_change_detected, confidence_score) migrate as additional custom fields to the same Partner record.
Enrich-CRM
HubSpot Deal
Odoo CRM
crm.lead (type=opportunity)
1:1HubSpot Deal records map to Odoo crm.lead with type='opportunity'. The HubSpot dealstage property maps to an Odoo crm.stage value within the designated crm.team pipeline. Deal amount and currency migrate to Odoo's expected_revenue and currency_id fields. Odoo does not have a standalone Deal object separate from crm.lead; pipeline isolation is handled via crm.team and stage assignment rather than a separate deal entity.
Enrich-CRM
HubSpot Pipeline
Odoo CRM
crm.team + crm.stage
lossyHubSpot deal pipelines map to Odoo crm.team records (one per pipeline) with corresponding stage sequences (crm.stage records within each team). Each HubSpot pipeline name becomes the crm.team name. HubSpot deal stages map to crm.stage stage_name values with probability percentages preserved from HubSpot. This configuration is deployed into the Odoo Sandbox before any data import begins.
Enrich-CRM
HubSpot Owner
Odoo CRM
res.users
1:1HubSpot Owners are resolved by email match against Odoo res.users. Any HubSpot Owner without a matching Odoo User is held in a reconciliation queue for the customer's admin to provision the corresponding Odoo user before record import resumes. Active/inactive status on the Odoo User matches the active/inactive status of the original HubSpot owner to preserve team assignment and quota alignment.
Enrich-CRM
Engagement: Call
Odoo CRM
crm.phonecall (or calendar.event)
1:1HubSpot call engagements map to Odoo crm.phonecall if the crm_phone module is installed in the target Odoo instance; otherwise they map to calendar.event. The mapping preserves call direction, duration (call_duration in seconds), disposition, and the original HubSpot timestamp. The activity links to the migrated Partner record via the partner_id field on crm.phonecall or the related Partner on calendar.event.
Enrich-CRM
Engagement: Email
Odoo CRM
mail.message
1:1HubSpot email engagements (body content, subject, direction) map to Odoo mail.message records attached to the relevant Partner or crm.lead. Email direction (INBOUND/OUTBOUND) migrates as a custom Char field since Odoo mail.message does not have a native direction field. The original HubSpot engagement timestamp maps to mail.message.date for timeline ordering. Attachments migrate as ir.attachment records linked via mail.message.attachment_ids.
Enrich-CRM
Engagement: Meeting
Odoo CRM
calendar.event
1:1HubSpot meeting engagements map to Odoo calendar.event with start_datetime, stop_datetime, and location preserved. Attendee resolution maps the HubSpot contact and company IDs to the migrated Odoo Partner records. If the Odoo instance uses calendar.visibility='portal', meeting records are visible to portal contacts. Meeting notes from the HubSpot engagement body migrate as mail.message content attached to the calendar.event.
Enrich-CRM
Engagement: Note
Odoo CRM
mail.message
1:1HubSpot engagement notes (engagement type NOTE) map to Odoo mail.message records attached to the relevant Partner or crm.lead. The note body migrates as plain text in mail.message.body. Author resolution matches the HubSpot hubspot_owner_id to the migrated Odoo res.users record by email and sets mail.message.author_id accordingly. Rich text formatting from HubSpot notes is simplified to plain text since Odoo mail.message body rendering differs from HubSpot's.
Enrich-CRM
Engagement: Task
Odoo CRM
project.task
1:1HubSpot task engagements map to Odoo project.task records. Task status, priority, and due date migrate to project.task status, priority, and date_deadline respectively. The task subject maps to project.task name. If the customer does not use Odoo Project, tasks can alternatively map to crm.lead activity records (mail.activity), in which case we configure the mapping to crm.lead during scoping. Task assignment resolves hubspot_owner_id to Odoo res.users via the owner lookup table.
Enrich-CRM
HubSpot Ticket
Odoo CRM
crm.lead (type=lead)
1:1HubSpot Ticket records (Service Hub, if applicable) map to Odoo crm.lead with type='lead'. The HubSpot ticket pipeline maps to a separate crm.team distinct from the sales opportunity team, and ticket stages map to crm.stage values within that team. Ticket priority migrates to crm.lead priority. Ticket conversations migrate as mail.message records attached to the crm.lead. If Odoo Helpdesk module is installed, we scope a separate migration path to helpdesk.ticket instead.
Enrich-CRM
HubSpot Product
Odoo CRM
product.product + product.template
1:1HubSpot Products map to Odoo product.product records linked to a product.template record for naming and pricing. HubSpot SKU (hs_sku) maps to product.product.default_code. Standard Price Book entries from HubSpot map to Odoo product.pricelist.item records. If HubSpot Quoting is in use, Odoo Sale Orders replace the quoting workflow post-migration.
Enrich-CRM
HubSpot Line Item
Odoo CRM
sale.order.line
1:1HubSpot Line Items map to Odoo sale.order.line records attached to a sale.order that corresponds to the HubSpot Deal. We resolve the product.product reference, price unit, quantity, and discount from the HubSpot line item during migration. The parent sale.order is created from the migrated HubSpot Deal record with partner_id resolved to the Odoo Account (Partner) mapped from the HubSpot Company.
Enrich-CRM
HubSpot Tag
Odoo CRM
crm.tag
lossyHubSpot contact and company tags map to Odoo crm.tag records applied to the corresponding Partner or crm.lead via the tag_ids many2many field. We create the crm.tag records during schema setup, then apply them during data load. If the customer has more than 50 distinct tag values, we recommend using a custom Char field (x_segment_tags__c) as a comma-separated value rather than individual crm.tag records, to avoid tag proliferation in Odoo.
| Enrich-CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Enriched Company Profile | Partner (is_company=True)1:1 | Fully supported | |
| Enriched Contact Profile | Partner (is_company=False, type=contact)1:1 | Fully supported | |
| Job Change Alert | mail.message (on Partner or crm.lead)1:1 | Fully supported | |
| Scoring and Segmentation Rules | crm.tag or custom priority fieldlossy | Mapping required | |
| HubSpot Company | Partner (is_company=True)1:1 | Fully supported | |
| HubSpot Contact | Partner (is_company=False, type=contact)1:1 | Fully supported | |
| HubSpot Deal | crm.lead (type=opportunity)1:1 | Fully supported | |
| HubSpot Pipeline | crm.team + crm.stagelossy | Fully supported | |
| HubSpot Owner | res.users1:1 | Fully supported | |
| Engagement: Call | crm.phonecall (or calendar.event)1:1 | Fully supported | |
| Engagement: Email | mail.message1:1 | Fully supported | |
| Engagement: Meeting | calendar.event1:1 | Fully supported | |
| Engagement: Note | mail.message1:1 | Fully supported | |
| Engagement: Task | project.task1:1 | Fully supported | |
| HubSpot Ticket | crm.lead (type=lead)1:1 | Fully supported | |
| HubSpot Product | product.product + product.template1:1 | Fully supported | |
| HubSpot Line Item | sale.order.line1:1 | Fully supported | |
| HubSpot Tag | crm.taglossy | 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.
Enrich-CRM gotchas
Credits expire monthly with no rollover
Enrichment outputs are not a standalone CRM export
Scoring logic does not transfer via API
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 enrichment audit
We audit the source HubSpot portal to identify all enriched Company and Contact records, their associated Enrich-CRM enrichment properties (firmographic fields, seniority, job-change flags, confidence scores), Deal structures and pipeline assignments, engagement history volume by type, active Zapier/Make/n8n automations triggered by enrichment signals, and any custom scoring or segmentation logic configured inside Enrich-CRM. We pair this with a review of the target Odoo instance: which CRM modules are installed (crm, phonecall, helpdesk), the existing Partner and crm.lead schema, and the crm.team and stage configuration. The discovery output is a written migration scope defining record counts, enrichment field inventory, and scoring rebuild requirements.
HubSpot data extraction and enrichment field extraction
We export the full HubSpot record set from the connected HubSpot portal: all Contact, Company, Deal, Engagement, Product, and Line Item records via the HubSpot API. We capture every Enrich-CRM enrichment property as an explicit data column in the export, including any custom fields Enrich-CRM wrote back to HubSpot via its API integration. We also capture job change alert events as standalone records with contact_id, old_company, new_company, detection_date, and alert_type fields. The extraction runs in batches of 1,000 records with the HubSpot API using v3 endpoints and the Associations API for relationship data. Engagement history is extracted last as the highest-volume dataset.
Odoo schema configuration
We configure the target Odoo schema before any data import. This includes creating custom fields on the Partner model (x_enrichment_date__c, x_hs_company_id__c, x_hs_contact_id__c, x_hs_lifecycle_stage__c, x_enrichment_score__c) and on the crm.lead model (x_hs_deal_id__c, x_deal_amount__c, x_deal_currency__c) to store the enrichment metadata and HubSpot IDs. We also create crm.team records for each HubSpot pipeline, create the corresponding crm.stage sequences within each team, and create crm.tag records for each distinct HubSpot tag value. Schema configuration is deployed to a Sandbox org first for validation before production migration begins.
Data migration in dependency order
We run the production migration in strict record-dependency order: crm.team and stage configuration (deployed via Odoo data import), then Partner records for companies (is_company=True, from HubSpot Company) with HubSpot company ID stored in the custom field, then Partner records for contacts (is_company=False with parent_id resolved to the company Partner) with enrichment properties and HubSpot contact ID stored in custom fields. After Partners, we migrate crm.lead records for Deals and Tickets, then Product and Line Item data. Engagement history (calls, emails, meetings, notes, tasks) migrates last using Odoo's XML-RPC batch interface with 200-record chunk sizes. Each phase emits a row-count reconciliation report before the next phase begins.
Scoring rebuild specification and automation inventory
We deliver two written documents alongside the migration. The Scoring Rebuild Specification documents every Enrich-CRM scoring model and segmentation rule identified during scoping, with the field conditions, score thresholds, and recommended Odoo equivalent (crm.tag labels, x_enrichment_score__c thresholds, Odoo Studio record-triggered automations). The Automation Inventory documents every Zapier, Make, or n8n path triggered by Enrich-CRM enrichment events, with trigger source, action steps, and recommended Odoo Studio equivalent. Both documents are handoff materials for the customer's Odoo admin; rebuilding scoring and automations is a post-migration configuration task scoped separately.
Validation, cutover, and post-migration handoff
We reconcile record counts between HubSpot and Odoo for every object: Partners (companies and contacts), crm.lead (Deals and Tickets), and engagement records by type. We spot-check 25-50 records per object type for field-level accuracy, verifying that enrichment properties landed in the correct Odoo custom fields and that parent_id relationships on contact Partners are correct. We run a final delta migration of any HubSpot records modified during the migration window, then enable Odoo CRM as the system of record. We support a one-week hypercare window for reconciliation issues. We do not rebuild Enrich-CRM scoring logic or Odoo Studio automations within the migration scope; those are separate engagements.
Platform deep dives
Enrich-CRM
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Enrich-CRM and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Enrich-CRM and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Enrich-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
Enrich-CRM: Not publicly documented.
Data volume sensitivity
Enrich-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 Enrich-CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Enrich-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 Enrich-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.