CRM migration

Migrate from HubSpot to Odoo CRM

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

HubSpot logo

HubSpot

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

65%

11 of 17

objects map 1:1 between HubSpot and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Try the reverse

Odoo CRM
HubSpot

Overview

What this migration involves

Moving from HubSpot Sales Hub to Odoo CRM is an architectural shift from a marketing-first CRM with separate engagement tools to an ERP-embedded CRM where sales, accounting, inventory, and operations share a single database. HubSpot separates Contacts and Companies as distinct objects with a many-to-many relationship; Odoo merges these into a single Contact record with an optional company field and partner_id field that represents both the person and the organization. We extract Contacts and Companies from HubSpot, merge them on domain or name, and land them as Odoo Contacts with the appropriate partner_category and company_type set. HubSpot Deals map to Odoo CRM Opportunities plus calendar.Events for stage-change milestones. Activity history (calls, emails, meetings, tasks) migrates as chatters and mail.message records threaded to the correct res.partner record. We do not migrate HubSpot Workflows or Sequences as Odoo Server Actions or Automations because the trigger models differ; we deliver a written inventory of every automation requiring rebuild. Odoo custom objects are available through developer-defined models rather than a self-serve UI, so any HubSpot Enterprise custom objects require Odoo developer scoping before migration begins.

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

HubSpot logo

HubSpot

What's pushing teams away

  • Feature tier surprises drive churn — sequences, calling, quoting, and advanced automation are locked behind Professional at $100/seat, causing sticker shock when teams outgrow Starter.
  • Workflow configuration complexity increases at scale — multiple reviewers on Capterra and G2 note that HubSpot experts or significant admin time are required to maintain advanced automation.
  • Cost scales linearly with seats and marketing contacts, creating large bills for teams that grow quickly or inherit high contact counts from a previous CRM.
  • Frequent product updates and UI changes force ongoing re-training — Reddit reviewers in r/hubspot cite difficulty keeping up with constant new features and interface shifts.
  • Multi-brand, multi-region, and complex permission structures expose friction that Enterprise pricing cannot fully resolve, according to RevOps feedback in HubSpot community discussions.

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

Each row shows how a HubSpot 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.

HubSpot

Contact

maps to

Odoo CRM

res.partner (company_type = 'contact')

many:1
Fully supported

HubSpot Contacts with a Company association merge into the corresponding Odoo res.partner record with company_type='contact' and parent_id pointing to the merged Company partner. Contacts without a company association create standalone res.partner records. The HubSpot email address becomes the res.partner email field and the dedupe key. We use HubSpot's associatedCompany property to resolve the parent_id at migration time. Lifecycle Stage from HubSpot migrates as a res.partner category or customChar field for audit purposes.

HubSpot

Company

maps to

Odoo CRM

res.partner (company_type = 'company')

1:1
Fully supported

HubSpot Companies map to Odoo res.partner with company_type='company'. The HubSpot company domain becomes the website field. Company properties (industry, annual revenue, number of employees) map to custom fields on res.partner that we define before migration. Company is created before any Contact import so that parent_id references are satisfied at the moment of Contact insert.

HubSpot

Deal

maps to

Odoo CRM

crm.lead (type = 'opportunity')

1:1
Fully supported

HubSpot Deals map to Odoo crm.lead records with type='opportunity'. The HubSpot dealstage maps to Odoo crm.stage via a stage name lookup we configure before migration. Closed-Lost and Closed-Won dates from HubSpot become Odoo lost_reason and won_date fields. Probability percentage from HubSpot maps to Odoo's stage_id probability or a manual probability field if the stage probabilities do not align.

HubSpot

Deal Stage

maps to

Odoo CRM

crm.stage

lossy
Fully supported

Each HubSpot pipeline stage becomes an Odoo crm.stage record within the appropriate crm.team. We configure stage names, sequence order, and probability percentages. If HubSpot has multiple pipelines, we map them to separate Odoo crm.team records with their own stage sequences.

HubSpot

Pipeline

maps to

Odoo CRM

crm.team

lossy
Fully supported

HubSpot's multiple deal pipelines (up to 15 on Professional, 100 on Enterprise) map to separate Odoo crm.team records, each with its own stage sequence. Odoo supports unlimited teams at all tiers, removing the pipeline ceiling that HubSpot enforces at lower tiers.

HubSpot

