How to connect Odoo with HubSpot
HubSpot and Odoo connected: from won deal to sales order, with the status back in the CRM.
By Juan Cantón Rodríguez · Updated
Implementation time · 7-15 business days
The problem
Sales closes in HubSpot and operations executes in Odoo, but between the two there is a manual jump: someone recreates the customer and order in the ERP, contacts get duplicated or drift out of sync, and when the customer asks about their order the rep does not know whether it shipped or was paid without bothering another department. Data that should be one lives in two places and never quite matches.
ProposalThe solution
We connect HubSpot to Odoo so a won deal becomes a sales order and customer in the ERP, contacts sync between both, and order and payment status flows back to the CRM so sales can see it without leaving HubSpot. We lean on Odoo being open source and modular: we integrate with the modules you already run (CRM, Sales, Accounting) via the external API (XML-RPC/JSON-RPC) or a custom module, respecting your business rules.
What we automate
- Every won HubSpot deal creates the customer and sales order in Odoo with its lines.
- Contacts synced between HubSpot and Odoo, with deduplication rules and one shared truth.
- Order status (picking, shipping) flows back to HubSpot for sales to see.
- Payment and invoicing status from Odoo is reflected on the deal record.
- Property and custom-field mapping between CRM and ERP to fit your process.
- Idempotency: HubSpot webhook retries never duplicate customers or orders.
Typical use cases
Profiles where the Odoo ↔ HubSpot integration usually fits and what changes with it. Illustrative examples, not specific clients.
B2B selling in HubSpot and executing in Odoo
Before: Every won deal was recreated by hand as an order in the ERP, with delays and errors.
After: The won deal creates customer and order in Odoo instantly, with no re-keying.
Sales team blind to order status
Before: Reps had to ask operations whether an order had shipped or been paid.
After: Order and payment status flows back to HubSpot and sales answers the customer on their own.
Company with duplicate contacts across CRM and ERP
Before: The same customers lived twice in HubSpot and Odoo and never matched.
After: Contacts synced and deduplicated; one single truth across both systems.
What changes exactly
Without the integration
- The won deal recreated by hand as an order in Odoo.
- Duplicate, out-of-sync contacts between CRM and ERP.
- Sales asking operations about every order.
- Data that should be one living in two places.
With the integration
- From won deal to sales order in Odoo, automatic.
- Contacts synced and deduplicated by email and by tax ID or domain.
- Order and payment status back in HubSpot.
- One shared truth between sales and operations.
How we build it
We integrate via Odoo's external API (XML-RPC/JSON-RPC) or a custom module depending on the case, with an idempotent queue processing HubSpot webhooks and calling the HubSpot API to push statuses back. We map deals, contacts and properties to your real Odoo modules and respect your existing rules instead of imposing a closed connector.
What connectors exist for Odoo and HubSpot?
Every option out there, not just ours. If an off-the-shelf app covers your case, use it: we would rather tell you here than on a call.
HubSpot Data Sync (certified Odoo app)
Built by HubSpot itself and free. It syncs contacts, companies, products and activities one way or both ways, maps Odoo leads to contacts and opportunities to deals, and ships with default field mappings. If all you need is for sales to see the same customers and opportunities in HubSpot as in Odoo, this is probably enough and you do not need us.
Where it falls short: It does not touch sales orders or invoices, so turning a won deal into an Odoo order, or pushing payment status back to HubSpot, is out of scope. Custom field mappings require Data Hub Starter or above. HubSpot lists it for cloud Odoo, version 10 or later, and it connects through the Odoo API: check it against your edition and plan first.
Third-party modules on Odoo Apps (echoBitz, Zehntech, Cybrosys, Bac Ha and others)
They install inside Odoo and talk straight to the HubSpot API. The fuller ones sync contacts, companies and deals against opportunities in both directions, and a few also cover quotations (sale.order), products and users.
Where it falls short: They cannot be installed on Odoo Online, only on Odoo.sh or your own server. Each one lists its own supported Odoo versions and dependencies (some need Accounting and Sales installed, or custom properties created in HubSpot), and most ship under the proprietary OPL-1 license. Check coverage and upkeep for your version before you buy.
Zapier, Make or n8n
Simple no-code flows: an Odoo lead that creates a HubSpot contact, an opportunity updated when it changes stage. The n8n Odoo node handles contacts, opportunities, notes and any other model through its custom resource option.
Where it falls short: Their Odoo modules cover a narrow set of operations (on Zapier, the Odoo CRM app centres on leads and contact lookup), so orders or invoices mean falling back to raw API calls. No duplicate or loop control unless you build it, and they still rely on Odoo's external API.
Custom integration
Built on Odoo's external API (JSON-2 from Odoo 19, XML-RPC/JSON-RPC on earlier versions) and the HubSpot API, with an idempotent queue and rate-limit handling. It is the route when a won deal has to become a sales order with its lines, when delivery and payment status must flow back to the deal, or when your sales process does not fit the default mapping.
What breaks when you connect Odoo and HubSpot
The failures that actually show up, usually weeks after the integration was signed off.
- 01
No API on Odoo Online Standard
Odoo only opens the external API on the Custom plan (and on Odoo.sh or self-hosted), and third-party modules with Python code cannot be installed on Odoo Online. On Odoo Online with the Standard plan, none of the options above works as is. Check this first, before picking a connector.
- 02
Companies and people are modelled differently
In Odoo, companies and people share one model (res.partner), with each person sitting under their company. In HubSpot they are separate objects linked by associations. If the mapping ignores that hierarchy you get people with no company, companies duplicated as contacts, or associations that get lost in one direction.
- 03
HubSpot does not dedupe companies created via API
HubSpot dedupes contacts by email and companies by domain, but companies created through the API, sync apps included, are not deduplicated by domain. If the integration does not search before it creates, every sync run can leave another copy of the same company. Odoo is no better: nothing stops it by default.
- 04
A deal is not an order
A HubSpot deal maps to an Odoo opportunity (crm.lead), not to a sales order. The order, with its products, prices and taxes, is a separate object (sale.order). You have to decide at which stage the order is created, where its lines come from and what happens if the deal is reopened afterwards.
- 05
Owners and salespeople
A HubSpot owner and an Odoo salesperson are users in two different systems. Unless they are mapped one to one (usually by email), records arrive unassigned or get assigned to the integration user, and per-rep reports stop adding up.
- 06
Loops in two-way sync
If Odoo updates HubSpot and that change triggers another update back into Odoo, the record bounces forever or changes overwrite each other. You need to decide which system owns each field and tag the integration's own writes so they are ignored on the way back.
- 07
HubSpot API limits
A private app has a cap per 10 seconds and a daily cap per account, lower on Free and Starter than on Professional and Enterprise. The initial backfill is where you hit them: if the integration does not honour 429 responses and retry with backoff, records get dropped along the way.
- 08
Webhooks that never land
HubSpot retries a failed webhook up to 10 times over 24 hours and then gives up. If your endpoint takes longer than 5 seconds or is down for more than a day, that change never reaches Odoo. Acknowledge fast, queue the work, and run a periodic reconciliation to catch whatever is missing.
- 09
Consent and marketing contacts
Syncing your whole Odoo customer base into HubSpot does not make those people fair game for campaigns. Odoo opt-outs and its blacklist have to travel with them. On top of that, HubSpot sets contacts coming in through an integration as non-marketing by default, and switching them to marketing changes what you pay.
Frequently asked questions
Odoo Online (SaaS), Community or Enterprise?
We work with all three. Self-hosted Community and Enterprise give us more room (custom modules); with Odoo Online we use the external API, which Odoo only opens on the Custom plan. We adapt to your edition.
When is the order created in Odoo?
Usually when the deal moves to won, but we tie it to whichever pipeline stage you choose so it fits your sales process.
Does it push order and payment status back to HubSpot?
Yes. Odoo's picking, shipping, invoicing and payment status is reflected on the deal record, so sales can answer the customer without leaving the CRM.
How does it avoid duplicate contacts?
We match by email or by an identifier you define, and apply deduplication rules so a contact is one single record across both systems.
Related integrations
Xero + Shopify
Shopify orders, refunds and payouts synced to Xero, reconciled and with no duplicates.
See integrationEcommerceOdoo + Shopify
Shopify and Odoo in sync: orders, stock and invoicing in your open-source ERP, tailored.
See integrationPaymentsXero + Stripe
Stripe payments, refunds and payouts pushed to Xero and grouped so the bank matches.
See integrationShall we talk about your HubSpot integration?
A 30-minute call, no strings. You leave with scope and a price.