Order management in WooCommerce is mostly one screen, and the part worth understanding is what each status actually means, because the difference between them is what tells you whether to ship something.
What the statuses mean
Pending payment. The order exists and no payment has been confirmed. Do not fulfil.
Processing. Payment received, order not yet shipped. This is the queue you work from.
On hold. Awaiting payment by another route, bank transfer, cheque. Also not fulfilled.
Completed. Shipped, or delivered for a digital product. This is what triggers the customer's completion email and, for digital goods, releases the download.
Cancelled, refunded, failed. Self-explanatory, with the note that failed means the payment attempt failed rather than anything about the customer.
The distinction that costs money is pending versus processing. An order sitting in pending is not paid, and shipping against it is a loss.
Orders stuck in pending
Almost always the payment gateway's callback not reaching your site. The customer paid and the notification that moves the status never arrived.
Check the gateway's own dashboard: if it shows the payment as successful and your store shows pending, that is the cause. It is not a customer problem and the money is genuinely there.
The troubleshooting guide explains finding what is blocking the callback, usually a security plugin or firewall rule catching the callback URL.
Editing an order
Open the order to change items, quantities, addresses and totals. Two things to know.
Editing is only possible in some statuses. A completed order is locked, which is deliberate. The financial record should not move after the fact.
And changing an order does not change what was charged. Adding an item to a paid order does not collect more money; you have to handle payment separately. This is the source of a surprising amount of confusion.
Refunds
Issue refunds through WooCommerce rather than only in the gateway dashboard.
A refund made at the gateway alone leaves your store showing the order as paid, and the two records drift apart. Reconciling that at year end is genuinely unpleasant.
WooCommerce supports partial refunds and can restock the returned items at the same time, worth using rather than adjusting stock separately and forgetting one of the two.
Order notes
The notes panel holds two kinds. Private notes are internal. Customer notes are emailed to the customer.
They look similar on the screen and the difference is one dropdown, so it is worth being deliberate; an internal note about a customer sent to that customer is a bad afternoon.
Use private notes for anything a colleague would need to know: why a refund was issued, what a customer asked for, what you agreed. Six months later that is the only record of it.
Customers
Customer accounts hold order history and saved addresses. Guest checkout orders are not attached to an account, which is why the same person can appear several times.
Two obligations worth knowing. Customers can request a copy of their data or its deletion in many jurisdictions, and WordPress has built-in tools for both. Deleting a customer's personal data does not have to mean deleting the order record, and usually should not, tax retention requirements outlast the customer relationship.
Archiving old orders
Orders accumulate metadata heavily, and a large order table slows the whole store over time.
Archive beyond your legal retention period rather than deleting arbitrarily. Take a backup first, and check what your retention obligation actually is; it is usually years, and it is a poor thing to discover after a cleanup.
If the shop is moving to another server, orders arriving during the move are the thing to plan for. How to Migrate a WooCommerce Store Safely walks through closing that gap.
When orders are also flowing into another system, that link fails silently and nobody is told. For noticing, see WooCommerce Webhooks and Third-Party Integrations.
Find the orders that are not moving
Orders sit in intermediate states and nobody notices, because the list is sorted by date and the stuck ones are not recent.
wp db query "SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type='shop_order' GROUP BY post_status;"
wp db query "SELECT ID, post_date, post_status FROM wp_posts
WHERE post_type='shop_order' AND post_status IN ('wc-pending','wc-on-hold')
AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY post_date LIMIT 20;"
Anything pending for more than a few days is either a payment that never completed or one that completed without the store being told, and the two need opposite actions.
Held orders are worth reading individually. Each is stock reserved for somebody who has not paid, and on a shop with limited stock that is sales prevented rather than merely delayed.
Notes are the record you will want later
The note attached to an order is the only place where the reason for anything is written down.
Record what was decided and why: a refund and its cause, a delivery address corrected after a phone call, a discount applied by hand, a complaint and its resolution.
Six months later, a dispute over that order is answered from the notes or not at all. The customer facing note and the internal one serve different purposes, and using the internal one for anything you would not want quoted back is a habit worth forming.
The order table grows and is never reduced
Orders accumulate permanently, and on a busy shop the table becomes the largest thing in the database.
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_type='shop_order';" wp db size --tables --human-readable 2>/dev/null | head -8
The administration screens count and filter this table on every load, so its size is felt by whoever works in the shop rather than by visitors.
Old orders that will never be referenced can be exported and removed, keeping the export somewhere retrievable. Do that deliberately, with a retention period decided in advance, since order records are also financial records and the period is not entirely your choice. Database growth covers what else accumulates.