WooCommerce just released a much-needed diagnostic layer to help store owners monitor their WooCommerce Subscriptions health, and if you have been running High Performance Order Storage (HPOS) recently, you need to listen up. We have all been there: a customer complains their subscription didn’t renew, you check the logs, and everything looks “fine”—except the renewal order never fired. These silent failures are a nightmare for recurring revenue.
The new Subscriptions Health Check tool, located under WooCommerce > Status > Subscriptions, is a direct response to a few messy bugs that cropped up during the HPOS transition. Specifically, it targets subscriptions that are stuck in “manual renewal” mode even when a valid payment token exists. Furthermore, it surfaces active subscriptions with missing payment dates or overdue renewals that somehow fell through the cracks of the Action Scheduler.
The HPOS Cache Gotcha: Why Renewals Failed
I honestly thought we had moved past major caching hurdles with HPOS, but it turns out there was a nasty race condition in save_dates(). On high-traffic stores, the OrderCache wasn’t being cleared properly after updating subscription dates. Consequently, any subsequent read in the same request returned stale data, causing the system to overwrite the “automatic” billing flag with the default “manual” state.
This is a classic example of why WooCommerce product object caching is so sensitive. If the baseline object is stale, your save() call becomes a no-op or, worse, a corruption vector. Here is a simplified look at the logic that was causing the “stale baseline” issue:
// The "Bad" Path: Stale data persists in the OrderCache
function bbioon_simulate_hpos_bug( $subscription_id ) {
$sub = wcs_get_subscription( $subscription_id );
$sub->set_requires_manual_renewal( false );
$sub->save(); // Bug 1: OrderCache wasn't invalidated here
// This second call would return the old "manual" state
$stale_sub = wcs_get_subscription( $subscription_id );
return $stale_sub->get_requires_manual_renewal(); // returns true (stale)
}
Maintaining Your WooCommerce Subscriptions Health
The Health Check tool does not just find victims of these specific bugs; it is an ongoing diagnostic layer. It classifies problems into three main tabs:
- Supports auto-renewal: Subscriptions flagged as manual even though the customer has a saved payment token on a gateway like Stripe or Square.
- Missing renewals: Active subs with no next payment date or a date stuck in the past without a matching order.
- All: A bird’s-eye view for general auditing.
One detail I appreciate is the “circuit breaker” functionality. If a scheduled scan fails repeatedly, it backs off instead of silently eating server resources. This is critical for stores with thousands of subscriptions where a long-running query could easily bottleneck the database.
What the Changelog Didn’t Tell You
When these bugs were originally fixed (WCS 6.1.0 and 6.3.0), they were labeled as HPOS compatibility tweaks. However, the downstream impact—subscriptions flipping to manual at checkout—wasn’t immediately obvious. This transparency gap is why this tool exists now. If you ran Subscriptions with HPOS enabled between October 2023 and May 2024, you should run a manual scan immediately via the “Run now” button.
Look, if this WooCommerce Subscriptions health stuff is eating up your dev hours, let me handle it. I’ve been wrestling with WordPress since the 4.x days.
Final Takeaway for Developers
Always verify your data stores. This entire ordeal highlights that even core-maintained plugins can struggle with cache invalidation when moving to new storage engines like HPOS. If you are building custom subscription flows, ensure you are using the latest WCS Developer Docs and explicitly clearing transients or object caches when performing bulk updates.