There is no costlier bug than a broken cart: traffic arrives, interest exists, orders do not. Here is the check order we use with clients.
1. Caching the cart (culprit no. 1)
The cache plugin saves the page and serves it to everyone — so the cart looks empty or shows someone else's state. Fix: exclude Cart, Checkout and My Account from caching. LiteSpeed Cache (on our servers) has a ready WooCommerce setting; elsewhere — add them manually to exclusions.
2. A plugin or theme conflict
The classic test: deactivate every plugin except WooCommerce, switch to a default theme (Storefront/Twenty), try an order. Works? Enable them one by one until it breaks — now you know which. Test on staging, not live.
3. A JavaScript error
If Add to cart or Place order does nothing: open the console (F12 → Console) and read the red error. Usually an old plugin fighting the new Woo version.
4. SSL and mixed content
Checkout requires https. If a resource loads over http, the browser blocks it — and the buyer sees a half-empty page. Check the padlock on the checkout page.
5. Required fields and countries
If you limited selling to certain countries and the buyer is outside — checkout silently refuses. WooCommerce → Settings → General → Selling location.
6. Server resources
Checkout is the heaviest page in a store. On overloaded shared hosting it can time out. If it happens at peak times — that is a sign for a stronger plan.
The rule above all
Place a TEST ORDER at least monthly, yourself, as an ordinary buyer — through to the confirmation email. Half of all broken carts are discovered by customers instead of the owner.