What an expired_card decline means on a Stripe renewal
Updated November 3, 2026
A renewal that fails with expired_card means the card on file has expired. Charging that same card again doesn't give it a new date. Here's what Stripe does on its own, what its card updater catches, and a short note you can send.
What the code means
When a subscription renews, Stripe charges a saved card without the customer in checkout. Stripe calls that off-session. The issuer decides, and its systems look at card data, including the expiration date (card declines). If the card has expired, Stripe shows the decline code expired_card: "The card has expired." The decline codes page says the customer needs to use another card.
The code is on the failed payment in the Dashboard. In the API, decline_code on the PaymentIntent's last_payment_error is the same reason, and outcome.reason on the charge uses decline codes too. Issuers put most declines in generic_decline, and they discuss the details only with the cardholder, so don't quote a code in the email. Other renewal codes are in the decline code guide.
Why it happens
A card carries an expiration date. When someone adds one, Stripe checks that the date isn't already in the past. That only says the date looked usable then. Once the date on file has passed, a renewal that still uses it can come back as expired_card.
The saved details can go stale earlier, too. Stripe's card docs say an issuing bank replaces the physical card when it expires or is reported lost or stolen. The Card Account Updater docs add cards that are reissued. The number, the expiry, or both can change. Stripe's payments optimization page says card numbers and expiration dates regularly change, and that outdated card information is a common source of declines for online businesses. It doesn't give a rate.
What automatic card updates catch
Stripe works with the card networks and automatically attempts to update saved card details when a customer receives a new card. Card Account Updater uses the updater services those networks offer: Stripe retrieves a new expiration date or a new card number and applies it to the saved payment method. If the number changes, the fingerprint changes. The payment_method.automatically_updated webhook includes the new expiration date and the last four digits.
That only works when the issuer participates and sends the new details. Stripe says support is wide in the United States, where it can update most American Express, Visa, Mastercard, and Discover cards issued there. Support in other countries varies, and Stripe says it isn't possible to identify which cards can be updated. A saved card can expire, or be replaced, and stay exactly as you stored it.
A brand change still needs the customer. If an update swaps the brand, for example Visa for Mastercard, Stripe says you must ask the cardholder for a new payment method. You can't charge that card for a renewal, which is a merchant-initiated payment, until they agree again.
The updater isn't a way for the customer to pick a different card. Through the API, updating a saved card can only change its name, billing address, expiration date, or metadata. A new number means deleting the card and creating a new one. Network tokens are separate: they can carry newer credentials only when the networks already have an update.
Why retrying the same card doesn't help
Stripe Billing can retry a failed subscription payment. Smart Retries uses an AI model to pick the times. The recommended default is 8 tries within 2 weeks, and you can set the window from 1 week to 2 months. A custom schedule allows up to three retries.
A retry charges the first saved method in this order: the subscription's default payment method, its default source, the customer's default payment method, then the customer's default source. It doesn't look for a card with a later expiry.
expired_card is not a hard decline. Stripe's list is incorrect_number, lost_card, pickup_card, stolen_card, revocation_of_authorization, revocation_of_all_authorizations, authentication_required, highest_risk_level, and transaction_not_allowed. For those, retries stay scheduled but only run after a new payment method is added. This code isn't among them, so a scheduled retry can still charge the saved card. That helps only if an update has already replaced the expiry or the number. If the saved details are still expired, the issuer is asked to approve the same card, and Stripe's next step is another card.
The charge can carry an advice code: try_again_later (a retry is allowed), do_not_try_again (don't reuse this card), or confirm_card_data (some detail was wrong). expired_card doesn't say which one you got. Stripe recommends no more than eight retries, because networks limit repeat attempts and extra tries can look like fraud. After the last attempt, your settings cancel the subscription, mark it unpaid, leave it past due, or pause it when it's eligible. See the past_due guide. An insufficient_funds decline can clear if the balance changes. An expiration date doesn't.
Before the date, and after the decline
The kinder note goes out before the renewal fails. In Stripe's customer emails, turn on Send emails about expiring cards. Stripe emails the customer one month before the card on file expires, when that card is their default payment method or default source. The link can go to a Stripe-hosted Customer Portal or to a page you host.
After a failure, turn on Send emails when card payments fail. Stripe emails the customer after each failed payment, says the recent subscription payment failed, and links them to update the payment method so a later attempt can succeed. Stripe names an expired card as one reason a customer might need that note. On the Stripe-hosted page, they can update the payment method for that subscription and pay outstanding invoices, if that applies. If they only update the method, Stripe uses it the next time a payment is scheduled. Stripe doesn't add the hosted link when the subscription is set to send the invoice manually.
The hosted link stops working if the subscription becomes canceled, incomplete_expired, or unpaid, or the current renewal period ends. Send the reminder while the subscription is still past_due. If you write your own, turn Stripe's failed-payment email off so the customer hears from one sender. More on that split is in Smart Retries vs dunning emails.
Don't email a Customer Portal session you created earlier. A new session expires after five minutes if unused, and within an hour of the last activity once opened. Link to a page that starts a fresh session, or use Stripe's own link. Update the method Stripe will retry. If the subscription has its own default payment method, changing only the customer's default leaves later attempts on the expired card. The portal's payment method update flow sets the new card as the customer's default, so check the subscription default too.
A message you can send
Say the card expired. Don't threaten to cancel, and don't invent a fee. One link, from an address you read.
About a month before the date on file:
Hi Sam, the card we have for your subscription expires next month. You can add the new one here, and it takes about a minute: [link]. Your plan stays the same. Thank you!
After the renewal fails:
Hi Sam, this month's payment didn't go through because the card we have on file has expired. You can add a new card here: [link]. Nothing else changes. Thank you!
Where Calmretry fits
Calmretry works on top of your own Stripe account. It doesn't replace Smart Retries or Stripe's card updater. It notices failed subscription payments, including ones declined because a card expired, and sends a short sequence of gentle reminders from you, each with a secure link to update the card. Emails stop when the invoice is paid, voided, or the subscription is cancelled. It never touches funds or card data. If you use it, turn off Stripe's failed-payment email so your customer hears from you once.
See your own failed payments, for free
Calmretry reads your Stripe account with a restricted, read-only key and shows the failed subscription payments from the last 90 days: what was paid later, what is still open, and the decline reasons. It never touches funds or card data.
Sources
- Stripe Docs: Decline codes
- Stripe Docs: Card declines
- Stripe Docs: How cards work (automatic card updates)
- Stripe Docs: Customer-initiated and merchant-initiated transactions (Card Account Updater)
- Stripe Docs: Payments optimization (card account updater)
- Stripe Docs: Automate payment retries
- Stripe Docs: Automate customer emails
- Stripe Docs: Customer portal
- Stripe Docs: Customer portal deep links