Subscription revenue is supposed to be the predictable part of the business. Then you compare Stripe’s numbers against your subscriber count and find a gap: renewals failing quietly, week after week, in ways WooCommerce doesn’t exactly announce. On subscription stores we audit, it’s common to find 5-15% of renewal revenue leaking through the causes below.
1. Expired and declined cards (the biggest one)
Cards expire, get reissued after fraud, or simply decline. This is ‘involuntary churn’ and it’s typically half of all subscription cancellations. The subscriber didn’t choose to leave, their payment method did.
Fix: Turn on automatic card updates at the gateway (Stripe and most modern gateways update reissued cards silently), configure WooCommerce Subscriptions’ retry rules to space attempts over several days, and send pre-renewal ‘card expiring’ emails. Recovering even a third of involuntary churn is significant money.
2. Missing or broken payment tokens
Automatic renewals charge a stored token, not a card number. Tokens break when stores migrate gateways, change gateway accounts, or import subscribers without re-tokenizing. The symptom: renewals fail with ‘no payment method’ errors, and every affected subscriber has to re-enter their card, most won’t.
Fix: If this happened after a migration, the fix is a proper token migration with the gateway’s help (Stripe supports importing tokens from other processors). This is exactly why our store migrations plan the subscriber path first, one supplement brand moved 2,000+ active subscribers with 100% billing continuity.
3. WP-Cron not firing on schedule
Renewals run on WordPress’s scheduler, and WP-Cron only fires when someone visits the site. Low-traffic hours mean late renewals; caching layers that serve pages without touching PHP can starve cron entirely. Renewals pile up ‘pending’ and process in bursts, or not at all.
Fix: Disable WP-Cron’s page-load trigger (DISABLE_WP_CRON) and run a real server cron every 5 minutes. Any decent host sets this up in minutes. Then check Action Scheduler’s queue (WooCommerce → Status → Scheduled Actions) for a backlog of failed actions.
4. HPOS and legacy plugin conflicts
Stores that switched to High-Performance Order Storage sometimes carry an older payment or subscription-adjacent plugin that reads orders from wp_posts directly. Renewal orders get created where the plugin isn’t looking, and its part of the pipeline silently no-ops.
Fix: Check plugin HPOS compatibility declarations, and test a full renewal cycle on staging after any storage change. Our HPOS migration guide covers the sequence.
5. Gateway configuration drift
Someone rotates API keys, toggles test mode, or the gateway deprecates an old API version, and scheduled renewals start failing while regular checkout still works (because checkout uses newer code paths than the renewal machinery).
Fix: After any gateway change, trigger a manual renewal on a test subscription. Monitor the gateway dashboard for authentication errors, they show up there before they show up in WooCommerce.
6. Duplicate-site protection after cloning
A safety feature that bites: when WooCommerce Subscriptions detects the site URL changed (staging copy, domain move), it switches to manual renewals so a staging clone can’t double-charge customers. Correct behavior, but if it happens on production after a migration, automatic renewals just stop.
Fix: After a domain change, check WooCommerce → Settings → Subscriptions for the duplicate-site notice and confirm production status. Renewals resume once confirmed.
7. Dunning emails going to spam
When a renewal fails, recovery depends on the customer seeing the ‘payment failed’ email. Stores sending mail through unauthenticated WordPress mail() land in spam, and the recovery flow dies unseen.
Fix: Send transactional email through an authenticated service (Postmark, SendGrid, SES) with SPF/DKIM configured. Renewal recovery emails are revenue infrastructure, treat them like it.
Find out what you’re actually losing
Pull last quarter’s failed renewals (WooCommerce → Subscriptions, filter by failed/on-hold), multiply by your average subscription value, and annualize it. That number is what fixing this is worth. If it’s meaningful, our subscription infrastructure work starts with exactly this audit.
Subscription revenue leaking?
We audit renewal pipelines, fix the failure points, and set up monitoring so failures get caught in hours instead of quarters. Most audits find recoverable revenue in week one.