Lead (Sales Hub Enterprise)

maps to

Odoo CRM

crm.lead (type = 'lead')

1:1
Fully supported

HubSpot Lead records (Enterprise-only, introduced 2023) map to Odoo crm.lead with type='lead'. The HubSpot lead_status maps to the Odoo crm.stage for leads. Lead score and any custom lead properties migrate as custom fields on crm.lead.

HubSpot

Product

maps to

Odoo CRM

product.product

1:1
Fully supported

HubSpot Products map to Odoo product.product records with the product type (goods, service) set from HubSpot product type. The HubSpot SKU becomes the Odoo default_code. Product descriptions and URLs migrate as product.description and product.website descriptions respectively.

HubSpot

Line Item

maps to

Odoo CRM

sale.order.line

1:1
Fully supported

HubSpot Line Items attached to Deals map to Odoo sale.order.line records. We create a draft sale.order attached to the migrated crm.lead opportunity and populate line items with product_id, product_uom_qty, price_unit, and discount. If the Odoo Sale module is not active, line items attach to crm.lead as custom fields instead.

HubSpot

Owner

maps to

Odoo CRM

res.users

1:1
Fully supported

HubSpot Owners map to Odoo res.users by email match. Any HubSpot Owner without a matching Odoo User is placed in a reconciliation queue for the customer's admin to provision before record import resumes. Inactive HubSpot owners map to Odoo inactive users so that deal and contact assignment history is preserved.

HubSpot

Engagement: Email

maps to

Odoo CRM

mail.message (chatter)

1:1
Fully supported

HubSpot email engagements migrate to Odoo mail.message records attached to the res.partner record via model='res.partner' and res_id pointing to the partner id. Email body and subject migrate as mail.message body. The HubSpot timestamp becomes mail.message.date for chronological ordering in the Odoo chatter.

HubSpot

Engagement: Call

maps to

Odoo CRM

mail.message (subtype = call)

1:1
Fully supported

HubSpot call engagements map to Odoo mail.message records with a custom call subtype. Call duration, disposition, and recording URL migrate as custom fields on the mail.message. We set mail.message.date to the original HubSpot timestamp for timeline ordering.

HubSpot

Engagement: Meeting

maps to

Odoo CRM

calendar.event

1:1
Fully supported

HubSpot meeting engagements map to Odoo calendar.event records. Start datetime, stop datetime, location, and attendee list migrate. Attendees resolve to res.partner records via email match and are added as calendar.event partner_ids. The HubSpot meeting title becomes the calendar.event name.

HubSpot

Engagement: Note

maps to

Odoo CRM

mail.message

1:1
Fully supported

HubSpot Notes (engagement type NOTE) migrate as Odoo mail.message records attached to the parent res.partner or crm.lead record. The note body migrates as plain text. Attachments on HubSpot notes migrate as Odoo ir.attachment records linked via res_model='res.partner' or 'crm.lead' and res_id pointing to the parent.

HubSpot

Engagement: Task

maps to

Odoo CRM

project.task or mail.message

lossy
Fully supported

HubSpot Task engagements map to Odoo project.task if the Odoo Project module is active and the customer uses project tracking. Otherwise tasks migrate as mail.message records with a task subtype. Status, priority, and due date migrate directly. HubSpot owner assignment resolves to res.users via email match.

HubSpot

Ticket

maps to

Odoo CRM

helpdesk.ticket

1:1
Fully supported

HubSpot Tickets migrate to Odoo helpdesk.ticket if the Helpdesk module is active. Ticket pipeline stages map to helpdesk.stage, and ticket properties migrate as custom fields on helpdesk.ticket. If Helpdesk is not active, tickets migrate to crm.lead with a ticket-type tag for manual triage.

HubSpot

Custom Object

maps to

Odoo CRM

ir.model (developer-defined)

lossy
Fully supported

HubSpot custom objects (Enterprise-only) require Odoo developer scoping before migration. We create the ir.model definition and the corresponding database table via Odoo developer tools or a Python migration script before importing records. Custom object fields map to ir.model.fields with the appropriate ttype (char, many2one, selection, etc.). This step must complete before any custom object records are migrated and may extend the timeline by 2-4 weeks for complex schemas.

HubSpot

Tag (custom property)

maps to

Odoo CRM

res.partner.category or custom field

lossy
Fully supported

