
Multi-Store Stock Sync for WooCommerce — shared stock across several stores
Several WooCommerce stores, one warehouse: the master keeps the stock and the satellites follow it by SKU. A sale on any site shows on all of them within seconds. Pro adds prices per site, shared reviews and hourly reconciliation; one licence on the master unlocks Pro for the whole network.
- Compatibility
- WordPress 6.2+ · WooCommerce 7.0+ (tested on WP 7.1 / Woo 11.1 and 10.7) · PHP 7.4+ · HPOS · classic and block checkout
- Licence
- one site, annual
- Trial
- 7 days, no card, one per site
What Free has,
and what Pro adds
The free version works with no time limit. Pro adds the rest of the features in the table.
What it looks like
Key points
What the customer sees
The customer sees correct availability on every site of the network, and nothing else.
What the store admin gets
A WooCommerce → Multi-Store Sync page with four tabs: connections, sync log, SKU report, settings.

The trial starts when you ask
A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site
Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. If our server is unreachable, Pro keeps working for 14 more days. For studios — keys for 5 or 25 sites, or unlimited.
Technical requirements
WooCommerce 7.0+ on every site of the network, HPOS compatible, classic and block checkout.
WordPress 6.2+ · PHP 7.4+
The sites must reach each other over HTTPS: each one receives messages at /wp-json/catcode-mss/v1/rpc. If a site sits behind a firewall, allow that address.
The same SKUs on every site: the plugin matches products by them.
Delivery starts right after the request; if the hosting blocks requests from a site to itself, WP-Cron sends the queue every 2 minutes while the site gets visits. WP-Cron switched off without a system cron stops the queue.
Tested on WordPress 7.1 with WooCommerce 11.1 and 10.7, on MariaDB and SQLite.
Version history
A new SKU on a satellite gets the master’s stock at once (and price in Pro); creating a product on a satellite no longer adds to the master’s stock; a failed exchange shows “connection error”.
Master / satellite roles, key-based connection signed with HMAC-SHA256, stock by SKU for simple products and variations with exactly-once changes and versioned values, retry queue, sync…
Frequently bought with Multi-Store Stock Sync for WooCommerce
4 modules in one order — 40% cheaper than separately


Nova Poshta Premium — a Nova Poshta module for OpenCart 2.3, 3.x and 4.x

LiqPay — Card Payments for OpenCart 2.3, 3.x and 4.x

