Order statuses are registered post statuses prefixed with wc-, which means a custom one is a core registration and the twenty-character post status limit applies.
add_action( 'init', function () {
register_post_status( 'wc-awaiting-stock', array(
'label' => _x( 'Awaiting stock', 'Order status', 'turkerdev' ),
'public' => false,
'show_in_admin_status_list' => true,
'label_count' => _n_noop(
'Awaiting stock <span class="count">(%s)</span>',
'Awaiting stock <span class="count">(%s)</span>',
'turkerdev'
),
) );
} );
add_filter( 'wc_order_statuses', function ( $statuses ) {
$statuses['wc-awaiting-stock'] = _x( 'Awaiting stock', 'Order status', 'turkerdev' );
return $statuses;
} );
Both steps are required and doing only the first produces a status that exists and never appears in the admin dropdown. Reports, emails and the payment gateways all switch on status strings, so a new one is invisible to every one of them until it is added to their lists explicitly. That is the real cost: a custom status is not a new state so much as a promise to update everything that enumerates states.