Most WooCommerce inventory management plugins are not inventory systems at all — they are faster editing screens for stock numbers WooCommerce is already tracking. That distinction decides what you should buy. WooCommerce 11.1.2 already decrements stock on payment, holds stock for unpaid orders, emails you at a low-stock threshold and hides out-of-stock products, all under WooCommerce → Settings → Products → Inventory. If your complaint is “editing 400 stock numbers one product at a time is unbearable”, you need a bulk editor. If it is “I do not know what I have across two warehouses”, you need something else entirely, and it probably is not a plugin.
Pick wrong and the failure is quiet: you pay annually for a grid editor while still overselling, because the thing that oversold you was a caching layer and a 60-minute stock hold, not a missing feature.
What this page covers and what it does not
What WooCommerce core stock management already does for free
Go to WooCommerce → Settings → Products → Inventory. These are the defaults WooCommerce ships, read straight out of its settings class, and most stores never change them:
| Setting | Option name | Default | What it does |
|---|---|---|---|
| Manage stock | woocommerce_manage_stock | yes | Master switch. Off, and every product sells unlimited quantity regardless of per-product settings |
| Hold stock (minutes) | woocommerce_hold_stock_minutes | 60 | Reserves stock for an unpaid order this long, then cancels the order and releases it |
| Low stock threshold | woocommerce_notify_low_stock_amount | 2 | Site-wide trigger for the low-stock email, overridable per product |
| Out of stock threshold | woocommerce_notify_no_stock_amount | 0 | The quantity at which a product is treated as out of stock. Set it to 3 and the last three units stop selling |
| Out of stock visibility | woocommerce_hide_out_of_stock_items | no | Whether sold-out products disappear from the catalogue entirely |
| Stock display format | woocommerce_stock_format | empty (always show quantity) | Show the exact number, show it only when low, or never show it |
Two of those deserve a second look before you spend anything.
Out of stock threshold is not the same as zero. It is the floor below which a product is unbuyable. Leaving it at 0 means you sell down to the last unit, which is right for most stores and wrong for anyone who needs a safety buffer for a wholesale channel or a shop floor. Set it to 2 and every product silently holds two units back.
Hold stock is the oversell valve. Since WooCommerce 4.3 the reservation lives in its own table rather than in order meta, which makes it inspectable. If customers are reaching checkout and finding items gone, look at what is currently reserved:
# What stock is currently held by unpaid orders
wp db query "
SELECT r.order_id, r.product_id, r.stock_quantity, r.expires
FROM wp_wc_reserved_stock r
WHERE r.expires > NOW()
ORDER BY r.expires ASC;
"
Swap wp_ for your real table prefix. A long list here on a low-traffic store usually means failed payments are piling up and the 60-minute hold is too generous — drop it to 15 or 20 and the reservations clear four times faster. Set it to 0 and you disable holding altogether, which trades oversell risk for never blocking a buyer.
Answer this before you shop
How I judged these WooCommerce inventory management plugins
These are documented behaviours, published prices and WordPress.org install counts, not benchmark scores. Weight them against your own catalogue size:
Versions, install counts, ratings and prices were checked on 6 October 2026 against each vendor’s own pricing page and WordPress.org listing. Nothing here is based on a figure quoted in someone else’s roundup.
WooCommerce inventory management plugins compared
On a narrow screen this table stacks into one card per option rather than scrolling sideways.
| Option | Bulk editing | Purchasing | Price | Where it falls short |
|---|---|---|---|---|
| WooCommerce core 11.1.2 7M+ installs | Quick Edit one product at a time; CSV importer can update stock in bulk | No | $0 | No grid view, no stock history, no suppliers. Variations must be opened individually |
| Stock Manager for WooCommerce 3.11.0 20,000+ installs, 4.2/5 from 130 reviews | Yes — spreadsheet grid for SKU, price, weight, stock status, backorders and quantity, inline and batched | No | $0, no paid tier | 4.2 is the lowest rating here. It edits stock well and does nothing beyond stock fields |
| Smart Manager (StoreApps) | Lite: inline editing of 3 records at a time, delete up to 50. Pro: unlimited inline editing, bulk edit, all post types | No | Lite free; Pro $199/yr for 1 site, $249/yr for 5. Lifetime $549 and $599. 30-day refund policy | The 3-record Lite cap makes the free version a demo. No data import in either tier. Most expensive annual licence on this page for a grid editor |
| ATUM Inventory Management 2.0.4 10,000+ installs, 4.7/5 from 128 reviews | Yes — Stock Central grid with bulk price and stock editing, variations and grouped products included | Yes — suppliers, purchase orders with PDF export, inventory logs, locations | Free core; separate paid add-ons, 14-day trial with no payment | The parts most people want it for — multi-warehouse, bills of materials, mobile app — are all paid add-ons. Requires PHP 7.4+ |
| Veeqo (Amazon) | Outside WordPress — Veeqo holds stock and syncs to WooCommerce | Yes — purchase orders, suppliers, multi-warehouse, digital picking | Shipping plan free; Inventory from $19/mo by order volume; High Volume from $350/mo | Owned by Amazon, and WooCommerce becomes a sales channel rather than the system of record. The free plan is the shipping product, not the inventory one |
| Zoho Inventory | Outside WordPress — Zoho holds stock and syncs to WooCommerce | Yes — purchase orders, composite items, backordering, multi-warehouse | Free: 50 orders/mo, 1 user, 1 location. Standard $29/mo (500 orders), Premium $79/mo (3,000), Plus $129/mo (7,500), Enterprise $249/mo (15,000), billed annually | Priced by monthly order count, so the bill tracks your growth. Pulls you toward the rest of the Zoho suite. 50 orders is one slow week |
Stock Manager and Smart Manager: grid editors, nothing more
Both of these do one thing: put your catalogue in a spreadsheet-shaped screen so you can type stock numbers without loading a product edit page per item. For a store whose only inventory pain is clicking, that is the whole job, and it is worth being clear that neither adds a single feature to how WooCommerce calculates stock.
Stock Manager for WooCommerce 3.11.0 is the one to try first because it is free with no paid tier at all, and at 20,000+ active installs it is the most widely used free option here. The grid covers SKU, name, tax status and class, shipping class, price, weight, stock status, backorders and quantity, with filters on category, product type, stock status and SKU, plus per-product stock history and CSV import and export. Simple, variable, grouped and external products are all supported.
Its weakness is the rating: 4.2 out of 5 from 130 reviews, the lowest on this page. That is a real sample rather than a handful of votes, so read the one-star reviews before you run a 2,000-row bulk save on a live store. And take a database backup first regardless — a bad bulk write to stock fields is not something you can undo from the WordPress admin, which is one of the cases WooCommerce backup plugins compared for store owners exists for.
Smart Manager from StoreApps is the paid version of the same idea, and it is the priciest licence on this page: $199/yr for a single site, $249/yr for five, or $549 and $599 one-time, under a 30-day refund policy that covers a broken plugin they cannot fix rather than a change of mind. The Lite version is on WordPress.org but it is a demo rather than a tier — four post types (products and variations, orders, coupons, posts), inline editing capped at three records at a time, and deletion capped at 50 records. Bulk edit, unlimited inline editing, CSV export, product duplication and PDF invoices are all Pro.
Neither of these imports data the way you expect
Products → All Products → Import, matched on SKU with “Update existing products” ticked. That is free, it has been in core for years, and it will outlast any plugin on this page.ATUM: the only free option that handles purchasing
ATUM 2.0.4 is the best-rated plugin here — 4.7 out of 5 from 128 reviews across 10,000+ installs — and it is the only free one that goes past counting into purchasing. Its Stock Central screen is a grid like the others, but it also gives you suppliers attached to products, purchase orders you can export as PDF and send, inventory logs recording movements rather than just current state, a location hierarchy, and a dashboard with sales statistics. Variations and grouped products are first-class, and WPML is supported throughout.
Inventory logs are the feature worth installing it for even if you never create a purchase order. “Stock says 4, shelf says 1” is unanswerable without a movement record, and core WooCommerce keeps none.
Where it falls short is predictable and worth pricing in now: the things people install ATUM hoping for are add-ons. Multi Inventory, which gives a product several inventories with selling priorities, batch and LOT codes, expiry dates and regional restrictions, is paid. Product Levels, which adds bills of materials and raw-material product types for anyone assembling or manufacturing, is paid. So is the mobile app. Stock Management Labs licence these for 1, 3 or 5 sites on quarterly or yearly billing in USD, GBP or EUR, with a 14-day trial that takes no payment up front and a stated 15% renewal discount. Their pricing page renders the actual figures in JavaScript, so get the current number from the page itself rather than from a blog post quoting last year’s.
One operational note: ATUM requires PHP 7.4 or higher, and Stock Central on a large catalogue is a heavy admin screen. If your dashboard already drags, the cause is usually PHP workers and memory rather than the plugin — WooCommerce hosting requirements: PHP workers and RAM covers how to tell the difference, and diagnosing a slow WordPress admin dashboard covers the rest.
When you need a platform instead of a plugin
There is one question that settles this: do you sell the same SKU anywhere other than your WooCommerce store? If yes — a retail counter, Amazon, eBay, a wholesale channel, a second site — then no WordPress plugin can be right, because two systems both believing they own the number is how you oversell. Something outside WooCommerce has to hold the truth and push it in.
Veeqo is free for its shipping product and starts at $19/month for the inventory product, scaling by order volume, with a High Volume tier from $350/month that adds ERP integrations. It covers purchase orders, suppliers, unlimited warehouse locations and digital picking, and it pulls orders from WooCommerce alongside Amazon, Shopify, eBay and Walmart. It has been part of Amazon since 2021; Veeqo state they do not share your product or sales data with other Amazon business units, and whether that reassures you is your call to make rather than mine. Read the free plan carefully — the free tier is shipping, not inventory.
Zoho Inventory has a genuinely free plan at 50 orders a month with one user and one location, which is enough to evaluate it properly rather than enough to run on. Paid tiers are billed annually at $29/month for 500 orders, $79 for 3,000, $129 for 7,500 and $249 for 15,000, and they include purchase orders, composite items, backordering and multiple warehouses. The caution is the shape rather than the price: your bill is tied to order count, so a good quarter raises your software cost, and the product is designed to make Zoho Books and Zoho CRM the obvious next purchase.
Both add a sync delay measured in minutes. For most catalogues that is fine. For a one-of-a-kind inventory — vintage, art, single-unit stock — a sync window is a window in which two people buy the same item, and you are better off keeping stock in WooCommerce and accepting the manual work.
Audit your stock data before you buy anything
Half the stores that shop for an inventory plugin have a data problem, not a tooling problem. These two queries take a minute and change the decision often enough to be worth running first. WooCommerce maintains a lookup table that makes them fast on a large catalogue.
How much of your catalogue is not tracked at all
# Published products and variations with stock management switched off
wp db query "
SELECT p.post_type, COUNT(*) AS untracked
FROM wp_posts p
LEFT JOIN wp_postmeta m
ON m.post_id = p.ID AND m.meta_key = '_manage_stock'
WHERE p.post_type IN ('product','product_variation')
AND p.post_status = 'publish'
AND ( m.meta_value IS NULL OR m.meta_value != 'yes' )
GROUP BY p.post_type;
"
A large number under product_variation is the classic finding: stock managed on the parent t-shirt, nothing on the sizes, so every size sells until the parent hits zero. No plugin on this page fixes that for you — it is a per-product setting you have to turn on, and ironically that is exactly the kind of mass change a grid editor is for.
What is actually running low right now
# Everything in stock at or below the default low-stock threshold of 2
wp db query "
SELECT l.product_id, p.post_title, l.stock_quantity
FROM wp_wc_product_meta_lookup l
JOIN wp_posts p ON p.ID = l.product_id
WHERE l.stock_status = 'instock'
AND l.stock_quantity IS NOT NULL
AND l.stock_quantity <= 2
ORDER BY l.stock_quantity ASC, p.post_title ASC
LIMIT 50;
"
If that list is long and you have had no low-stock emails, your problem is email delivery, not inventory. WooCommerce calls wc_get_low_stock_amount(), which falls back to get_option( 'woocommerce_notify_low_stock_amount', 2 ), and then sends through wp_mail() — which on a shared host is the single most common place these notifications vanish. That is the same failure covered in WooCommerce SMTP plugins compared for order emails and, more generally, in WordPress emails not sending. Fix that before you pay for a dashboard that tells you what an email would have.
Log every stock change and what caused it
When a number is wrong and nobody admits to changing it, this tells you. Drop it in wp-content/mu-plugins/:
<?php
// wp-content/mu-plugins/wpf-stock-audit.php
// Record every stock change with the context that caused it.
add_action( 'woocommerce_product_set_stock', 'wpf_log_stock_change' );
add_action( 'woocommerce_variation_set_stock', 'wpf_log_stock_change' );
function wpf_log_stock_change( $product ) {
if ( ! defined( 'WP_DEBUG_LOG' ) || ! WP_DEBUG_LOG ) {
return;
}
$context = 'front-end or cron';
if ( defined( 'WP_CLI' ) && WP_CLI ) {
$context = 'wp-cli';
} elseif ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
$context = 'rest-api';
} elseif ( is_admin() ) {
$context = 'wp-admin';
}
$user_id = get_current_user_id();
error_log( sprintf(
'[wpf-stock] #%d %s => qty %s, status %s | via %s | user %s',
$product->get_id(),
$product->get_sku() ? $product->get_sku() : 'no-sku',
var_export( $product->get_stock_quantity(), true ),
$product->get_stock_status(),
$context,
$user_id ? $user_id : 'guest'
) );
}
Turn on WP_DEBUG_LOG first — enabling WordPress debugging and reading error logs safely walks through doing that without showing notices to visitors. Run it for a week and the pattern usually names itself: a nightly rest-api burst is an integration you forgot about, and a wp-admin change against one user ID is a person. Delete the file afterwards; it writes a line on every stock movement.
Backorders and the stock number your customer sees
Backorders are a per-product setting with three states — do not allow, allow, and allow but notify the customer — and the third is the one worth using, because it is the difference between a shipping delay the buyer agreed to and a complaint. Set it deliberately on anything with a long supplier lead time rather than leaving every product at the default.
The other half of this is caching. Stock quantity is the most volatile number on a product page, and a full-page cache will happily serve “2 left” to a hundred visitors after you have sold both. If you display quantities, either exclude product pages from the cache or set Stock display format to “Only show quantity remaining when low” so the number appears in a narrow window rather than permanently. WooCommerce caching plugins: what breaks and what works covers which layers are safe on a store.
Two adjacent cases are worth naming because they look like inventory problems and are not. Selling time — appointments, rentals, a chair with one stylist — is a calendar problem, not a stock number, and belongs with the tools in WooCommerce booking plugins compared. Holding different stock or minimum quantities for trade customers is a pricing-and-roles problem covered in WooCommerce wholesale plugins compared for B2B stores. Neither is solved by a better stock grid.
Which one should you pick?
- Under about 100 products, WooCommerce is your only sales channel: core, plus the built-in CSV importer when a supplier file arrives. Spend nothing and revisit when the editing genuinely hurts.
- Editing stock is the only pain: Stock Manager for WooCommerce, free, 20,000+ installs. Read its one-star reviews and back up before the first big bulk save.
- You want suppliers, reorder points and purchase orders without leaving WordPress: ATUM. Best rating here, and the only free option that does purchasing — just budget for the add-on if you need multi-warehouse or bills of materials.
- You want to edit orders, coupons and posts in the same grid and will pay for it: Smart Manager Pro at $199/yr. Try Lite first, knowing the 3-record cap means you are evaluating the interface rather than the workflow.
- Same SKU sold in more than one place: Veeqo or Zoho Inventory, and accept that WooCommerce becomes a channel rather than the system of record. Zoho’s free 50-order plan is the cheapest way to test the idea properly.
- Single-unit or one-of-a-kind stock: none of the external platforms. Keep the number in WooCommerce, set hold stock low, and do the manual work.
Whatever you install, test it the same way: pick one variable product, change its stock in the new tool, and confirm the number in wp_wc_product_meta_lookup, on the product edit screen and on the front end all agree. Then place a real order and check it decrements once. Every inventory setup I have seen go wrong went wrong at one of those two points, and both are five-minute checks.
Once stock is trustworthy, the next useful thing is knowing what it is doing — which products turn over, which have sat since spring. That is reporting rather than inventory, and WooCommerce analytics plugins compared covers the options.
Frequently asked questions
Do I need an inventory plugin if WooCommerce already manages stock?
Not for counting, decrementing, low-stock emails or hiding sold-out products — core does all of that. You need one when editing hundreds of numbers by hand is the bottleneck, when you need a movement history to explain a discrepancy, or when you want suppliers and purchase orders. You need something outside WordPress when the same SKU sells in more than one place.
Why does WooCommerce keep overselling products?
Four causes in the order worth checking: stock management is off on variations even though it is on for the parent, backorders are set to allow on products you did not intend, hold stock is set to 0 so nothing is reserved during checkout, or a page cache is serving a stale quantity. Query wp_wc_reserved_stock and the _manage_stock meta to rule out the first three in about two minutes.
Can I bulk update WooCommerce stock without a plugin?
Yes. Products → All Products → Import runs WooCommerce’s built-in CSV importer, which matches on SKU and updates existing products when you tick that option — you only need the SKU and stock columns, not the whole catalogue. Export first so you have a file with the right headers, and run it on a staging copy before a live catalogue of any size.
What is the WooCommerce hold stock setting for?
It reserves stock for an order that has been placed but not paid, so a customer finishing a bank transfer does not lose the item to someone else. The default is 60 minutes, after which the order is cancelled and the stock released. Lower it to 15 or 20 on a fast-moving store where abandoned payments are tying up inventory; set it to 0 only if you would rather risk an oversell than ever block a buyer.
Does an inventory plugin slow down my store?
The front end, rarely — these are admin tools and add little to a product page. The admin, yes: a grid rendering thousands of rows with sales statistics is one of the heaviest screens you can open, and on a small plan it will time out before it finishes. Raise PHP memory and filter the grid to a category rather than loading everything, and treat a consistently slow grid as a hosting signal.
Should inventory live in WooCommerce or in an external system?
One system has to own the number, and it should be whichever one the most orders flow through. If that is WooCommerce, keep stock there and use a plugin to make editing bearable. If orders also arrive from a marketplace or a physical till, move ownership outside and let WooCommerce receive updates. Running both as the source of truth is the arrangement that oversells.
Sources
- Stock Manager for WooCommerce on WordPress.org
- ATUM on WordPress.org, plus the Multi Inventory and Product Levels add-on pages
- Smart Manager pricing and the Smart Manager pre-purchase FAQ
- Veeqo pricing and Zoho Inventory pricing
- WooCommerce 11.1.2 inventory defaults and schema read from its own
class-wc-settings-products.phpandclass-wc-install.php

Leave a Reply to This Post