When managing orders in WooCommerce, sometimes the default order statuses (like pending, processing, or completed) just aren’t enough. You might need a custom status such as “Awaiting Confirmation”, “Refund Approved”, or “Packing” to better match your business workflow.

In this guide, you’ll learn exactly how to add custom order statuses in WooCommerce, display them in the admin, and even make them usable in bulk actions and reports.

Why Use Custom Order Statuses?

Here are some common use cases:

  • Add an “Exchange Requested” status for return processes.
  • Use a “Ready for Pickup” status for local store pickups.
  • Add a “Invoice Sent” status to track billing actions.

Adding custom statuses helps improve order tracking, communication with customers, and team workflows.

Step 1: Register Your Custom Order Status

Use the register_post_status() function to add a new status to WordPress:

function my_register_custom_order_statuses() {
    register_post_status( 'wc-awaiting-confirmation', array(
        'label'                     => 'Awaiting Confirmation',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Awaiting Confirmation (%s)', 'Awaiting Confirmation (%s)' )
    ) );
}
add_action( 'init', 'my_register_custom_order_statuses' );

This creates a new status called wc-awaiting-confirmation with a label that will appear in the WooCommerce admin.

Step 2: Add Status to WooCommerce Status Dropdowns

Next, add your custom status to WooCommerce’s list of order statuses:

function my_add_custom_status_to_order_statuses( $order_statuses ) {
    $new_statuses = [];

    // Insert our custom status after 'wc-processing'
    foreach ( $order_statuses as $key => $label ) {
        $new_statuses[ $key ] = $label;

        if ( 'wc-processing' === $key ) {
            $new_statuses['wc-awaiting-confirmation'] = 'Awaiting Confirmation';
        }
    }

    return $new_statuses;
}
add_filter( 'wc_order_statuses', 'my_add_custom_status_to_order_statuses' );

Now you’ll see your new status in the Order Edit screen dropdown.

Step 3: Set Custom Status via Code

If you want to set the custom status programmatically (for example, after payment or refund):

$order = wc_get_order( $order_id );
$order->update_status( 'awaiting-confirmation' ); // No "wc-" prefix needed here

Optional: Make the Status Available for Bulk Actions

If you want to enable bulk changing to your custom status in the orders list:

function my_add_bulk_action_custom_status( $bulk_actions ) {
    $bulk_actions['mark_awaiting-confirmation'] = 'Change status to Awaiting Confirmation';
    return $bulk_actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'my_add_bulk_action_custom_status' );

Optional: Add Custom Status Icon or Color in Admin

To add a custom icon or color, use CSS in your admin:

add_action( 'admin_head', 'my_custom_order_status_css' );
function my_custom_order_status_css() {
    echo '<style>
        .status-wc-awaiting-confirmation {
            background: #f0ad4e !important;
            color: white !important;
        }
    </style>';
}

Bonus: Check for Custom Status in Your Code

You can check for the status like this:

if ( $order->has_status( 'awaiting-confirmation' ) ) {
    // Do something
}