WooCommerce Subscriptions Not Renewing

WooCommerce Store Fixes

Recurring revenue that quietly stopped recurring.

datacram.com/fix/woocommerce-subscriptions-not-renewing
Likely causes, ranked
WooCommerce Subscriptions Not Renewing
WordPress cron not running reliablymost likely
Expired or updated cardscommon
The gateway no longer supports the stored tokencommon
A failed renewal with no retrypossible
Fix steps in this guide5
the causes explained below, most likely first
What you’re seeing

Renewal orders are not being created, or are created and immediately marked failed. Subscriptions sit as “on hold” or “pending cancellation”, and monthly revenue drops without any obvious event.

What it actually means

A subscription is a scheduled promise: on a given date, create an order and charge a stored payment method. Two things must work for that to happen — something must run on time, and the stored payment credential must still be valid.

In WordPress, the thing that runs on time is cron, and WordPress cron is not a real scheduler. It only fires when someone visits the site. On a quiet store, renewals scheduled for 3am can sit untouched for hours, or be missed entirely.

This failure is unusually costly because it is silent and compounding. Nothing errors on screen. Revenue simply drifts down while everything appears to be working.

What usually causes it

Most likely first.

  1. 1

    WordPress cron not running reliably

    Low traffic, a caching layer serving pages without hitting PHP, or cron disabled entirely. The most common cause.

  2. 2

    Expired or updated cards

    Cards expire constantly. Without account updater services or dunning emails, each expiry is a silent cancellation.

  3. 3

    The gateway no longer supports the stored token

    After a gateway change or migration, stored payment methods can become unusable for future charges.

  4. 4

    A failed renewal with no retry

    One decline marks the subscription on hold, and without a retry schedule it stays there permanently.

  5. 5

    Webhooks not reaching the site

    The gateway processed the payment but its confirmation never arrived, so the subscription was never marked paid.

How to fix it

Work through these in order. Take a backup before you change anything.

  1. Step 1Check scheduled actions

    WooCommerce, Status, Scheduled Actions. A long queue of pending or past-due actions means cron is not firing, and that is your answer.

  2. Step 2Replace WordPress cron with a real one

    Disable WP-Cron in wp-config.php and add a genuine server cron job hitting wp-cron.php every few minutes. This is the durable fix for scheduling.

  3. Step 3Verify gateway webhooks

    Check the gateway dashboard for failed webhook deliveries, especially after any domain or hosting change.

  4. Step 4Set up retries and dunning

    Configure automatic retry schedules and customer emails for failed payments, so one decline does not silently end a subscription.

  5. Step 5Audit on-hold subscriptions

    Go through the ones already stuck and recover them by hand. Every one is revenue that is currently sitting still.

When to stop and call someone

Call someone if scheduled actions are backing up on a store of any size, since it means every timed feature is unreliable, or if you have a queue of on-hold subscriptions — recovering those is time-sensitive, because the longer a customer goes unbilled the less likely they are to reinstate.

Frequently asked

Usually because WordPress cron is not running reliably, so the scheduled renewal never fires. WordPress cron only runs when someone visits the site, so a quiet store can miss scheduled tasks entirely. Replacing it with a real server cron job is the standard fix.

Open WooCommerce, Status, Scheduled Actions and look for pending actions with past-due dates. A growing backlog is clear evidence that scheduled tasks are not firing, and it affects renewals, emails, and every other timed feature.

For any store with subscriptions, yes — disable it in wp-config.php and add a genuine server cron job calling wp-cron.php every few minutes. This makes scheduling independent of visitor traffic and is more efficient under load.

The subscription is typically put on hold. Without a configured retry schedule and dunning emails, it stays there indefinitely and the customer is never billed again. Most lost recurring revenue is a single decline nobody followed up.

Enable your gateway's account updater service where available, so replacement cards are picked up automatically, and set up dunning emails asking customers to update details before expiry. Both are configuration rather than development work.

Free · AI-powered · Emailed to you

See exactly what’s holding your website back.

Get a free audit of your site — speed, SEO, mobile, and security — with the fixes that matter most, delivered as a PDF to your inbox.

Get my free audit
CallGet a quote