FrancodesystemsFran<code>systems
ERP / AccountingCustom integration

Holded Odoo integration

Odoo to Holded migration, or controlled coexistence between both ERPs.

HoldedHolded
Odoo

Implementation time · 15-30 días laborables (proyecto)

Diagnosis

The problem

Odoo is enormously powerful, but the total cost for an SMB balloons: Enterprise licenses, a partner for implementation, a partner for maintenance, custom modules that break with every major release, on-premise instances that need a SysAdmin. For companies of 5 to 50 employees it ends up being overkill. Holded simplifies things radically, but migrating 3 to 5 years of accounting history is scary, especially if you have open entries, half-closed reconciliations and filed tax returns. And if your Odoo has specific modules that Holded does not cover (manufacturing, complex multi-location warehousing), you cannot simply migrate and forget: you need the two systems to coexist.

Proposal

The solution

For companies coming from Odoo that want to simplify with Holded, or that need to keep Odoo for specific modules (manufacturing, MRP, complex warehousing) while Holded runs as the invoicing and Spanish accounting engine. We do auditable data migration (catalog, customers, accounting history, open entries) or real-time two-way sync if the two systems coexist long term. Supports Odoo Community and Enterprise, on-premise or Odoo.sh.

Scope

What we automate

  • Migration of the product catalog with SKU, VAT, price and category
  • Migration of customers and suppliers with tax ID, IBAN and payment method
  • Migration of accounting history (entries, ledgers) as far as your Holded plan allows
  • Migration of issued and received invoices with their status (paid/pending)
  • Migration of filed tax returns as historical reference
  • Coexistence: Odoo MRP/Stock to Holded invoicing in real time
  • Coexistence: Odoo Sales to Holded for Spanish fiscal issuance
  • Mapping of the Odoo chart of accounts to the Spanish General Accounting Plan in Holded
Who uses it

Real use cases

These are the profiles that most ask us for the HoldedOdoo integration and what they get in the end.

Case 01

SMB migrating from Odoo Community to Holded

Before: 5 years of accounting history, afraid of losing open entries, unwilling to pay an Odoo partner to extract the data.

After: Complete migration in 3 weeks with validated dry-runs. Zero lost entries. Savings of 18k EUR/year in licenses and maintenance.

Case 02

Manufacturer with Odoo MRP needing correct AEAT invoicing

Before: Odoo MRP needed for production, but its Spanish invoicing was fragile with the AEAT.

After: Odoo MRP untouched for production. Holded receives confirmed orders and issues invoicing with Verifactu and tax returns.

Case 03

Company with an abandoned Odoo and an unsupported partner

Before: The partner ceased trading. On-premise Odoo instance with no maintenance. Impossible to update.

After: Clean migration to Holded with zero partner dependency. Migration code delivered and documented.

Before / After

What changes exactly

Without the integration

  • Odoo Enterprise licenses plus partner: 15 to 30k EUR/year
  • Custom modules that break with every release
  • Migration done by eye with no prior validation
  • Total dependency on an external partner

With the integration

  • Holded professional plan: 1 to 3k EUR/year
  • Critical modules preserved in Odoo, the rest in Holded
  • Dry-runs and prior validation: zero surprises
  • Integration code delivered and documented
Architecture

How we build it

Migration scripts versioned in git, run in reversible phases. Each phase has its own validation (a dry-run that reports discrepancies before writing anything). For coexistence, we connect Odoo via XML-RPC or JSON-RPC (Odoo supports both) with Holded's REST API. The whole integration runs on an external service (we do not install custom modules in your Odoo that you would later have to maintain). We hand over the integration code: if you switch partner tomorrow, all the knowledge is versioned.

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

Do you migrate the complete accounting history?

Yes, as far as your Holded plan allows (some plans limit the number of loadable fiscal years). The usual case: the current year plus 1 or 2 prior years as reference. For more depth we use an archiving module outside Holded.

Does it support Odoo Community and Enterprise?

Both. Via XML-RPC or JSON-RPC, which are present in both versions. For Enterprise with complex custom modules, implementation time can rise depending on the mappings required.

On-premise, Odoo.sh or cloud?

Any of them. For on-premise we need network access to the RPC; for Odoo.sh access is standard over the internet with credentials.

What if I want to keep Odoo MRP/Stock and Holded for invoicing?

It is a very common and supported case. Odoo handles production and warehousing; when it confirms a sales order, it triggers the correct Spanish fiscal issuance in Holded. It is the optimal setup for manufacturers.

How long does a migration take and how much does it cost?

Between 15 and 30 business days for a standard SMB migration (5 to 15 employees). For ongoing coexistence, we are talking 20 to 40 days depending on the number of flows. Fixed quote after an initial no-commitment assessment.

What about entries left open mid-year?

We migrate them keeping their numbering and references. We do a technical (not operational) close in Odoo and an opening in Holded with the exact balances. A critical point we validate line by line with your accountant before going live.

Shall we talk about your Odoo integration?

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