A connector that pushes the product catalog and quotes from Odoo into HubSpot for sales analytics, and automatically sends the full deal package back from HubSpot into Odoo the moment a deal is won.
An integration project between HubSpot CRM and Odoo ERP, where the core requirement was reliable exchange of transactional data. The sales team works in HubSpot, while order operations and fulfillment are handled in Odoo. The goal was to combine both into a single managed flow — no manual duplication, no drift between systems.
Karl is the Commercial Director of a medical-equipment distribution company that works with clinics and private healthcare centers. Their deals typically include the main equipment, a set of accessories, consumables, and related items — installation, staff training, extended warranty.
Sales and client communication run in HubSpot through quotes, where the team builds commercial proposals with dozens of line items and negotiates final terms. Once a deal is won, the data has to move quickly and accurately into Odoo, where the deal is actually fulfilled — inventory operations, serial numbers, invoices, warranty documents. Before the integration, that handoff was manual: managers duplicated data, sometimes missed consumables or mixed up the final configuration, while the operations team spent time chasing clarifications instead of shipping.
Two-way exchange
HubSpot and Odoo use different entities and relationships, so companies, contacts, deals, and line items had to be mapped carefully without breaking data integrity.
Full deal package
The entire commercial package — items, commissions, taxes, discounts, total — had to land in Odoo without manual fixes after the sync.
Sync stability
The integration had to run without creating duplicates, with logging, retries, and diagnostics anyone on the team could read.
Automation on status change
The critical trigger was the "Won" status in HubSpot. At that point, the handoff to Odoo had to fire reliably so the operations team got the data immediately.
Products and line items in HubSpot
HubSpot's product library and line items are separate entities, and their association with deals and quotes follows specific rules. That required a deliberate approach to creating, updating, and linking line items and associations.
We built the integration as a separate Node.js connector with explicit mapping rules, idempotency, and structured logging. The logic was split into two flows: Odoo → HubSpot for products and quotes, and HubSpot → Odoo for won deals. For automatic execution on the HubSpot side, we used workflow automation with custom Node.js code, so the CRM team manages the trigger from inside HubSpot.
Dedicated connector service in Node.js
The service encapsulates the integration logic, holds the configuration for quote and product selection, and acts as a bridge between the two APIs.
Entity mapping and synchronization rules
We defined which fields are the source of truth in each system, how line items are built, how discounts, taxes, and commissions are transmitted, and how companies and contacts are matched.
Odoo → HubSpot flow for products and quotes
We push the product catalog — price, description, images — together with quotes filtered by agreed criteria, so HubSpot analytics reflects the real commercial picture.
HubSpot → Odoo flow for won deals
After "Won," we collect the full deal context in HubSpot — including line items — and send it to Odoo as a prepared package for fulfillment and accounting. Line items in HubSpot are a separate object, so their creation, update, and association are handled explicitly.
Execution through HubSpot workflow
Custom code wired into the HubSpot workflow fires the push to Odoo automatically when a deal moves to "Won" — no manual triggers needed.
Logging, retries, and duplicate protection
Idempotent keys, partial-failure handling, retry logic, and a clear support log. On the Odoo side, we followed the standard approach for working with the external API.
We started by defining which system owns products, pricing, taxes, and discounts. Part of the data lived in Odoo, while the sales team was used to adjusting deal details in HubSpot for specific opportunities. We defined which fields could be edited safely in HubSpot without breaking downstream accounting, and which values must always come from Odoo. In parallel, we described what a complete deal package should look like before going into ERP, so the operations team would never have to add missing items by hand after a win.
+1 Resource
After launch, the client got a managed data flow between CRM and ERP — and the manual handoff of deals after the sale disappeared.
of won deals into Odoo — the package is created automatically after the move to "Won"
for a won deal to appear in Odoo — operations gets the data almost immediately
transferred to Odoo, including line items, taxes, discounts, and commissions
on repeated triggers
into HubSpot, keeping the CRM catalog aligned with Odoo
without mismatched numbers between CRM and ERP
in invoices and equipment configuration
for support — every record visible in one place
Or send us a message and we'll get back to you within 15 minutes during business hours