How to notify customers before their card expires on Stripe

A card expiring without the customer updating it is one of the silliest — and most frequent — causes of churn. The customer was happy with your product, paying reliably, and one day the card expires, the charge fails and, if they don’t act in time, the subscription cancels.

Most of the time the customer doesn’t notice until they lose access. And when they do notice, they often think «well, I was thinking of canceling anyway, if it doesn’t even work…» and don’t renew. You lost a customer to an expiration date.

The problem with waiting for the failure

The passive flow is: card expires, charge fails, Stripe tries a few times, emails the customer, you lose the subscription if they don’t react. This flow works for the most attentive customers but loses many along the way.

The active flow is: you notify before expiration. When the card has 30 to 45 days left, the customer gets a friendly heads-up: «your card expires soon, update it when you can to avoid losing access». The customer does it at a convenient moment (not mid-failure), and the problem disappears before it manifests.

The retention difference between both flows is huge. Proactive notices convert 60-80% of at-risk cards. Reactive notices convert 20-30%.

Information you have on Stripe and aren’t using

Stripe stores each card’s expiration date in the customer profile. That data is available through the API. All you need to do:

  • Walk your active subscriptions.
  • Read the card attached to each customer.
  • Detect those expiring in the next 30/45/60 days.
  • Generate notices to those customers.

Most Stripe dashboards do nothing with this data. It’s there, but unconsumed. Stripe’s own UI doesn’t put it in front of you usefully either.

What a good notice should look like

  • Clear and friendly: not «your card is about to expire, update it or you’ll lose access» in a threatening tone. Better: «we noticed your card expires on X, if you can update it you’ll make sure everything keeps working».
  • With direct action: a link taking the customer to the payment portal to update the card without having to hunt for it.
  • Not repetitive: notify once, at most twice before the date. If it passes and the charge fails, the recovery flow kicks in.
  • Informed: better if the business dashboard also shows the notice visibly, not just an isolated email.

The value of a banner in your own dashboard

Many Stripe business owners don’t know at any given moment how many cards are about to expire. A clear banner («12 cards expiring in the next 60 days») completely changes management. Lets you prioritize, see those customers’ profiles, run segmented sends if you want.

Without that banner, you discover the problem once the charge has already failed. With it, you see it early and act early.

Why rolling this by hand rarely pays off

The script itself is a few hours. The hard part comes later:

  • Maintaining it when Stripe changes something in its API.
  • Handling edge cases (cards on alternative processors, Link, Apple Pay — which don’t expire like a normal card).
  • Integrating with your email provider so notices ship with your style and from your domain.
  • Monitoring to know if something failed on a given day.

For a feature that runs once a day and on which a meaningful fraction of your retention depends, it’s better to use something that already has it solved.


Stripe Control automatically detects cards expiring in the next 60 days, shows them in a dashboard banner, and handles proactive notices to the customer. It also distinguishes normal cards (which expire) from methods like Link or Apple Pay (which don’t). Small piece, typically cuts involuntary churn by 10% to 25%.


Keep reading


🇪🇸 Leer este artículo en español