WooCommerce fixes / subscription card expired

WooCommerce Subscription Card Expired? Causes & Fix

A renewal was declined, the subscription is drifting toward On hold, and nobody raised a hand. Almost always the saved card expired or was replaced, and the off-session charge had nothing valid to bill. Here's how to confirm it and get the customer paying again.

Last updated: 16 Jul 2026 · ~7 min read

Quick answer

The most common cause is that the stored card expired or was reissued, so the off-session renewal charge was declined — typically with an expired_card or card_declined code at the gateway. WooCommerce Subscriptions then works through its failed-payment retry rules before giving up and putting the subscription On hold. The fix is to get the customer to add a new card, then process the renewal manually.

What an expired-card decline actually looks like

Renewals are off-session: nobody is at the checkout. WooCommerce asks the gateway to charge a saved token, the gateway looks at the card behind that token, sees an expiry date in the past (or a card the issuer has since replaced), and declines. No customer is present to be told, so the only trace is a failed renewal order, a gateway decline code, and — if retries are enabled — a queue of scheduled retry attempts.

From the owner's side, this is the quietest failure in the whole store. The subscription list still looks broadly healthy while retries run, and the money simply doesn't arrive. From the customer's side, nothing happened at all — unless a retry email reaches them, they have no idea their card is dead. That asymmetry is why expired cards bleed MRR for months before anyone notices the pattern.

The most common causes (most likely first)

  1. The saved card has passed its expiry dateThe gateway shows the declined renewal with an expired-card decline code, and the card's expiry month/year on the subscription is in the past. The plainest version of the problem.
  2. The issuer replaced the card, so the old token no longer worksThe card hasn't technically expired, but the charge is still declined — the customer was reissued a card after loss, fraud or a bank migration, and the stored token points at the dead one.
  3. The retry system is still running, so it looks like nothing is wrong yetThe renewal order is Pending or Failed, the subscription is On hold, and there are scheduled retry actions queued. The decline already happened; the store is just not finished admitting it.
  4. Retries are disabled, so a single decline ends the subscription immediatelyRenewal fails once and the subscription goes straight to On hold with no second attempt — check whether automatic retry is switched on at all in the Subscriptions settings.
  5. The retry emails are not reaching the customerRetries ran, the subscription is On hold, and the customer swears they were never told. The decline is real but the recovery path is broken — that's a mail-delivery problem sitting on top of a card problem.
  6. Automatic card updating is off or unsupported for that cardEvery expiry becomes a manual fire drill. Some gateways can pull reissued card details from the card networks automatically; if that feature is off, or the card brand isn't covered, every renewal after an expiry fails.

Where to look first

How many of these are quietly running right now?

That's the real question with expired cards — not this one subscription, but the other ones declining next month that nobody has looked at. Checking every saved card's expiry and every queued retry by hand is a spreadsheet job. DiagnosticIQ's free dashboard watches the renewal path, and Renewal Guard is built for exactly this failure: declined renewals, exhausted retries and subscriptions sliding to On hold, surfaced before the MRR is already gone.

Get the free plugin

Made by Prima Digital — the team behind this guide. Free forever; no card to install.

How to know you fixed it

Verify

The subscription shows a new card, the outstanding renewal order moves to Processing or Completed with a matching successful charge in the gateway, and the subscription returns to Active with the next payment date scheduled.

Frequently asked

Was the customer charged?

No. An expired-card decline means the gateway refused the charge — no money moved. Check the gateway for a successful charge before assuming otherwise; a failed renewal order with a decline note is exactly that, a failure.

Will the subscription cancel itself?

Not usually. Once retries are exhausted, WooCommerce Subscriptions puts the subscription On hold rather than cancelling it, so it can be recovered as soon as a working card is added. Some stores add their own cancellation rules on top, so check any automation you've configured.

Can I just update the card for them?

Only in limited ways — most gateways won't let you type a customer's new card into the admin, because you shouldn't be handling raw card details. The supported route is the change-payment-method link, which sends the customer to the gateway's own form.

Why didn't I hear about this?

Because nothing errors on the store side. The renewal order fails, the retry queue absorbs it, and unless you read failed-order emails or watch the subscriptions list, an expired card looks identical to a quiet month.

>_
John O'Keane — Founder, Prima Digital · LinkedIn
Contributions by David Zhang · LinkedIn
I build DiagnosticIQ, the WooCommerce diagnostic plugin, and expired-card renewal declines are the failure I've watched cost store owners the most money for the least noise.