FrancodesystemsFran<code>systems
EcommerceCustom integration

Holded WooCommerce integration

WooCommerce and Holded in sync, with no fragile plugins and no footprint on WordPress.

HoldedHolded
WooCommerce

Implementation time · 5-10 días laborables

Diagnosis

The problem

Free WooCommerce-to-Holded plugins fail as soon as the store scales: they do not handle partial returns well, they do not account for whole-order coupons, and they break with every major WordPress update. You end up reconciling invoices by hand and chasing refunds that never reached the ERP. Paid plugins solve the base case better but introduce dependencies in your WP that increase your attack surface and leave you stranded every time you change hosting or the plugin gets discontinued. And if you use WooCommerce Subscriptions or Bookings, almost none of them support these cleanly.

Proposal

The solution

Every order in your WooCommerce generates an invoice in Holded with the correct customer, series and VAT. Stock and product catalogue synced two-way. Refunds, recurring subscriptions and coupons supported without patches. And most important: zero plugins on your WordPress, so the integration does not break with every update to Woo, WordPress or your theme.

Scope

What we automate

  • Woo order to Holded invoice with the correct series, VAT and payment method
  • Woo customer to Holded contact with a validated tax ID (VIES if intra-EU)
  • Two-way products and stock (Woo and Holded) with conflict resolution
  • Woo refund to Holded corrective invoice (partial or full)
  • WooCommerce Subscriptions: each renewal generates a recurring invoice in a separate series
  • Whole-order coupons and line-level coupons correctly distinguished
  • Shipping costs, fees and taxes mapped as line items in Holded
  • Multi-site WordPress / multi-store Woo to a single Holded with a source identifier
Who uses it

Real use cases

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

Case 01

Woo store with WooCommerce Subscriptions

Before: Monthly renewals generated invoices without correct numbering, and a subscriber's cancellation was not reflected in Holded.

After: Each renewal creates an invoice in the correct recurring series. Cancellations propagate to the Holded CRM.

Case 02

Multi-site Woo (3 stores, 1 ERP)

Before: Three separate WordPress sites with independent stock that overlapped on a single shared physical warehouse.

After: Stock unified in Holded as the single source of truth, propagated to the three Woo stores in real time.

Case 03

Store with many coupons and promotions

Before: 10% whole-order coupons were applied as a negative line in Holded without breaking down the VAT correctly.

After: Discounts reflected with their exact tax impact, ready for the VAT return with nothing to recalculate.

Before / After

What changes exactly

Without the integration

  • Plugins that break with every WordPress update
  • Partial refunds mis-synced or ignored
  • Zero clean support for WooCommerce Subscriptions
  • Manual reconciliation with complex coupons
  • Security risk from plugins on WordPress

With the integration

  • A service external to your WP: nothing breaks with updates
  • Partial refund to Holded corrective invoice with the exact quantity
  • Subscriptions with their own series and cancellations propagated to the CRM
  • Coupons broken down with the correct tax impact
  • Zero plugins on WordPress: a clean attack surface
Architecture

How we build it

We do not install any plugin on your WordPress. We work with WooCommerce native webhooks (woocommerce_order_status_changed, woocommerce_refund_created) and the standard REST API, all from an external Node service. Idempotency is guaranteed by Woo's internal ID plus the webhook's HMAC signature. We map fields in code versioned in git, so any behaviour change is auditable and reversible. If you update WordPress, change your theme or migrate hosting, the integration keeps working because it never touches the WP at all.

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

Frequently asked questions

Does it work with WooCommerce Subscriptions?

Yes. Each recurring renewal generates an invoice in a Holded series you define (typically kept separate from one-off sales). Cancellations, pauses and reactivations propagate to the Holded CRM as status changes on the contact.

Do you have to install plugins on the WordPress?

No. We use WooCommerce native webhooks and the REST API. Zero footprint on your WP, so your theme, your apps and your security are unaffected. And the integration survives any WordPress update.

Does it support WooCommerce Bookings or complex products?

Yes. We map the Bookings metadata (dates, resources, people) as invoice lines with descriptive line items. For variable products, each variation goes with its matching SKU in Holded.

What if I have several WooCommerce stores (multi-store)?

Each Woo store can go to a different invoicing series in Holded, with its own VAT and country mappings. This is common in groups with separate brands that share administration.

Do you handle intra-EU VAT and exports?

Yes. We validate the tax ID against VIES, apply 0% on valid intra-EU B2B, IOSS for EU B2C, and 0% on exports to third countries. Everything is logged for the corresponding tax return.

What if Woo or Holded are down for a while?

The persisted queue holds the webhooks and retries with backoff for 24 h. When they come back, everything is processed in order. No order is ever lost.

Shall we talk about your WooCommerce integration?

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