Ahosting Logo
Knowledge Base

Understanding WooCommerce Order Statuses

Two statuses that look similar and mean opposite thingsProcessingPending paymentPaymentsucceedednot confirmedYou owe the customeryes: fulfil itnothing yetStockreducedoften held, not soldIf ignoredan unfulfilled paid orderstock held for nobodyPending orders that are never cleaned up hold stock indefinitely, which is how a shop runs out of something it stillhas.

Every WooCommerce order carries a status, and the status is not decoration. It decides whether stock is reduced, whether emails are sent, and whether the order appears in the list your staff work from.

Most order confusion in a shop comes from two statuses that look similar and mean opposite things.

The two that get confused

Processing means payment succeeded and you owe the customer something. This is the working queue.

On hold means you are waiting for payment. Stock is reserved and no money has arrived.

A bank transfer order sits at on hold until you confirm the money landed. A card order goes straight to processing.

The failure this produces is shipping an on-hold order because it looked like a normal new order in the list. Set up your view so the two are visually distinct, and train anyone packing orders on the difference.

The rest of the set

Pending payment. The order was created and checkout was never completed. These accumulate and most are abandoned carts rather than real orders.

Completed. Fulfilled. Sends the customer the completed-order email, which is what delivers downloadable products.

Cancelled. Ended before fulfilment, by you or the customer. Restores stock.

Refunded. Money returned. Note that it does not restock automatically. That is a separate tick when you process the refund, and forgetting it is the quiet cause of stock drift. Inventory and stock management has the detail.

Failed. Payment was attempted and declined, or the gateway errored.

Draft. A checkout in progress that has not been submitted. Not an order yet.

When stock is actually reduced

Worth knowing precisely, because it explains overselling.

Stock is reduced when the order moves to processing or completed, not when the customer adds to the cart, and not while they are on the checkout page.

So two customers can be buying the last item simultaneously, and the second finds out at payment. WooCommerce holds stock briefly during checkout to narrow that window; it does not eliminate it.

Cancelled and failed orders restore stock. Refunded orders do not, unless you tick the box.

Which statuses send email

Each transition can trigger a message, and the defaults are worth reviewing rather than assuming.

Processing and completed both email the customer. Failed, cancelled and on hold notify the administrator. The completed email is the one carrying download links, so a shop selling digital goods must move orders to completed instead of leaving them at processing.

A shop where customers say they never received their order confirmation is usually a mail delivery problem in place of a status problem. Fixing WordPress email not sending deals with telling those apart, and it matters more here than anywhere else on a site.

Pending orders pile up

Most pending-payment orders are people who reached checkout and left. They are not lost sales you can recover from the order list, and they clutter it.

WooCommerce can cancel them automatically after a set period. An hour is reasonable: long enough for a slow bank redirect to finish, short enough to release reserved stock.

Be careful raising it. Pending orders hold stock, so a long window on a low-stock product blocks real customers from buying.

Custom statuses

Plugins can add statuses for stages the defaults do not cover: "awaiting stock", "ready for collection", "sent to supplier".

These are genuinely useful in a shop with a real workflow, and they carry a cost: reporting, integrations and any other plugin that reads order status may not recognise them. A custom status can silently drop orders out of a sales report.

Add them when the workflow needs them, and check that your reporting still counts what you expect afterwards.

Changing a status by hand

You can set any status from the order screen, and it takes effect immediately, including the stock movement and the email.

Two consequences people meet the hard way. Marking an order completed sends the completed email, so bulk-updating old orders emails every one of those customers. And moving an order to processing reduces stock again if it was already reduced.

Test on one order before doing anything in bulk.

Reading the order notes

Every status change is recorded in the notes panel on the order, with a timestamp and whether it was automatic or done by a person.

Gateway responses appear there too. When a customer says they paid and the order shows failed, the notes contain the gateway's actual reason, and that is usually specific enough to resolve the conversation immediately.

Read the notes before investigating anything else. The WooCommerce troubleshooting guide goes into the wider set of faults.

A working process

Filter the order list to processing and work from that. Move to completed when it ships. Check on hold separately, because those are waiting on you rather than on the customer. Let pending cancel themselves.

That is four rules, and following them means the order list is a queue of real work instead of a mixed pile that needs interpreting every morning.

Two of these states look similar and mean opposite things, and confusing them cancels paid orders. There is more on the distinction in How to Handle Failed and Pending Payments.

Find the orders sitting in the wrong state

Statuses are set automatically and occasionally stop being updated, leaving orders that nobody is looking at.

wp db query "SELECT post_status, COUNT(*), MIN(post_date) FROM wp_posts
  WHERE post_type='shop_order' GROUP BY post_status;"

Read the oldest date in each state. An order held for months is either a payment that never arrived or a fulfilment nobody completed, and both need a decision rather than continued waiting.

The count matters for stock as well. Orders in states that reserve stock without being paid are inventory removed from sale for customers who are not buying.

Changing a status by hand skips what it normally triggers

Setting an order complete from the list makes the record look right and runs none of the work the transition normally does.

Stock is not adjusted. The confirmation is not sent. Any integration waiting for that transition never hears about it, so a delivery is not booked and an accounting record is not created.

wp db query "SELECT COUNT(*) FROM wp_woocommerce_order_items WHERE order_id = 1234;"

Where the transition is genuine, use the store's own action for it rather than editing the field. Where you are correcting a mistake, note in the order what was changed and why, since the absent side effects will confuse whoever reads it later.