CRM migration
Field-level mapping, validation, and rollback between Odoo Marketing Automation and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.
Odoo Marketing Automation
Source
HubSpot
Destination
Compatibility
12 of 13
objects map 1:1 between Odoo Marketing Automation and HubSpot.
Complexity
BStandard
Timeline
2–3 days
Overview
Odoo Marketing Automation operates as one module within the broader Odoo ERP suite, where CRM contacts, leads, and opportunities share a unified object model with marketing campaigns and activity logs. HubSpot splits these into its own CRM object model: contacts with lifecycle_stage properties, companies, and deals with per-pipeline stages. The migration carries everything Odoo stores natively — contacts, companies, opportunities, activity history, campaign membership records, and custom fields — into HubSpot's object graph. HubSpot has no equivalent to Odoo's marketing automation workflows, email templates, or campaign activity traces; those must be rebuilt in HubSpot's workflow builder using FlitStack's exported definitions as a reference guide. We use Odoo's XML-RPC external API (available on the Custom plan at 1 request/second) and HubSpot's CRM API (5 requests/second) to extract and land the data, sequencing imports so foreign-key relationships resolve correctly before deals land against resolved contact and company records. Our migration methodology ensures referential integrity by loading parent records before children, mapping Odoo's unified object structure to HubSpot's segmented schema while preserving all business-relevant data relationships and historical context.
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 Odoo Marketing Automation object lands in HubSpot, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo Marketing Automation
res.partner (Contact type)
HubSpot
Contact
1:1Odoo partners of type 'contact' map directly to HubSpot contacts. The email address is the primary key for de-duplication and owner resolution. Unmatched emails are flagged before migration so your team can clean up duplicates in Odoo before the export runs.
Odoo Marketing Automation
res.partner (Lead type)
HubSpot
Lead / Contact
1:manyOdoo leads that have not converted to opportunities land as HubSpot contacts with lifecycle_stage set to 'lead'. Odoo leads that have converted to opportunities land with lifecycle_stage set to 'customer' since the Odoo opportunity record implies a won or active deal.
Odoo Marketing Automation
crm.lead (Opportunity)
HubSpot
Deal
1:1Odoo opportunities map to HubSpot deals. The deal name, amount, expected close date, and stage are migrated directly. Pipeline and stage names require value-by-value mapping since Odoo stage names are free-text while HubSpot stage names are scoped per pipeline. We preserve the Odoo stage sequence and probability weights to maintain reporting continuity in your HubSpot dashboards.
Odoo Marketing Automation
crm.lead.team
HubSpot
HubSpot team / Sales team
1:1Odoo sales teams map to HubSpot sales teams. If your Odoo instance uses team-based assignments, those resolve to HubSpot team ownership on deals. Teams must be created in HubSpot before migration or records land without a team association. This ensures proper deal ownership distribution across your sales organization after cutover.
Odoo Marketing Automation
crm.stage
HubSpot
Deal pipeline stage
1:1Odoo CRM stages map to HubSpot deal stage values. Each Odoo stage receives a corresponding HubSpot stage within the mapped pipeline. Probability values, forecast categories, and stage-entered timestamps are preserved as HubSpot deal properties for reporting continuity. The mapping ensures your pipeline analytics reflect the same stage progression as your original Odoo setup.
Odoo Marketing Automation
crm.lead (Lead status field)
HubSpot
Contact lifecycle_stage property
1:1Odoo lead status values (new, assigned, qualified, lost, won) map to HubSpot lifecycle_stage values. HubSpot's default lifecycle stages (subscriber through evangelist) are used; Odoo-specific stage labels are mapped to the closest HubSpot equivalent or stored as a custom property for reference.
Odoo Marketing Automation
res.partner (Company type)
HubSpot
Company
1:1Odoo company-type partners map to HubSpot companies. Company name, domain, industry, employee count, and annual revenue migrate directly. HubSpot requires at least one contact to associate with a company — contacts without a primary company in Odoo are attached to a default placeholder company in HubSpot.
Odoo Marketing Automation
marketing.marketing (Campaign)
HubSpot
Campaign
1:1Odoo marketing campaigns map to HubSpot campaigns. Campaign name, description, and state are migrated. HubSpot campaign membership (which contacts enrolled in which campaign) is preserved as a custom contact property, since HubSpot campaigns track UTM source attribution rather than workflow enrollment history.
Odoo Marketing Automation
marketing.trace.emails / marketing.trace.sms
HubSpot
Engagement / Timeline notes
1:1Odoo marketing activity traces (email opens, clicks, bounces, SMS sends) migrate as HubSpot engagement records or timeline notes on the associated contact. Original activity timestamps and campaign attribution are preserved. Note that HubSpot's engagement model differs from Odoo's trace model — the mapping preserves the fact of the interaction rather than the full trace record.
Odoo Marketing Automation
mail.message / mail.activity
HubSpot
Engagement / Timeline
1:1Odoo email history and logged activities map to HubSpot engagements. Calls, emails, meetings, and notes on Odoo contacts and opportunities become HubSpot engagements on the equivalent contact or deal record. Original timestamps, subjects, and owner assignments are preserved to maintain complete activity history in your HubSpot timeline.
Odoo Marketing Automation
ir.attachment
HubSpot
Files
1:1Odoo file attachments linked to CRM records are downloaded and re-uploaded to HubSpot's file manager. Original filenames and URLs are preserved. File size limits apply — HubSpot's file upload limit is 250 MB per file. Inline images in Odoo notes are extracted and re-hosted in HubSpot's content delivery system.
Odoo Marketing Automation
Custom Odoo models (x_*)
HubSpot
Custom properties / custom objects (Enterprise)
1:1Odoo custom fields and custom models defined via Studio or ir.model.fields migrate as HubSpot custom properties on the standard objects (for simple custom fields) or as HubSpot custom objects (for complex models, available on Enterprise tier). N:N relationships between custom models in Odoo require HubSpot junction objects or associations.
Odoo Marketing Automation
marketing.automation.activity
HubSpot
No equivalent (workflow rebuild required)
1:1Odoo marketing automation activities (workflow triggers, conditions, actions) have no HubSpot equivalent and do not migrate. We export the workflow definitions as structured documentation so your HubSpot admin can rebuild them in HubSpot's workflow builder using the original Odoo logic as a reference.
| Odoo Marketing Automation | HubSpot | Compatibility | |
|---|---|---|---|
| res.partner (Contact type) | Contact1:1 | Fully supported | |
| res.partner (Lead type) | Lead / Contact1:many | Fully supported | |
| crm.lead (Opportunity) | Deal1:1 | Fully supported | |
| crm.lead.team | HubSpot team / Sales team1:1 | Fully supported | |
| crm.stage | Deal pipeline stage1:1 | Fully supported | |
| crm.lead (Lead status field) | Contact lifecycle_stage property1:1 | Fully supported | |
| res.partner (Company type) | Company1:1 | Fully supported | |
| marketing.marketing (Campaign) | Campaign1:1 | Fully supported | |
| marketing.trace.emails / marketing.trace.sms | Engagement / Timeline notes1:1 | Fully supported | |
| mail.message / mail.activity | Engagement / Timeline1:1 | Fully supported | |
| ir.attachment | Files1:1 | Fully supported | |
| Custom Odoo models (x_*) | Custom properties / custom objects (Enterprise)1:1 | Fully supported | |
| marketing.automation.activity | No equivalent (workflow rebuild required)1: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.
Odoo Marketing Automation gotchas
External API access is gated behind the Custom plan
Automation rules with Python server actions cannot replay on non-Odoo destinations
No native conversion tracking within Marketing Automation
Two dependent apps must both be installed for full feature access
HubSpot gotchas
Marketing Contacts billing model is migration-critical
Feature tier gating is not visible until onboarding
Mandatory onboarding fees inflate year-one cost
HubSpot CSV importer cannot migrate engagements or attachments
Custom objects require Enterprise and a pre-existing schema
Pair-specific challenges
Migration approach
Extract Odoo CRM and marketing data via XML-RPC API
We connect to Odoo's XML-RPC external API using your Custom-plan credentials and pull all CRM and marketing objects: res.partner (contacts and companies), crm.lead (leads and opportunities), crm.stage, mail.activity, mail.message, marketing.campaign, marketing.trace records, and ir.attachment for files. Custom models defined via ir.model.fields are enumerated separately. We validate record counts against Odoo's database counts and flag any objects that return zero records — those may indicate a module not installed or an access rights gap.
Configure HubSpot properties and custom objects before data lands
HubSpot's property schema must exist before data can be written. We create the custom lifecycle_stage__c property on contacts, campaign_membership__c for campaign enrollment history, original_create_date__c for create-date continuity, source_system_id__c for traceability, and any Odoo custom field equivalents identified in the audit. For Odoo custom models that require HubSpot custom objects (Enterprise tier), we create the custom object schema with its primary key and relationship properties before the migration run.
Resolve owners by email and sequence the import order
Odoo responsible users and sales team leaders are resolved to HubSpot users by email match. Unmatched owners are flagged with the Odoo user name and email so your team can create or invite those HubSpot users before the migration commits. We sequence the import so that company records land before contact records (contacts require a parent company_id), and contacts land before deal records (deals reference contacts via association). Odoo internal record IDs are preserved in HubSpot source_system_id__c fields for post-migration reconciliation.
Run sample migration with field-level diff
A representative slice of 100–500 records migrates first, covering contacts, companies, deals, and activities across multiple Odoo stages. We generate a field-level diff between the source Odoo payload and the landed HubSpot records, so you can verify lifecycle stage mapping, stage-value mapping, owner resolution, and company association before the full run commits. Any value-mapping errors in pick-list fields are corrected before the full migration executes.
Execute full migration with delta-pickup window
The full migration runs against HubSpot. A delta-pickup window of 24–48 hours captures any Odoo records created or modified during the cutover. Your team continues working in Odoo throughout. An audit log records every operation (read, write, update, skip, error) with timestamps and record IDs. If reconciliation finds discrepancies, one-click rollback reverts the HubSpot instance to its pre-migration state so the run can be corrected and re-executed.
Platform deep dives
Odoo Marketing Automation
Source
Strengths
Weaknesses
HubSpot
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 Odoo Marketing Automation and HubSpot.
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
Odoo Marketing Automation: Not publicly documented by Odoo.
Data volume sensitivity
Odoo Marketing Automation 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 Odoo Marketing Automation to HubSpot migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Marketing Automation to HubSpot migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo Marketing Automation
Other ways to arrive at HubSpot
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.