Order management is the plumbing of a WooCommerce store: invisible when it works, expensive when it doesn't. This is a map of how an order actually moves through the system, where invoices and downloads hook into that movement, and the edge cases that break naive implementations.
The order lifecycle
A WooCommerce order walks through statuses: pending → processing → completed, with branches for on-hold, cancelled, refunded and failed. Each transition fires actions (woocommerce_order_status_changed and friends) that the rest of the system — emails, plugins, portals — listen to. Understanding this list is 80% of debugging order behavior.
HPOS, briefly
Since WooCommerce 8, orders can live in dedicated tables (High-Performance Order Storage) instead of the posts table. For store owners this is invisible; for developers it changed the rules: direct WP_Post queries break, while anything going through CRUD functions — wc_get_order(), $order->get_items() — keeps working. HPOS compatibility is now the first compatibility question to ask any order-touching plugin, which is why we test against HPOS stores on every release.
Where invoices attach
An invoice is a view of an order: numbers, tax lines, payment status, branding. It should be generated on demand from live order data, not stored as a snapshot that drifts when the order changes. The generation points that matter:
- Customer self-service — a Download Invoice action on every paid order. This alone removes the document-request ticket category.
- Admin — bulk or single, for accounting workflows.
- Email attach — optional, on completion; note that attachments inflate mailboxes and some providers distrust them.
Tax display is where invoice plugins earn their keep: per-rate lines, correct handling of discounts, and currency formatting from WooCommerce settings rather than reinvented.
How downloads actually work
Digital products grant download permissions per order: the order stores which files the customer may fetch, how many times, and until when. The common failures are all permission-shaped:
- Downloads granted on payment only — but a gateway marks “processing” before capture, so the file isn't there yet.
- Expiry counted from order date, surprising customers who bought months ago and lost the file last week.
- Remaining-download counters hit zero from the customer's own legitimate re-installs.
A good account surface shows the honest state — remaining downloads, expiry date — instead of a bare link that 404s, as covered in the account checklist.
A refund isn't just a status: it revokes download permissions, may convert to store credit, adjusts tax reporting, and (if you're kind) keeps the invoice accurate. Test your refund path end to end, not just the happy path.
What the customer sees
All of this machinery compresses, on the customer's side, into one screen: their orders with statuses they understand, invoices they can print, files they can fetch. That's the division of labor — WooCommerce manages the order; the portal manages the experience of it. The WooAccount order, invoice and download surfaces are built exactly along that seam, and the demo runs a full lifecycle with fake data you can inspect.