WooCommerce

WooCommerce Subscriptions Renewals Failing Silently

Renewals stopped, customers were not charged, nobody was told. How a renewal runs, the five places it breaks, and how to find the cause and recover payments.

6 min read
WooCommerceSubscriptionsDebugging
1,063 words6 min read

The quiet revenue leak

A store with a few hundred active subscriptions notices, weeks late, that renewal revenue has fallen. Subscriptions still show as Active. Customers have not complained, because they were not charged. There is no error on the dashboard. The renewals simply did not happen, and every week they do not happen is a week of revenue that is hard to recover.

WooCommerce Subscriptions renewals are a chain of scheduled, automated steps, and a break anywhere in it produces exactly this silence.

How a renewal is supposed to run

  1. When a subscription is created or renewed, Subscriptions schedules the next payment date as an Action Scheduler action (woocommerce_scheduled_subscription_payment).
  2. At that time, Action Scheduler runs the action.
  3. Subscriptions creates a renewal order, in pending status, and fires the gateway's scheduled payment hook with the saved payment token.
  4. The gateway charges the stored card or account and reports success or failure.
  5. On success, the renewal order completes, the subscription's next payment date advances, and a new action is scheduled. On failure, the subscription moves to On hold, a retry may be scheduled, and the customer is emailed.

Five steps, three systems (Subscriptions, Action Scheduler, the gateway). Here is where each breaks.

Break 1: Action Scheduler is not running

If the queue is stalled, the renewal actions sit as pending past their due date, and nothing happens. Subscriptions stay Active because the step that would change them never ran. This is the most common cause and the most silent.

Check: WooCommerce, Status, Scheduled Actions, filter by hook woocommerce_scheduled_subscription_payment. Past-due actions in numbers: this is it.

Fix: a server cron running wp action-scheduler run every minute. Once it runs, the backlog processes, and renewals that were due fire in sequence. Watch the gateway for a burst of charges and be ready for customer questions about the timing.

Break 2: the gateway's stored payment method is gone

Renewals charge a saved token. If the gateway integration was reconfigured (new API keys, switched from test to live, a gateway plugin replaced or reinstalled), the tokens stored against subscriptions may no longer resolve. The renewal order is created, the charge fails with "no payment method" or an invalid token error, the subscription goes On hold, and if the failure emails are also broken (see break 4), nobody knows.

Check: a renewal order in failed or pending state with an order note from the gateway about a missing or invalid token. The gateway's dashboard shows no charge attempt or a declined one with a token error.

Fix: depends on the gateway. Some can re-map tokens after a key change (Stripe's customer IDs survive within the same account; moving accounts does not). Otherwise, customers must re-enter payment details via the "Change payment method" link on their subscription. Subscriptions can send that request in bulk.

Break 3: the gateway does not support scheduled payments

Not every gateway supports the subscriptions and subscription_payment_method_change features. If a store switched gateway, or added a new one that customers chose at checkout, subscriptions created through a gateway without scheduled payment support require manual renewal: the customer is emailed an invoice and must pay it. If those emails do not go out, nothing happens.

Check: the subscription's payment method in the admin. "Manual renewal" or a gateway name with "manual" beside it.

Fix: move affected subscriptions to a supporting gateway via the customer's change-payment-method flow, or ensure the manual renewal invoice emails are actually sending.

Break 4: emails are not sending

Failure notifications, retry notices, manual invoices: all are WooCommerce emails, and if the store's mail is misconfigured (sent from the web server with no authentication, or a mail plugin's credentials expired) they land in spam or nowhere. A renewal failure that would have been fixed by a customer updating their card instead sits On hold indefinitely.

Check: WooCommerce, Status, Logs for the mail plugin, or send yourself a test renewal reminder. Check the transactional email service's dashboard for bounces.

Fix: proper transactional email with SPF, DKIM and DMARC, and confirm renewal emails specifically are enabled under WooCommerce, Settings, Emails.

Break 5: the subscription itself is in a state that will not renew

Subscriptions On hold, Pending cancellation or with a next payment date in the past and no scheduled action (the action was deleted, cleared with a "delete all actions" tool, or lost in a migration) will not renew on their own.

Check: WooCommerce, Subscriptions, filter by status. For Active subscriptions, compare next payment date with the scheduled actions list; a subscription with a next payment date and no corresponding action is orphaned.

Fix: Subscriptions has a tool (WooCommerce, Status, Scheduled Actions, and a "Fix missing renewal actions" option in later versions, or via WP-CLI) to reschedule. For On hold subscriptions caused by a fixed problem, reactivate and process the renewal manually from the subscription screen ("Process renewal" action).

Recovering missed renewals

Once the cause is fixed:

  1. Let Action Scheduler process the backlog; renewals fire in order.
  2. For subscriptions that went On hold, review the failure reason. Card problems need the customer; system problems can be reprocessed from the admin.
  3. Decide on the missed period. Charging customers for several missed months at once generates disputes; many stores charge the current period and write off the gap, with a short email explaining.
  4. Reconcile: subscriptions active versus renewals in the period versus gateway charges. The gap is the recovered revenue and the write-off.

Preventing the silence

  • Server cron for Action Scheduler. The single most important line.
  • A weekly report: renewals due versus renewals processed. Subscriptions' own reports or a saved query. A gap is visible in days, not months.
  • Renewal failure emails tested quarterly by triggering one on a test subscription.
  • After any gateway or key change, a test renewal processed manually before the next scheduled batch.
  • Subscriptions On hold reviewed weekly; each has a reason.

Where this sits

Subscription stores are where a stalled queue costs the most, because the revenue is automated and its absence is quiet. The cron, the weekly due-versus-processed check and the quarterly email test are on the care plan for every subscription store we look after, and the five breaks above are the diagnostic path for WooCommerce Subscriptions work when a store arrives having noticed the leak.

All writingHire me for this