Orders are coming in but the stock counts aren't moving. Or worse, customers keep buying something that sold out on Tuesday. Stock updates sit at the end of a chain with several links, and any one of them can fail without an error showing up anywhere. Work through these in order.
Obvious, but it catches people after imports and migrations. Two switches have to be on at once: the store-wide one at WooCommerce → Settings → Products → Inventory ("Enable stock management"), and the per-product one on each product's edit screen under Product data → Inventory ("Track stock quantity for this product").
A CSV import that omitted the manage_stock column can quietly turn tracking off for every imported product. If your problem started right after an import, spot-check five affected products before you look anywhere else.
WooCommerce reduces stock when an order is paid, not when it's placed. If your orders are piling up in Pending payment or On hold, stock hasn't moved because Woo is still waiting for the payment to confirm.
Open WooCommerce → Orders and read the status column. A wall of Pending payment for orders that customers actually paid usually means your gateway's confirmation callback isn't reaching the site (a webhook or IPN problem), and stock is only the first symptom you noticed. Fix the gateway callback and the stock chain comes back with it.
A lot of the stock plumbing runs on scheduled background tasks. WP-Cron only fires when the site gets visits, and caching layers or low traffic can starve it. When it stalls, everything downstream stalls quietly with it.
Go to WooCommerce → Status → Scheduled Actions. Look for Pending tasks with due dates in the past, or a pile of Failed ones. Over WP-CLI: wp cron event list shows what's overdue.
The durable fix: add define('DISABLE_WP_CRON', true); to wp-config.php and set a real server cron job to hit wp-cron.php every five minutes from your host panel. Stores that do this stop having this entire category of problem.
Sometimes stock IS updating and your customers just can't see it. A page cache that includes product pages will happily serve "In stock" for hours after the last unit sold, and an object cache holding stale product data does the same thing deeper down.
Test it: open a product page in a private window and compare against the number in wp-admin. If they disagree, it's cache. Exclude product, cart, and checkout pages from full-page caching, and if you're on a host with object caching, flush it and watch whether the problem pattern follows the cache lifetime.
Multichannel sync tools (Amazon, eBay, POS systems, marketplace feeds) write stock numbers on their own schedule. If one of them holds an older count, it can overwrite the correct number minutes after every sale, which looks exactly like "stock never updates."
Check the product's edit history if you log changes, or temporarily pause the sync plugin's stock write-back for one product and watch whether that product starts behaving. Bundles, composites, and booking plugins are also frequent offenders because they manage stock through their own layer.
Under WooCommerce → Settings → Products → Inventory there's "Hold stock (minutes)". Unpaid orders hold inventory for that long, then Woo cancels them and puts the stock back. Two ways this bites:
The default of 60 minutes is right for card-based checkouts. Change it deliberately or not at all.
Every failure on this page shares a trait: the storefront looks completely normal while it's happening. You find out from an oversell, an angry email, or a stocktake that doesn't add up. If the numbers matter to you, put the check somewhere a human actually looks: a weekly calendar reminder to compare wp-admin counts against reality beats discovering it a month late.
Stalled cron is the root of a surprising share of these, and it's one of the things Store Guardian watches from the outside: it emails you when your store's background heartbeat stops, along with orders stopping, checkout breaking, or the site going down. Free while in beta.
WooCommerce orders suddenly stopped? Work through these 7 checks
WooCommerce checkout not working: find the cause in 15 minutes