HubSpot + Odoo integration

Odoo keeps CRM, sales orders, invoicing and stock in one database. What HubSpot's own Odoo app syncs, where it stops, and what a keyed build adds.

Connects by API

Scope this integration Book a scoping call Estimate the cost

Is there an official Odoo + HubSpot integration?

Yes. HubSpot publishes an Odoo app, listed in the HubSpot App Marketplace as of September 2026, that syncs companies, contacts, leads, opportunities, products and activities one way or both. It stops short of sales orders and invoices, so reaching those takes a custom API integration over Odoo's external API, which we scope at 70 to 150 build hours.

Recommended route
Custom API integration
Build effort
70 to 150 hours
In the HubSpot App Marketplace?
Yes, Odoo by HubSpot
Typical elapsed time
4 to 8 weeks

Marketplace checked September 2026.

Why teams connect Odoo to HubSpot

Odoo is a suite of business apps sharing one database, and a company that runs it for quoting, sales orders, invoicing and stock may well have its CRM app switched on too. The teams that reach us have chosen HubSpot for marketing and the sales pipeline and kept Odoo for everything after the order. That split holds until a seller needs to know what a customer has ordered, whether the last invoice was paid, or whether an item is in stock, and none of it is in the portal.

Two things make Odoo different from most ERPs we connect. It already has a CRM, with leads, opportunities and a pipeline, so the first decision is which system owns the pipeline rather than how to move data. Running opportunities in both is how a business ends up with two forecasts. And the edition and the plan decide what is possible. Odoo Community is open source, Odoo Enterprise is licensed, and Odoo Online runs the same software on Odoo’s own infrastructure. On Odoo’s hosted plans, the external API comes only with the Custom plan.

HubSpot publishes an Odoo app of its own, and for a team whose question stops at companies, contacts and the pipeline, it is the cheapest answer. The request that needs a build is the one that crosses into orders and invoices: show open sales orders on the company, flag the customer with an overdue invoice, create the Odoo customer when a deal closes.

What syncs

Five objects carry most of the value, as the table lists. Odoo keeps companies and people in one contact model, and its external API tells them apart with a company flag, so the load splits one Odoo model into HubSpot companies and HubSpot contacts. Sales orders become deals, customer invoices land on a custom object associated to the order, and products become HubSpot products.

Every record keys on its Odoo id, held in a custom HubSpot property. Names are the wrong key here for a specific reason: HubSpot’s own data sync matches companies on name or domain, and it will pair two records that share a name even when their domains differ. Contacts are the exception, where email is the practical key and the Odoo id breaks ties between people who share an address.

Direction follows ownership. Odoo owns the order, the invoice and the product, so those move one way and stay read only in the portal. HubSpot owns the pipeline. The one write back worth building early is a closed won deal creating or updating the Odoo customer, and we hold even that behind a review step for the first month.

Objects that sync between Odoo and HubSpot
Source object HubSpot object Direction Match key Notes
Contact, company type Company Two way Odoo partner id held in a custom HubSpot property Odoo keeps companies and people in one contact model, told apart by a company flag.
Contact, individual type Contact Into HubSpot Email, with the Odoo partner id as the tie breaker
Sales order Deal Into HubSpot Odoo sales order id, with the order reference shown to sellers Orders are read only in the portal. Odoo stays the system of record.
Customer invoice Custom object Into HubSpot Odoo invoice id, associated to the sales order
Product Product Into HubSpot Odoo product id

Architecture

The shape is a polling watermark sync. Odoo stamps a write_date on every record of a model that keeps access log fields, which is the default, so a service can ask each model for the records changed since its last run. It reads with search_read, which searches and reads in one call and one transaction, and it keeps a watermark per model so a restart resumes rather than reloads.

On Odoo 19 and later the service calls the JSON-2 API: a POST to /json/2/ with the model and method in the path and an API key sent as a bearer token. The key belongs to a dedicated bot user, so its access rights limit what the integration can touch. Earlier versions use the XML-RPC object service, which takes the database, user id and password on every call.

Writes into HubSpot are batch upserts keyed on the Odoo id, then a separate association pass, so a replay changes nothing. Where speed matters, an Odoo automation rule can send a webhook notification when a record changes, and the service treats it as a prompt to read early rather than as the data itself. A reconciliation endpoint compares counts per model and reports the difference instead of correcting it quietly.

A sync service reads each Odoo model for records changed since its stored write_date watermark, upserts HubSpot records keyed on the Odoo id, then runs a separate association pass and a count reconciliation per model.

What the API allows

API style
REST
Authentication
API key
Webhooks
Yes
Changed-since filter
Yes
Sandbox
Yes
Rate limit
Not documented

Developer documentation odoo.com

Three ways to connect

What decides the route is how far past the CRM records you need to go. HubSpot’s Odoo app syncs companies, contacts, leads, opportunities, products and activities, one way or both, with default field mappings and a filter on any Odoo field or HubSpot list. The app itself is free, though it needs an Odoo subscription, custom field mappings need Data Hub Starter or above, and it does not carry sales orders or invoices.

Once orders and invoices are in scope, the choice is a custom API integration or an iPaaS, and both need Odoo’s external API, which on the hosted plans means the Custom plan. Connectors sold as modules on the Odoo Apps Store are a further option only away from Odoo Online, which Odoo documents as incompatible with Apps Store modules, so they need Odoo.sh or your own server.

  • Marketplace app

    Possible

    HubSpot's own Odoo app syncs companies, contacts, leads, opportunities, products and activities with no service to host, which is enough for a team that only needs the CRM records to agree.

  • iPaaS

    Avoid

    An iPaaS needs the same external API access as a build, which Odoo's hosted plans include only on the Custom plan, and it then bills per task on every order and invoice it moves.

