Chimkins IT logo
Chimkins IT

Guide

How to Sync WooCommerce Inventory With Odoo in Real Time

Stop overselling. Keep WooCommerce stock accurate by reacting to every Odoo stock move as it happens.

The problem: what breaks when inventory isn’t connected

Most store owners land here after the same painful week: WooCommerce shows “in stock”, Odoo shows “0 on hand”, and you only notice once the customer has paid. Then it’s the apology email, the refund, and the scramble to figure out where the stock went.

When you run both WooCommerce and Odoo, drift happens fast. A POS sale reduces stock in Odoo, a picker validates a delivery, or you receive a purchase order into the warehouse — and none of that touches the WooCommerce stock number. The “fix” becomes a daily spreadsheet export and manual edits in WordPress. It works until one busy day you miss an update and oversell again.

How real-time inventory sync works

A reliable inventory sync isn’t “a nightly export”. It’s a pipeline that reacts to the same events you already use to run the business in Odoo.

The flow is straightforward:

  1. A stock-changing event happens in Odoo.
  2. Chimkins detects the change and calculates the new available quantity per product/variant.
  3. Chimkins pushes the update to WooCommerce using the WooCommerce REST API.
  4. WooCommerce updates stock_quantity / stock_status on the product (and variation) immediately.

In Odoo, inventory changes are recorded as stock moves. You want updates when these operations are completed/validated:

  • Deliveries and receipts (stock.picking): validating a picking moves stock.move records to state done, changing on-hand stock by location.
  • POS sales (pos.order): paid/posted POS orders create stock moves; if you sell in-store, this is a common source of drift.
  • Inventory adjustments: validating an adjustment via stock.quant adjustments is an explicit correction that should reach WooCommerce.
  • Manufacturing / assembly (mrp.production): marking production done consumes components and produces finished goods via stock moves.
  • Returns, scraps, and transfers (stock.picking, stock.scrap): returns add stock back, scraps remove it, and internal transfers can move stock into/out of the location you publish online.

The detail that usually determines whether you still oversell is which Odoo quantity you sync. Chimkins lets you choose between three options: On Hand (qty_available), Forecasted (virtual_available, which includes unreceived purchase orders), and a custom Available quantity that equals on hand minus outgoing — so reserved stock is excluded without inflating the number with orders that haven’t arrived yet. For most ecommerce setups, Available is the safest choice to prevent overselling.

On the WooCommerce side, updates usually hit these endpoints:

  • Simple product: PUT /wp-json/wc/v3/products/{id} with manage_stock=true, stock_quantity, and stock_status
  • Variation: PUT /wp-json/wc/v3/products/{product_id}/variations/{variation_id} with the variation’s stock_quantity

Most stores map products by SKU. In Odoo that’s commonly product.product.default_code; in WooCommerce it’s the product/variation sku. When SKUs match, syncing is predictable and debuggable.

What about multiple warehouses?

WooCommerce tracks one stock number per product (and per variation). Odoo can track stock per warehouse and location, so you have to decide what that single WooCommerce number represents.

Most teams either publish stock from one “ecommerce” location (for example WH/Stock) or publish a combined available total across selected locations/warehouses. If multi-warehouse syncing feels “wrong”, it’s usually because the “stock source” wasn’t defined up front, not because the integration can’t work.

Common pitfalls that break inventory sync

  • Syncing before moves are done: draft/waiting pickings aren't real inventory yet.
  • Ignoring reservations: syncing raw on-hand (qty_available) instead of available-to-sell (on hand minus outgoing) causes overselling.
  • Variant mapping mistakes: attributes don't match, or SKUs are set on the wrong level (parent vs variation).
  • Duplicate SKUs: reused SKUs in WooCommerce or duplicate default_code in Odoo make updates ambiguous.
  • WooCommerce "manage stock" disabled: quantities won't apply if the product isn't stock-managed.
  • API limits and timeouts: shared hosting can throttle WooCommerce REST calls; batching/retries matter.
  • Cron/worker issues: a stopped Odoo cron or stuck job queue turns "real time" into "never".
  • Wrong location: syncing from transit/vendor locations gives nonsense numbers.
  • Unit of measure mismatches: "packs" online vs "units" in Odoo needs explicit UoM handling.

Getting started

Typical setup looks like this:

  1. Install the Chimkins helper module in Odoo.
  2. Connect WooCommerce credentials (site URL + REST API consumer key/secret).
  3. Connect your Odoo instance and enable stock sync.
  4. Run an initial product mapping pass (usually by SKU) and test a few stock moves end-to-end.

For a full walkthrough, see the setup guide.

WooCommerce Odoo Inventory Sync — Keep Stock Accurate | Chimkins IT