FrancodesystemsFrancodesystems
ERP / AccountingCustom integration

How to connect Holded with Odoo

Holded and Odoo running side by side: during your move to Odoo, or with Holded for accounting and Odoo for operations.

By Juan Cantón Rodríguez · Updated

HoldedHolded
↔
Odoo

Implementation time · 2-4 semanas

Diagnosis

The problem

Two ERPs without an integration means typing everything twice and finding out at month end that they do not match. It happens in two specific situations. The first is the transition: the team starts working in Odoo while invoicing or the accountant stay in Holded until cut-over. The second is long term: Holded stays as the accounting system because the accountant keeps the books there, and Odoo covers what Holded does not handle well (several warehouses, manufacturing, high-volume ecommerce). The risk is not technical but design: two systems creating customers, products or invoices on their own end up with duplicates, stock that does not match and, worst of all, two invoice numbering sequences for the same sale.

Proposal

The solution

We connect Holded with Odoo when both have to live together. Case one: you are moving to Odoo and, for a few weeks, contacts, products and orders need to exist in both without typing them twice. Case two: your Spanish accountant works in Holded and you do not want to change that, but stock, manufacturing or your online store already run in Odoo. In both cases we decide which system owns each piece of data, which way it syncs and which of the two issues invoices. We are an Odoo Learning Partner and work with the Holded API every day.

Scope

What we automate

  • Contacts: customers and suppliers created in one system appear in the other, keyed on the tax ID to avoid duplicates
  • Products: references, prices and taxes from whichever system you choose as the master
  • Confirmed sales orders in Odoo passed to Holded to be invoiced there (if Holded is the issuer)
  • Invoices issued in Odoo reaching Holded as accounting documents (if Odoo is the issuer)
  • Stock: Odoo as the source of truth and Holded with updated quantities, never the other way round
  • Payment status, so cash matches in both
  • A log of every sync with its errors, to review what did not go through and why
Before / After

What changes exactly

✕

Without the integration

  • The same orders typed into Odoo and Holded
  • Duplicate customers with different or mistyped tax IDs
  • Different stock in each system
  • Risk of issuing the same sale under two numbering sequences
✓

With the integration

  • Each piece of data has one master system and one direction
  • Tax ID as the key: one customer, one record in each system
  • Stock that only moves in Odoo
  • Only one system issues invoices; the other only receives them
Architecture

How we build it

On the Holded side we use its API, which we know well because we maintain the Holded node verified by n8n. On the Odoo side, its external API (JSON-RPC or XML-RPC), which in Odoo Enterprise requires the Custom plan or Odoo.sh; the Standard plan does not include it, while self-hosted Odoo Community does. Simple flows run in n8n; with volume or conflict rules, a custom connector with a queue, retries and idempotency, deployed outside your Odoo so you have no extra modules to maintain. Before writing a line we agree with you which system owns each piece of data and which one issues invoices. If Odoo is going to be your main system, we recommend migrating fully and using the integration only during the transition.

flow.ts
webhook odoo.event
→ queue.enqueue(jobId)
→ worker.handle() // idempotent
→ holded.api.call() // retries with backoff
→ log.emit({ status: 'ok' })
FAQ

Frequently asked questions

Integrate or migrate fully to Odoo?

If Odoo is going to be your main system, migrating fully is usually better, with the integration only covering the transition. A long-term integration makes sense when there is a clear reason to keep Holded, such as an accountant who works in it. We offer a fixed-price Holded to Odoo migration (page in Spanish).

Which Odoo plan do I need to integrate it with Holded?

One with external API access: Custom or Odoo.sh. The Standard plan does not include it. Self-hosted Odoo Community also has it. Check current prices on odoo.com.

Which of the two issues invoices?

Only one. If your accountant works in Holded, Holded usually issues and Odoo sends it the orders. If the sale starts in Odoo (online store, manufacturing), Odoo issues and Holded receives the invoice as an accounting document. Never both: in Spain each invoice has to be registered once under Verifactu.

How much does it cost?

Our rate is 70 EUR per hour before VAT. A one-way transition sync of contacts and products is around 20 hours; a stable two-way setup with orders or invoices, 40 to 60 hours. Fixed quote after a 4-hour assessment.

n8n or custom code?

n8n for simple and transitional flows, because it is easy to see and change. Custom code when there is volume or conflict rules. Either way, the master system for each piece of data is decided first.

Are you an Odoo or a Holded partner?

We are an Odoo Learning Partner, the entry level of Odoo's partner programme. We are not a Holded partner: we maintain its n8n verified node and much of our work is Holded integrations.

Shall we talk about your Odoo integration?

A 30-minute call, no strings. You leave with scope and a price.