What breaks and how we prevent it

Archived partners that vanish from reads

Odoo lets a user archive a record instead of deleting it, and an archived record, one whose active field is false, is invisible in most searches. A watermark read that does not ask for archived records never sees the archive happen, so the HubSpot company stays live. We read with archived records included and carry the active flag across as a status.

API keys capped at three months

Odoo 19’s documentation says an API key cannot be created to last more than three months, so an integration that runs for a year needs at least four keys. We generate the next key programmatically before the old one lapses, move the service onto it, then revoke the old key, which is the rotation order Odoo recommends.

The XML-RPC deadline in Odoo 22

Odoo has scheduled the XML-RPC and JSON-RPC endpoints for removal in Odoo 22, in fall 2028, and deprecated the services behind them. An integration written against /xmlrpc/2 today has a known end date. We build on JSON-2 where the database runs Odoo 19 or later, and put the RPC calls behind one adapter where it does not, so the move is a single change.

Rolling upgrades on Odoo Online

A database on an Odoo Online minor version must upgrade a few weeks after the next version ships, and minor versions usually arrive every two months, so fields and methods can change under a running sync. Odoo sends a notice before a mandatory upgrade, and we run the contract tests against a duplicate database when it lands, well before the deadline.

Our approach

  1. Scope. We settle which system owns the pipeline, which Odoo edition, version and plan the database runs, and whether HubSpot’s own app already covers the need.
  2. Architect. We fix the models, the Odoo id keys, the watermark per model, the archived record rule and the association order, and write them down.
  3. Build. The service is written against a duplicate database and a HubSpot sandbox, with a dedicated bot user and a portal allowlist from the first commit.
  4. Validate. We run a full reload, reconcile counts per model against Odoo, and walk the differences with whoever owns the ledger.
  5. Operate. Cutover is a key swap. After that we rotate keys before they expire, watch the run history, and retest after every Odoo upgrade notice.

Common questions

Does HubSpot's Odoo app sync sales orders and invoices?

No. HubSpot lists the app's default mappings as companies, contacts, leads, opportunities, products and custom activities, with Odoo leads landing as HubSpot contacts and opportunities as deals. Sales orders and invoices are not among them. Custom field mappings need Data Hub Starter or above, and they change the fields on those objects rather than adding new objects to the sync.

Which Odoo plan does a HubSpot integration need?

On Odoo's hosted service, the Custom plan. Odoo's documentation says access to data through the external API is only available on Custom pricing plans, not on One App Free or Standard. That rule covers a custom API integration and any iPaaS connector alike, because both call Odoo from outside. Odoo.sh and your own server are Custom plan options too.

How quickly does an Odoo change reach HubSpot?

With HubSpot's own app, records sync within 10 minutes of a change once the initial sync has finished, and HubSpot warns that a first sync of millions of records can take several days. With a custom API integration, the service reads changes on a schedule, hourly in a typical build, and an Odoo automation rule can post a webhook to start a read sooner.

What happens to an Odoo integration built on XML-RPC?

It has an end date. Odoo's documentation schedules the /xmlrpc, /xmlrpc/2 and /jsonrpc endpoints for removal in Odoo 22, in fall 2028, and marks the services behind them deprecated. Odoo 19 introduced the JSON-2 API as the replacement, authenticated with an API key sent as a bearer token. We build new work on JSON-2 wherever the database runs Odoo 19 or later.

Can two Odoo customers merge into one HubSpot company?

With name matching, yes. HubSpot's data sync matches companies on name or domain, and it pairs two records that share a company name even when their domains differ, and branches of one business can share a name in Odoo. A custom API integration keys every company on the Odoo partner id held in a HubSpot property, so each Odoo customer keeps its own company.

Can we test an Odoo integration without touching live data?

Yes. On Odoo Online the database manager can duplicate a database, and its For testing purposes option, on by default, disables external actions such as emails, payments and delivery orders. Duplicates expire after 15 days, with at most five per database. We build against a duplicate and a HubSpot sandbox, then cut over by swapping the key.

How long does an Odoo and HubSpot integration take?

Budget 10 to 20 hours of discovery and 70 to 150 hours of build for four to six objects, with a watermark per model and replay and reconciliation endpoints. Discovery settles which system owns the pipeline, because Odoo ships its own CRM app, and whether the database runs a plan and version that allow the JSON-2 API.

Partnerships and accreditations

  • HubSpot Elite Solutions Partner
  • HubSpot Custom Integration Accreditation
  • HubSpot CRM Data Migration Accreditation
  • HubSpot Solutions Architecture Design Accreditation

HubSpot accreditations

  • HubSpot Onboarding Accreditation
  • HubSpot Academy Accreditations

Industry specializations

  • HubSpot Healthcare Industry Specialist
  • HubSpot Financial Services Industry Specialist
  • HubSpot Manufacturing Industry Specialist
  • HubSpot Quote to Cash Capability

Partnerships

  • Anthropic Solutions Partner

Trust and compliance

We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.

How we build

  • Sandbox first. We build and test in a sandbox before anything reaches production.
  • Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
  • Least-privilege access. Each integration gets only the API scopes it needs.
  • Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
  • Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
  • A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.

Scope a Odoo integration

Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.

  • Odoo

Type any system and its version, such as Sage 300 or Sage 50. Press Enter or a comma after each one.

Add more detail (optional)

Optional. A sentence or two about the workflow is enough.

We use these answers to scope the work and for nothing else. Privacy policy.

Prefer to talk it through first? Book a technical scoping call

Talk to the people who build these

  • Nijat
  • Sean
  • Prash

Book a scoping call