
Shared Stock for WooCommerce — one stock for several product cards, no overselling
A WooCommerce plugin that groups the cards of one physical item into a pool with one shared stock: the same shirt on its own and in a gift box, a fabric roll sold under several colour names, a product in two catalogues. A sale of any card takes from the pool, every card shows what is left, and simultaneous checkouts cannot sell the last unit twice. The base version is free; Pro adds units per sale (a 6-pack, 0.5 kg), pool history with CSV, low-stock and out-of-stock e-mails, and bulk adding.
- Compatibility
- WordPress 6.2+ · WooCommerce 8.0+ (tested on WordPress 7.1 and WooCommerce 11.1) · PHP 7.4+ · HPOS and classic storage · block and classic checkout · MySQL / MariaDB · interface in English and German
- Licence
- one site, annual
- Trial
- 7 days, no card, one per site
- Updated
- September 2026
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 shopper sees
Every card of a pool shows the same stock — what the pool can still cover.
What the admin gets
WooCommerce → Shared Stock → Stock pools lists the pools with their stock, what unpaid orders hold and what is available.
Pro: packs, weight, pool log
Units per sale. A 6-bottle pack takes 6 from the pool, a single bottle takes 1; selling by half a kilo takes 0.5 kg.

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
WordPress 6.2+ and WooCommerce 8.0+. The end-to-end run used WordPress 7.1 and WooCommerce 11.1.
PHP 7.4+. Runs on PHP 8.3 and 7.4 without warnings from the plugin.
“Hold stock (minutes)” above 0 in WooCommerce → Settings → Products → Inventory — without it there is no overselling protection at checkout.
Database. MySQL or MariaDB with InnoDB, like WooCommerce. The lock between checkouts is a MySQL named lock (GET_LOCK); on a database without named locks the plugin works, without the extra lock. Tested on MariaDB 10.11.
Pool size. Every sale updates all cards of the pool synchronously — on a pool with hundreds of cards, payment gets slower.
Interface languages: English, German (du and Sie). No Ukrainian or Russian.
Version history
First public release: shared stock pools for products and variations, pool reservation at checkout under a lock, cart checks across the pool, “Add or take”, daily repair, WP-CLI, HPOS and…
Frequently bought with Shared Stock 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
Shared Stock for WooCommerce is a plugin for a shop that sells one physical item under several product cards. The same shirt on its own and in a gift box, a fabric roll under several colour names, a product in two catalogues, an item sold alone and as part of a set. WooCommerce counts the stock of every card separately, so the shop owner corrects numbers by hand — and still sells the last unit twice.
Shared Stock puts such cards into a pool — one stock figure they all sell from. A sale of any card takes from the pool, and every card shows what the pool can still cover. Two shoppers checking out different cards of one pool in the same second cannot both take “the last unit”. Goods spread over several warehouses? The companion plugin Multi Warehouse splits stock between warehouses — the two work together.
What the shopper sees
Every card of a pool shows the same stock — what the pool can still cover. A shopper puts the shirt into the cart, then the shirt in a box: if together that is more than there is, they learn about it right away — on add to cart, on the cart page or in the block checkout, not after paying.
When a pool runs out, all its cards become “Out of stock” together, and “In stock” again after a delivery.
What the admin gets
WooCommerce → Shared Stock → Stock pools lists the pools with their stock, what unpaid orders hold and what is available. A new pool with zero takes the stock of the first product added.
The pool screen has “Set to” (set the stock) and “Add or take” (add or remove relative to the current figure: a delivery of 10 booked while orders come in is never lost), rename, re-sync the cards, the list of cards and adding products by search. In Pro the same screen has units per sale, the “low stock” e-mail threshold, bulk adding of all variations or a list of SKUs, and a history of every change with its source (order, cancellation, refund, product edit, REST API, WP-CLI), the order number and the user, with CSV export.
A product can also join a pool from the product or variation editor: the Inventory tab gets a “Shared stock pool” field. A figure typed into any card of the pool — in the editor, quick or bulk edit, the REST API or an import — becomes the stock of the whole pool. In the products list, pool cards carry a “Shared: …” mark.
Pro: packs, weight, pool log
Units per sale. A 6-bottle pack takes 6 from the pool, a single bottle takes 1; selling by half a kilo takes 0.5 kg. Each card shows how many whole sales the pool can still cover: with 13 bottles — 13 singles or 2 packs. History records every change of the pool with its source, order, user and the stock after it, with CSV export. E-mails: “low stock” with a threshold per pool, and “out of stock”. Bulk adding: all variations of a variable product or a list of SKUs in one go.
Together with Multi Warehouse
If the goods sit in several warehouses, Multi Warehouse for WooCommerce splits each card’s stock between warehouses, while Shared Stock keeps the figure of all pool cards equal. We tested them together: 42 compatibility checks per run (HPOS on and off, PHP 7.4 and 8.3), simultaneous checkouts by eight shoppers, refunds and cancellations — warehouses, cards and pool matched after every step.
One limitation: Multi Warehouse does not know that the cards of a pool are one item, so each card has its own warehouse split. Keep the warehouse split on one card of the pool; the other cards effectively hold their stock in the main warehouse — when one card sells, the others lose the units from the main warehouse, then from the other warehouses by priority, never below zero. Multi Warehouse pickup for the other cards offers warehouses by their own split.
How it works — step by step
- You create a pool and add cards to it. Every card starts showing the pool’s stock.
- A shopper places an order. Under a database lock the plugin checks that the pool covers the order, counting what unpaid orders of all cards already hold, and holds the units. Simultaneous checkouts of one pool take turns; after more than 10 seconds of waiting (configurable) the shopper sees “please try again”.
- When WooCommerce reduces stock (payment, Processing, On hold), the plugin replaces the card’s reduction with one relative write to the pool, and every card gets the new figure.
- A cancellation, a failed payment, a refund with restock or an order edited by a manager puts the units back into the pool.
- Once a day the plugin brings the cards back to the pool’s figure — in case a plugin writes stock straight into the database.
How much it costs
Pro is 990 UAH for a one-year licence. A year of updates, technical support and all Pro features. You can take a longer term right away — the longer, the cheaper per year:
- 1 year — 990 UAH
- 2 years — 1,880 UAH (−5%, 940 UAH per year)
- 3 years — 2,610 UAH (−12%, 870 UAH per year)
- 4 years — 3,250 UAH (−18%, 810 UAH per year)
- 5 years — 3,710 UAH (−25%, 740 UAH per year)
No automatic charges: renewal is manual, reminders come by e-mail. A purchased licence keeps the Pro features forever — when the term ends, the shop only stops getting new versions and support. One key — one domain; moving the shop — unbind the licence on the old site and activate the key on the new one.
Trial first, then payment. The 7-day Pro trial starts with the “Try Pro for 7 days” button, the key arrives by e-mail, no card needed. After the trial only the Pro features switch off; saved units per sale keep being counted (so the stock does not break) but can no longer be edited.
What was tested and what was not
The plugin was tested end to end on a local stack: nginx + PHP-FPM with five workers (real concurrency), PHP 8.3 and 7.4, MariaDB 10.11, HPOS on and off — 71 checks per run plus a race of eight shoppers on a pool of three units: in each of 10 rounds exactly 3 orders went through, never a sale beyond the pool. Not tested: MySQL 8, Redis or Memcached as an object cache, WooCommerce CSV import, the REST API and quick edit through the real forms (the product form in a browser — yes). The live licence server and the trial were not part of the test. The German translations have not been proofread by a native speaker.
Under the hood
- The pool lives in its own table. The real figure lives in the pool and is always read from the database, never from a cache; cards are updated through WooCommerce’s own stock functions, which clear the product caches.
- Relative writes. Sales, cancellations and deliveries change the pool with one relative UPDATE, so simultaneous changes do not overwrite each other. In the test, 12 simultaneous payments against a pool of 20 left exactly 8.
- Reservation at pool level. WooCommerce reserves stock per product, so two different cards of one pool could each take “the last unit” in the same second. In the test without the plugin, WooCommerce gave 2 reservations out of 6 attempts on a pool of 1 unit; with the plugin — exactly 1.
- Holds until reduction. The hold of a paid order counts until WooCommerce actually reduces the stock — this closes the window where an order is already paid but the stock is not yet taken.
- Cards always manage stock. If you untick “Manage stock” on a pool card, the re-sync turns it back on.
- Uninstalling removes the tables, settings and cron; the cards keep the figure they showed.
How to install
- Download the free version
catcode-shared-stock-for-woocommerce-free-1.0.0.zipwith the button at the top of the page (or the Pro archive from your account after payment): Plugins → Add New → Upload Plugin → Install → Activate. - Check that “Hold stock (minutes)” in WooCommerce → Settings → Products → Inventory is above 0.
- WooCommerce → Shared Stock: create a pool and add the cards of one item — on the pool screen or with the “Shared stock pool” field on a product or variation.
- Set the pool’s stock, or leave 0 — then the pool takes the stock of the first card added.
- For Pro: paste the licence key from the e-mail after payment, or click “Try Pro for 7 days” in the “Pro licence” section.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
Does it really prevent overselling when two people pay at the same time?
Yes, as far as WooCommerce's stock hold goes: the pool is reserved when the order is placed, under a database lock, counting the stock held by unpaid orders of all cards in the pool. One condition: "Hold stock (minutes)" in WooCommerce → Settings → Products → Inventory must be above 0. With the hold switched off WooCommerce reserves nothing at checkout — and neither can the plugin.
What about orders created in the admin or through the REST API?
They change the pool when WooCommerce reduces stock for them (usually when the status becomes Processing, Completed or On hold). There is no checkout reservation for them — the same as in WooCommerce itself.
What happens to a product's own stock when it joins a pool?
The product starts managing stock (if it did not) and shows the pool's stock. An empty new pool takes the stock of the first product added, so the first card does not wipe the count. When a product leaves the pool, or the pool is deleted, the product keeps the figure it showed at that moment.
What if a card allows backorders?
Such a product is not held back by the pool — the same way WooCommerce treats a product with backorders. Its sales still take from the pool, and the pool may go below zero; the other cards then show "Out of stock".
Does it work together with Multi Warehouse?
Yes, we tested them together. Each card of a pool has its own warehouse split, so keep the split on one card of the pool — the other cards effectively hold their stock in the main warehouse.
How is this different from syncing stock between shops?
Shared Stock works inside one WooCommerce shop. If you run several separate sites from one warehouse, that is the Multi-Store Stock Sync plugin.
Which interface languages are there?
The plugin was made for the German and EU market: English and German (both du and Sie). There is no Ukrainian or Russian translation of the plugin.
How much does it cost?
The base version is free. Pro is 990 UAH per year, and longer terms are cheaper: 2 years — 1,880 UAH, 5 years — 3,710 UAH. No automatic charges. A purchased licence keeps the Pro features forever; the term covers updates and support.
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
—