How Do I Add a Custom Order Status to WooCommerce?
How to Register a WooCommerce Custom Status
A custom order status is registered as a WordPress post status, then added to WooCommerce's known list of order statuses via a filter so it appears correctly in the admin order screen's status dropdown and reporting logic.
add_action( 'init', function() {
register_post_status( 'wc-awaiting-approval', [
'label' => 'Awaiting Approval',
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Awaiting Approval (%s)', 'Awaiting Approval (%s)' ),
] );
} );
add_filter( 'wc_order_statuses', function( $statuses ) {
$statuses['wc-awaiting-approval'] = 'Awaiting Approval';
return $statuses;
} );
The Harder Design Decisions
- Where the new status fits in the existing sequence — does it come before Processing, replace part of it, or sit alongside existing statuses for a specific workflow branch?
- Whether it should trigger customer or admin emails, which needs its own explicit email template and trigger hook, since a custom status has no automatic email tied to it by default.
- Whether it should count toward sales reports and analytics, which needs explicit inclusion since WooCommerce's default reporting logic only recognizes its own built-in statuses.
- How stock behaves at this status — should it reduce, hold, or remain untouched, which needs to align with the store's actual fulfillment logic.
Implementing It Properly
- Register the status and add it to the order statuses filter as shown above.
- Map out exactly how emails, stock, and reporting should behave at this status before writing that supporting logic.
- Test the full order lifecycle including transitions into and out of the new status.
Need a custom order workflow designed and built properly? See custom WooCommerce development.