HubSpot tags stored as multi-checkbox contact properties migrate to Odoo res.partner.category (tags) applied to the res.partner record. If the customer has used tags as structured data rather than loose labels, we map them to a custom field (char, selection, or many2many) chosen during scoping. The customer determines the tag strategy before migration.

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.

HubSpot logo

HubSpot gotchas

High

Marketing Contacts billing model is migration-critical

High

Feature tier gating is not visible until onboarding

Medium

Mandatory onboarding fees inflate year-one cost

Medium

HubSpot CSV importer cannot migrate engagements or attachments

Medium

Custom objects require Enterprise and a pre-existing schema

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

  • HubSpot custom objects require Odoo developer scoping

    HubSpot Enterprise custom objects have no self-serve equivalent in Odoo. Odoo's custom object model (ir.model) requires developer-level access to create, and the fields must be defined through Odoo Studio or Python code before records can be imported. Migrations with HubSpot Enterprise custom objects add 2-4 weeks of developer scoping and schema setup before any data movement begins. We flag this at scoping and scope it as a separate developer engagement if Odoo Studio is insufficient for the schema complexity.

  • HubSpot Workflows and Sequences do not migrate to Odoo Server Actions

    HubSpot property-triggered Workflows and Professional-gated Sequences have a different trigger model from Odoo Server Actions and Automated Actions. HubSpot Workflows react to property value changes on a record; Odoo Server Actions react to ir.cron scheduled events or ir.actions.server record-triggered events with different condition syntax. We do not migrate them as code. We deliver a written inventory of every active HubSpot Workflow and Sequence with its trigger, conditions, actions, and a recommended Odoo Server Action equivalent. The customer's Odoo admin or a certified Odoo partner rebuilds them post-migration.

  • HubSpot's marketing contact billing flag has no Odoo equivalent

    HubSpot's Marketing Contacts billing model (a flag that determines whether a contact is counted against the marketing-priced contact tier) has no direct Odoo equivalent because Odoo does not have a contact-based billing model. All migrated contacts land as standard Odoo res.partner records without a billing-tier flag. We preserve the HubSpot marketing contact status in a customChar field on res.partner for audit and reporting so that if the customer later evaluates marketing automation tools, the segmentation is preserved.

  • HubSpot's native CSV importer limits apply on the source side only

    HubSpot's CSV importer cannot move calls, emails, meetings, tasks, or file attachments. We use the HubSpot CRM API for these objects, respecting the token-bucket rate limits (100-200 req/10sec burst, 4 req/sec on search endpoint) with exponential backoff and jitter. For accounts with large engagement histories (over 300,000 activity records), this extraction phase can take 5-10 business days on its own. We scope the API extraction separately and include estimated extraction time in the project plan.

  • Odoo self-hosted deployments require additional migration scoping

    If the destination is an Odoo self-hosted (on-premises) deployment rather than Odoo Online (SaaS), the migration involves additional steps: database provisioning, server access and credentials, SSL certificate setup, email domain configuration, and an outgoing mail server (SMTP) configuration. We scope these as part of the discovery phase and include server setup verification in the pre-migration checklist. Migrations to Odoo Online (SaaS) are more straightforward but still require Odoo partner account setup and module installation on the target database.

Migration approach

