Retail orders are usually paid before they ship. Wholesale orders often are not: goods leave the warehouse on account, payment arrives on terms, and finance needs to know which is which. WooCommerce’s default statuses were not designed to describe that, so teams improvise — and improvisation is where stock and reporting errors creep in.
Name the states you actually have
Start with a whiteboard, not a plugin. List the real stages a B2B order passes through in your business. A common set looks like this:
- Unshipped, unpaid — confirmed, waiting to be packed.
- Shipped, unpaid — goods have left, invoice outstanding.
- Shipped, paid — finished from both an operations and a finance point of view.
If your team cannot agree on the list, no software will fix it. Once you can, give each state a clear name that both the warehouse and accounts understand.
Represent states as order statuses, not notes
Order notes and custom fields are easy to add but hard to filter. Statuses appear in the orders list, filters, bulk actions and reports. WooCommerce supports custom statuses: developers register a post status and add it to the list returned by the wc_order_statuses filter. Our free GP B2B Orders for WooCommerce plugin packages this approach with B2B statuses, bulk updates and an admin email notification.
Protect stock accuracy
Stock is where custom workflows most often go wrong. Decide explicitly when stock should be reduced — usually when goods are committed or shipped — and make sure moving an order between statuses cannot reduce it twice. Test the awkward paths: an order moved back from “shipped” to “unshipped”, a cancellation after shipping, a partial refund.
Keep finance and operations in the same picture
- Notify the right person when an order enters a B2B status, with the order number and a direct link.
- Make unpaid-but-shipped orders easy to list for credit control.
- Export filtered order tables for accountants instead of copying data by hand.
Exporting and sharing filtered order views is the problem our premium Advanced Order Tables plugin addresses, with role-based access so partners only see what they should.
Keep an audit trail
When several people touch the same orders and products, “who changed this, and when?” becomes a daily question. Status changes are already recorded in order notes; for product and stock changes, a dedicated log helps. Our Advanced Product Logs plugin records stock and status changes per product.
Check compatibility with order storage
New WooCommerce stores use High-Performance Order Storage by default since WooCommerce 8.2 (WooCommerce docs). Any code or plugin that touches orders should use WooCommerce’s order APIs rather than querying the posts table directly, so it keeps working regardless of the storage mode.
Pricing and customer-specific terms
Order statuses describe where an order is; they do not handle who pays what. Wholesale customers often have their own price lists, minimum quantities or payment terms. Keep those rules in one place — a role-based pricing setup or a dedicated B2B extension — and avoid adjusting prices by hand on individual orders, which makes reporting unreliable. Whatever you choose, document which customers are on which terms so new team members do not have to guess.
Common pitfalls
- Using “Completed” for shipped-but-unpaid orders, which hides outstanding invoices from finance.
- Reducing stock manually as well as automatically after a status change.
- Sending retail customer emails to trade customers who expect invoices instead.
- Creating so many statuses that nobody remembers what they mean.
Roll it out carefully
- Agree the statuses and stock rules with the team.
- Configure them on a staging copy with realistic test orders.
- Walk through every transition, including reversals and refunds.
- Train the team, then switch over at a quiet time.
Need a workflow that does not fit an off-the-shelf plugin? We build custom WooCommerce plugins and integrations.

