Why Is My WooCommerce Subscription Renewal Not Working?
Why This Happens
WooCommerce Subscriptions renews a subscription through WordPress's scheduled-action system (Action Scheduler), which fires a renewal at the scheduled time, generates a renewal order, and asks the original payment gateway to charge the stored payment method automatically. A renewal can fail at any one of those three steps, and each has a different cause and a different fix.
The fastest way to narrow it down is the subscription's own order notes (WooCommerce → Subscriptions → open the subscription → Order notes panel). WooCommerce Subscriptions writes a note at every stage of the renewal attempt, including the gateway's own decline reason when a payment fails — that single log entry usually tells you which of the causes below actually applies, rather than guessing.
Common Causes
- Declined or expired card. By far the most common cause. The stored payment method on file has expired, hit its limit, or the issuing bank declined the specific transaction.
- Action Scheduler not running. Renewals depend on WP-Cron (or a real server cron job calling
wp-cron.php) firing on schedule. A site with very low traffic, an aggressive caching setup, or a disabled WP-Cron will silently miss scheduled renewals. - Payment gateway API changes or outages. A gateway plugin update, an expired API key, or a temporary outage on the gateway's side can cause every renewal attempt to fail at once, not just one customer's.
- Plugin or theme conflict. A plugin hooking into the checkout or order-creation process (fraud-prevention plugins are a frequent culprit) can interrupt the renewal order before payment even gets attempted.
- Subscription or customer account changes. A subscription that was manually edited, a customer account that got deleted or merged, or a product that was changed after the subscription started can all break the data the renewal process expects.
- Database or meta corruption. Rare, but a renewal can fail if the subscription's own meta data (next payment date, linked order IDs) gets out of sync — usually after a bad import, a failed migration, or another plugin writing to the same post meta.
How to Fix It
- Read the order notes first. This step alone resolves most cases, because the gateway's decline reason ("insufficient funds," "expired card," "do not honor") tells you immediately whether this is a customer-side payment problem or something on the site.
- Confirm Action Scheduler is actually running. Go to WooCommerce → Status → Scheduled Actions and check whether pending renewal actions are stuck in "pending" past their scheduled time. If they are, WP-Cron isn't firing — usually fixed by setting up a real server cron job to call
wp-cron.phpon a fixed interval instead of relying on site traffic to trigger it. - Test the payment gateway independently. Place a small manual test order using the same gateway to confirm it's processing payments at all right now, separate from the subscription renewal logic.
- Check for a recent plugin or theme update. If failures started right after an update, temporarily deactivate suspect plugins (fraud/security plugins first) on a staging copy and re-test a manual renewal.
- Retry the renewal manually. From the subscription's admin screen, WooCommerce Subscriptions provides a manual "Process renewal" action, which reruns the charge attempt without waiting for the next scheduled cycle — useful for confirming a fix actually worked.
If renewals are failing for many customers at once rather than one at a time, treat it as urgent: that pattern almost always means the gateway integration or the scheduler itself is broken, not that a batch of cards all happened to expire together.