Telegram notifications and Viber/SMS for customers for OpenCart
Full module description
Multi-Store Stock Sync for WooCommerce is for anyone selling the same goods on two or more WooCommerce sites: a retail and a wholesale domain, stores in different languages, a second brand, a separate site for a marketplace. The warehouse is one, so the stock has to be one too. Without sync, a manager copies numbers between admin panels by hand, and a customer pays for an item that is already gone.
The plugin makes one site the master: its stock is the truth. Every other site is a satellite that follows the master by SKU. A sale, a cancellation, a restocked refund or a manual edit on any site shows on all the others within seconds.
What the customer sees
The customer sees correct availability on every site of the network, and nothing else. The last two pairs sold on the wholesale site: a few seconds later the retail site shows “Out of stock”. An order is cancelled: the items are back on every site.
- Checkout stays fast. Nothing is sent during checkout: the change goes into a queue and is delivered in the background right after the request.
- Variations too. Size and colour sync separately, and so do products whose stock is kept on the parent.
- Products without stock tracking get the stock status: “Out of stock” on the master means the same on the satellites.
What the store admin gets
A WooCommerce → Multi-Store Sync page with four tabs: connections, sync log, SKU report, settings. The plugin interface is available in English, Ukrainian and Russian.
- Connected in a minute. On the master: “Add satellite”, copy the key. On the satellite: paste the key and “Connect”. Right after connecting, the satellite compares catalogues and takes the master’s stock for every matching SKU.
- Status of every site: last successful answer, last error, how many changes wait in the queue. Buttons: “Check connection”, “Push all stock”, “Pause”, “Delete”.
- The log shows what went where and how it ended: sale −2 from order #1078, stock now 19. Filters by level, site and SKU; you choose the retention (30 days by default).
- The SKU report lists products that exist on one side only. Usually that is a typo in a SKU that would otherwise take weeks to find.
Pro: prices, reviews, reconciliation, alerts
- Prices per site role. For each satellite: the price source (the master regular price or a separate price list such as “Wholesale”), a factor (1.2 = +20%, 0.9 = −10%, or an exchange rate) and the number of decimals. A price list is a field in the product and variation card on the master.
- Sales. Either the satellite receives the master’s sale prices with dates or it keeps its own sales, your choice per site. If a new price from the master is not above the satellite’s own sale price, it is not applied, and both logs say why, so a sale never disappears silently.
- Limits: prices only for chosen categories, and any product can be left out with the “Do not send the price” tick in its card.
- Reviews travel between every site by SKU: with rating and the “verified owner” mark, without the author’s e-mail or IP, without duplicates or echoes. The average rating is recalculated.
- Hourly reconciliation fixes any drift left by failures on its own, no button needed.
- An e-mail when a site of the network stops answering, and another one when it is back.
How it works, step by step
- Something changes on a satellite: a sale, a cancellation, a restocked refund or a manual edit. The plugin records it as an exact change (−2, +1) with a unique event id.
- Right after the request, a background worker sends the change to the master in a signed message.
- The master applies the change with WooCommerce’s atomic stock update. Delivering the same event again changes nothing: it is counted exactly once.
- The master sends the resulting number to every satellite with a version. An older version never overwrites a newer one.
- Values that came from the network are never sent back, so two sites cannot ping-pong the same change.
- If the master is down, changes wait in the queue and retry with a pause from 30 seconds up to an hour. The satellite meanwhile shows “master stock plus its own unsent changes”.
Under the hood
- Changes, not numbers. A satellite sends the master a change with a unique event id, not “there are 17 here now”. Two simultaneous sales on different sites never overwrite each other.
- Exactly once. The event id is stored on the master; the same event retried after a network error returns “already counted” instead of taking the item twice.
- Versioned values. Every number from the master carries the time it was read; a satellite drops an outdated value even when it arrives later.
- Security. Every message is signed with HMAC-SHA256 and carries a timestamp and a one-time nonce; a foreign signature, an old message or a replay is refused. Secrets are encrypted in the database. The connection key is shown only in the admin, to users who manage WooCommerce.
- Nothing extra leaves the stores. Only SKUs, stock and stock statuses travel between the sites (plus prices and reviews without e-mails in Pro). No customer data is sent anywhere, and CatCode receives nothing.
- A burst of sales is one message. The master marks the SKU as changed and reads the stock at sending time, so ten sales in a row make one update, in batches of up to 100 SKUs.
- Cleans up after itself. Deleting the plugin removes its tables, options and cron events; product stock stays as it is.
Installation
- On every site of the network: Plugins → Add New → Upload Plugin, choose
catcode-multistore-sync-for-woocommerce-1.0.1.zip(Pro) or the free build, and activate it. - On the site whose stock is correct today, open WooCommerce → Multi-Store Sync → Settings and choose the “Master (warehouse)” role.
- On the Connections tab, enter a satellite name, click “Add satellite” and copy its connection key.
- On the other site, choose the “Satellite” role, paste the key and click “Connect”. The satellite compares catalogues and takes the master’s stock.
- Check the SKU report: it lists products whose SKU did not match.
- For Pro: on the master, paste the licence key from the e-mail after payment or start the 7-day trial. Satellites get Pro from the master automatically.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
What happens when two stores sell the last item in the same second?
Both sales reach the master as separate changes and both are counted, so the master's stock goes below zero and every store shows the item as out of stock. Stock sync keeps the numbers right; it cannot stop two checkouts that finished before the first sale reached the master (usually a few seconds).
Does the plugin copy products or orders between sites?
No. Every store keeps its own product cards and its own orders. Only stock is shared (plus prices and reviews in Pro), and products are matched by SKU.
A product exists on only one store. What happens to it?
Its stock stays local. The comparison lists such SKUs on both sides, so you can add the product or fix the SKU.
Do I need a licence for every site?
No. The licence goes on the master only. Satellites run the same Pro build without a key: the master tells them Pro is on, and prices, reviews and reconciliation switch on right away.
What happens while the master is down?
Satellites keep selling. Changes wait in the queue and leave with retries, and the satellite meanwhile shows "master stock plus its own unsent changes". When the master is back, the queue arrives exactly once.
Do the server clocks matter?
A little: messages older than 5 minutes are refused as replay protection. Every normal hosting keeps server time in sync automatically.
No reviews yet. Be the first.
No questions yet. Ask one — we answer within 24 hours.
Not quite what you are looking for?
We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.
Order a custom module
Buying the module
—