Six steps for a successful HubSpot to Odoo CRM data migration

  1. Discovery and HubSpot tier audit

    We audit the source HubSpot portal across tier (Starter/Professional/Enterprise), custom properties, custom objects, pipeline count, active sequences, active workflows, and engagement volume. We identify all HubSpot objects with data (Contacts, Companies, Deals, Leads, Products, Tickets, Engagements) and estimate record counts per object. We pair this with an Odoo readiness check: which Odoo apps are active in the target database (CRM, Sale, Project, Helpdesk), which Odoo tier the target is on (Community/Standard/Custom), and whether the target is Odoo Online or self-hosted. The discovery output is a written migration scope, record count estimate, and an Odoo module activation plan.

  2. Schema design and Odoo field mapping

    We design the destination schema in Odoo. This includes activating the required modules (CRM, Sale, possibly Project and Helpdesk), creating custom fields on res.partner and crm.lead to capture HubSpot properties that have no direct Odoo equivalent, configuring crm.team records to match HubSpot pipelines, configuring crm.stage records with probability percentages aligned to HubSpot dealstage values, and defining any custom ir.model records for HubSpot custom objects. Custom fields are created via Odoo Studio or developer access before any data import.

  3. Contact-Company merge logic and data cleaning

    We extract HubSpot Contacts and Companies in parallel, build a domain-to-partner lookup table for the Company merge, and apply the merge logic: Contacts with an associated Company get company_type='contact' with parent_id pointing to the merged res.partner; Contacts without an association create standalone res.partner records. We clean data in transit: duplicate email addresses, missing required fields (name, email), and invalid formats for fields that Odoo validates (email format, phone format). The cleaned output is a set of CSVs ready for Odoo XML-RPC import.

  4. Owner reconciliation and user provisioning

    We extract every distinct HubSpot Owner referenced on Contact, Company, Deal, and Engagement records and match by email against the Odoo target database's res.users table. Owners without a matching user go to a reconciliation queue for the customer's Odoo admin to provision. Inactive HubSpot owners map to inactive Odoo users so that historical assignment is preserved even if the original rep is no longer active. Migration cannot proceed past this step because partner and opportunity assignment depends on resolved user records.

  5. Production migration in dependency order

    We run production migration in record-dependency order: res.partner (Companies first, then Contacts), crm.lead (Opportunities from Deals, Leads from HubSpot Leads), product.product (Products), sale.order.line (Line Items from Deals), mail.message (Activity history via XML-RPC in batches of 500-1000 records), calendar.event (Meetings), ir.attachment (File attachments), helpdesk.ticket (Tickets if Helpdesk is active), and custom object records (last, after ir.model schema is confirmed). Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and automation rebuild handoff

    We freeze HubSpot writes during the cutover window, run a final delta migration of any records modified during the migration period, then enable Odoo as the system of record. We deliver the Workflow and Sequence inventory document to the customer's Odoo admin or certified Odoo partner. We support a one-week hypercare window where we resolve any reconciliation issues. We do not rebuild HubSpot Workflows as Odoo Server Actions inside the migration scope; that work is scoped as a separate engagement with an Odoo partner.

Platform deep dives

Context on both ends of the pair

HubSpot logo

HubSpot

Source

Strengths

  • Genuinely useful free CRM tier with no seat limit on contact records.
  • All-in-one sales engagement layer (sequences, email tracking, calling, dialer) embedded natively in the CRM, eliminating a separate integration.
  • Intuitive interface and fast onboarding for individual reps, per G2 and Capterra reviews.
  • Workflow automation triggers across contacts, deals, and tickets with a visual builder.
  • API coverage for all standard objects including custom objects at Enterprise tier.

Weaknesses

  • Pricing model is contact-based at the marketing layer — importing all records as marketing contacts can multiply the monthly bill by 4×.
  • Feature tier cliffs are frequent surprises: sequences, calling, advanced reporting, and quoting are all gated, often requiring plan upgrades mid-implementation.
  • Mandatory onboarding fees at Professional ($1,500) and Enterprise ($3,500) are not prominently disclosed on the pricing page.
  • API rate limits are restrictive for bulk migration — burst limits of 100-200 req/10sec and search endpoint limits of 4 req/sec require careful job queuing.
  • Custom objects, additional pipelines, and advanced forecasting are Enterprise-only, making cost projections difficult for growing teams.
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?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

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

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • 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

    HubSpot: 110 requests per 10 seconds per installed account for OAuth apps on the latest platform versions (2025.2 / 2026.03). Free accounts: 100 req/10s and 250,000 daily requests. Professional and Enterprise: 190 req/10s. The CRM Search API has a separate ceiling of 4 requests per second per auth token. 429 is returned on exhaust..

  • Data volume sensitivity

    A

    HubSpot exposes a bulk API — large-volume migrations stream efficiently.

Estimator

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

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

Can't find your answer?

Walk through your HubSpot to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between three and five weeks for accounts under 20,000 Contacts and 5,000 Deals with no custom objects. Migrations with HubSpot Enterprise custom objects, complex multi-pipeline Deal structures, large engagement histories (over 300,000 activity records), or Odoo self-hosted deployment move to eight to fourteen weeks because of developer schema scoping, API extraction time from HubSpot, and Odoo Server Action rebuild documentation. Odoo self-hosted deployments add 1-2 weeks for server provisioning and environment setup.

Adjacent paths

Related migrations to explore

Ready when you are

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