How to create custom order statuses in WooCommerce
WooCommerce does not include a built-in custom-status editor. For a simple internal label, register the status with a small code snippet; for customer emails, automation, bulk actions and reporting, use a custom order status plugin.
- 01Decide what the status means
- 02Add the status with code
- 03Check the order editor
- 04Test the status transition
- 05Add emails and business rules
- 06Use a plugin for the fast route
What you need
- A WooCommerce store with administrator access
- A staging site or recent backup
- A child theme or small site-specific plugin for custom code
Decide what the status means
Choose a short, unambiguous label such as Awaiting shipment, Ready for pickup or In production. Decide whether it is only an internal workflow label or whether customers should see it and receive an email.
Do not use a custom status as a replacement for payment logic. WooCommerce treats statuses such as Processing and Completed as paid statuses by default, so a new status may not appear in sales totals or reports unless you deliberately add it to the relevant workflow and reporting rules.
Add the status with code
WooCommerce has no core admin screen for creating arbitrary statuses. The manual route requires two registrations: WordPress must know about the post status, and WooCommerce must include it in its order-status list. The standard pieces are register_post_status() on init and the wc_order_statuses filter.
Add this to a site-specific plugin or your child theme's functions file, not the parent theme:
add_action( 'init', function() { register_post_status( 'wc-awaiting-shipment', array( 'label' => 'Awaiting shipment', 'public' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true ) ); } ); add_filter( 'wc_order_statuses', function( $statuses ) { $statuses['wc-awaiting-shipment'] = 'Awaiting shipment'; return $statuses; } );
Use a unique key, keep it short, and include the wc- prefix in the registered status key. WooCommerce stores the status in a field limited to 20 characters, so an overlong key can fail when the order is saved.
Check the order editor
Save the code, clear any cache, then open WooCommerce > Orders and edit a test order. The new label should be available in the status selector. Save the order and confirm that the label remains after refreshing the page.
If it is missing, check for a PHP syntax error, a duplicated status key, or code placed in a file that is not loading. If the status appears but orders disappear from the All view, check that show_in_admin_all_list and show_in_admin_status_list are enabled.
Test the status transition
Move a test order from its current status to the new one, then check the order notes, customer account and admin order list. Also test a bulk update if your store relies on bulk processing.
A custom status does not automatically create a customer email, mark an order as paid, permit downloads, or include the order in every report. The transition itself is available to integrations through woocommerce_order_status_changed, but the email and business rules still need to be added separately.
Add emails and business rules
For a code-only setup, you need additional development for a dedicated WooCommerce email, conditional automation, payment rules, customer cancellation rules or reporting changes. Do not assume that changing the label will trigger the Completed or Processing email.
If you use a status-management extension, create the email under its status-email settings or WooCommerce > Settings > Emails, enable it, select the correct transition and send a test. A common Friday-afternoon failure is creating the status but leaving its email disabled; another is selecting the same status as both the starting and ending status, which cannot trigger a transition email.
Use a plugin for the fast route
For most stores, the faster route is to install WooCommerce Order Status Control, activate it, then open its settings and add the status with its label, slug, colour or display options, customer visibility and notification rules. You can then manage statuses from the dashboard instead of maintaining PHP.
It fits when you need custom statuses together with conditional automation, bulk updates, notifications and change logs. The manual code route is fine for one simple internal status, but a plugin is safer when the status affects customers, fulfilment staff, emails or reporting.
Let WooCommerce Order Status Control do it
Custom statuses, conditional automation, bulk updates, and notifications for stores needing more control than WooCommerce defaults.
Sources
- woocommerce.com /document/custom-order-status/?utm_source=openai
- developer.wordpress.org /reference/functions/register_post_status/?utm_source=openai
- woocommerce.github.io /code-reference/files/woocommerce-includes-data-stores-abstr…
- woocommerce.github.io /code-reference/files/woocommerce-includes-class-wc-order.ht…
- woocommerce.com /document/woocommerce-order-status-manager/?utm_source=opena…
Questions
- Can I create a custom WooCommerce order status without a plugin?
- Yes. You can register a WordPress post status with <code>register_post_status()</code> and add it to WooCommerce through the <code>wc_order_statuses</code> filter. Put the code in a site-specific plugin or child theme, and test it after WooCommerce updates. This gives you the label and selector, but not a complete email, automation or reporting system.
- Why does my custom status not appear in the order editor?
- The status usually is not registered in both places. WordPress needs the post status registration, while WooCommerce needs the same key added through <code>wc_order_statuses</code>. Also check that the key uses the expected <code>wc-</code> prefix, that the code runs on <code>init</code>, and that a PHP error has not stopped the file from loading.
- Will WooCommerce email customers when an order reaches a custom status?
- Not automatically in a code-only setup. WooCommerce has native emails for its standard status events, but a custom status normally needs a dedicated email class, a compatible status-management extension or custom code connected to the status-change event. If an extension supplies the email, enable it in WooCommerce email settings and confirm that the transition is configured correctly.
- Will custom statuses appear in WooCommerce Analytics?
- Not necessarily. WooCommerce Analytics and sales totals use specific paid or actionable statuses, so a custom status can be absent from revenue reports even though orders have that status. Review Analytics settings and the extension's reporting options, and decide whether the status should count as paid before adding it to reporting rules.
- What is the quickest way to manage several custom statuses?
- Use a custom order status plugin rather than maintaining several code snippets. WooCommerce Order Status Control is suited to stores that need custom statuses plus conditional automation, bulk updates, notifications and logs. You still need to test each transition, email and report because adding a status alone does not define what the rest of the store should do.