Until 2.2, an order’s status was a term in a shop_order_status taxonomy. From 2.2 it is a custom post status with a wc- prefix, and the upgrade routine migrates the terms across. Every report, integration and cron job that filtered orders with a tax_query keeps running afterwards and returns nothing.
// 2.1 and earlier — a taxonomy term
$orders = get_posts( array(
'post_type' => 'shop_order',
'tax_query' => array( array(
'taxonomy' => 'shop_order_status',
'field' => 'slug',
'terms' => array( 'processing' ),
) ),
) );
// 2.2 — a post status, prefixed
$orders = get_posts( array(
'post_type' => 'shop_order',
'post_status' => array( 'wc-processing', 'wc-on-hold' ),
) );
$order->get_status(); // 'processing' — the accessor strips the prefix
The taxonomy stays registered and empty, which is why nothing errors: the query is valid, it simply matches no terms, and a nightly report goes quiet for a fortnight before anyone notices. The prefix rule is the other trap — anything comparing a raw post_status from the database needs wc-, and anything going through get_status() or has_status() must not have it, because the accessor removes it. wc_get_order_statuses() is the authoritative list and is worth reading from rather than writing the strings in six files. Before upgrading a shop with a few hundred thousand orders, note that the migration runs as a sequence of admin requests against the whole order table; take the backup, and watch it rather than starting it and closing the tab.