Notes
What each WooCommerce order status actually claims
Eight labels, and most shops use three. Failed is a decline rather than an abandonment, and draft exists only because of the block checkout.
5 min read
Every order in your store carries a label, and most shop owners learn three of them and ignore the rest. Although that works on a quiet week, it fails you the moment something odd starts happening, because WooCommerce order statuses are the cheapest diagnostic you own. So it is worth knowing exactly what each one claims, in WooCommerce's own words, before you read anything into a screen full of them.
There are eight. Two of them mean something quite different from what their names suggest, and one exists only because of the block checkout.
The eight WooCommerce order statuses
Straight from the WooCommerce documentation, with nothing added.
- Draft: "Draft orders are temporary checkout records used by the block-based checkout before an order is submitted."
- Pending payment: "The order has been received, but no payment has been made. Pending payment orders are generally awaiting customer action."
- Processing: "Payment has been received (paid), and the stock has been reduced. The order is awaiting fulfillment."
- On hold: "The order is awaiting payment confirmation. Stock is reduced, but you need to confirm payment."
- Completed: "The order has been fulfilled and is complete."
- Failed: "The customer's payment failed or was declined, and no payment has been successfully made."
- Cancelled: "The order was canceled by an admin or the customer."
- Refunded: "An admin or shop manager has fully refunded the order's value after payment."
Failed does not mean abandoned
Now for the first status people misread. Failed is a decline, not a departure. Because the definition says the payment "failed or was declined", somebody presented a card and a gateway said no.
So a shopper who reached your checkout, thought better of it and closed the tab does not produce a failed order. They produce nothing, or at most a pending one. Every failed row therefore represents a real attempt against your gateway, which is why a wall of them is worth reading rather than deleting.
Meanwhile pending payment sits at the other end of the same confusion. It means the order exists and the money does not, and it is the normal resting place for bank transfer and cheque orders. So a pending row is not a failure. It is a wait.
Draft, and why the block checkout needs it
Draft is the newest of the WooCommerce order statuses, and the one most likely to surprise somebody reading a database table for the first time.
The Checkout block creates a record before the shopper has committed to anything. So the store has somewhere to hang the basket while the shopper fills the form in. That record is a draft. It is not a sale, it is not an attempt, and it belongs in neither column.
Drafts exist because the block checkout submits through the Store API rather than a page. And the API needs an order to talk about before the customer finishes. So if your store runs the shortcode checkout, you will rarely see one.
On hold is doing more than it looks
On hold is quietly the most consequential status in the list, because of one clause: "Stock is reduced, but you need to confirm payment."
Stock leaves your shelf while the money has not arrived. For a store selling limited stock, therefore, a run of on hold orders is an inventory problem before it is a payments problem. And nothing chases them for you.
Reading a status column as evidence
Once the definitions are straight, WooCommerce order statuses start answering questions on their own. Three patterns are worth recognising.
- Many failed, few completed, all within minutes. Something is presenting cards rapidly, and the gateway keeps declining them. That is the shape of a card testing run rather than a bad day of trading.
- Many pending that never move. Either a payment method has the wrong settings, or something creates orders without ever paying for them.
- Drafts piling up with no matching orders. Sessions start at the block checkout and stop. Still worth checking before you conclude anything, because ordinary shoppers abandon baskets too.
None of these is proof on its own. But each one narrows the search, and the next place to look is the order itself, where the notes panel records what your gateway actually said.
What the list does not tell you
A status is a summary, so it drops detail by design.
First, it does not record how many payment attempts an order absorbed, because WooCommerce can reuse one order across several tries. Second, it never says which route created the order. And third, it says nothing at all about requests that never became orders, which is exactly where blocked automated traffic lives.
For that reason a quiet orders screen is not evidence of a quiet checkout. It is evidence of a quiet orders screen.
Where Checkout Bouncer fits
Checkout Bouncer works before a status exists. It scores the checkout request with Google reCAPTCHA v3 and stops the ones that look automated. So they never turn into a failed row, a draft, or a decline against your gateway. The plugin is free, GPL and listed on WordPress.org.
Its limits are worth naming. It guards the WooCommerce checkout only, never login, registration, comments or contact forms. Nor is it a firewall or a malware scanner. And it uses reCAPTCHA v3, never v2 or any other provider.
The full definitions live in the WooCommerce order statuses documentation, and they repay a read in full. If you would rather start with which checkout routes your store currently answers on, the free scanner takes about two minutes.