Most nonprofits find out a donor's card expired the same way the donor does: when the gift fails. The processor tries to run October's $25, gets a decline code, and now you're in recovery mode — chasing a payment that already broke, on a relationship that just got a little friction in it.

There's a quieter fix that almost nobody runs. The expiration date is printed on the card. Your processor knows it. Which means you know, weeks ahead of time, exactly which sustainers are about to hit a wall — and you can text them before the charge fails instead of after.

Full disclosure: I work for Ready, an SMS platform. I'm going to show you the flow using our tooling, but the logic works on anything that can read a card-expiry date and fire a scheduled text.

Pre-expiry is a different job than failed-payment recovery

These two get lumped together and they shouldn't be. They fire at different times, carry different emotional weight, and recover at different rates.

Failed-payment recovery happens after the decline. The gift already broke. The donor may not even realize it until you tell them, and now the message is inherently a little awkward — "hey, your donation didn't go through." We wrote a whole piece on doing that one well: 3% of your monthly donors' cards fail every month, and a silent text recovers two-thirds before they lapse.

Pre-expiry happens before anything breaks. The card is fine today. You're just giving the donor a heads-up that a card they used months ago is about to age out. No decline, no failure, no friction — just a helpful nudge from an org they already chose to support.

The second one converts better because it's not a recovery message at all. It's a courtesy. And courtesy from a nonprofit you gave money to lands very differently than a "payment failed" email lands from your gym.

The window: text 2–3 weeks before expiry, not the day of

Cards expire at the end of the month printed on them. A card marked 11/25 works through November 30 and dies December 1.

If your monthly charge runs on, say, the 15th, a card expiring in November has one more good pull (November 15) and then December's charge fails. So your pre-expiry text needs to land with enough runway for the donor to actually update — ideally before the last successful charge, so the whole thing resolves without a single failed pull.

A practical schedule:

  • ~21 days before the final good charge: first pre-expiry text. Soft, informational.
  • ~7 days before: one reminder, only to donors who haven't updated yet.
  • After that: stop. If they update, they drop out of the sequence. If they don't, they roll into your normal failed-payment recovery flow when December declines.

Two texts, maximum, on the pre-expiry side. This is a low-drama message and over-texting a happy donor about their credit card is how you earn a STOP you didn't need.

The compliance line you can't skip

A recurring donor gave you a phone number to process a gift. That is not automatically consent to text them marketing. It might not even be consent to text them a service message, depending on how your form was built.

Before you send a single card-updater text, the donor needs to have opted in to SMS with a checkbox that says so — separate from the donation itself. We broke down exactly what that checkbox has to say here: adding a phone field to your donation form isn't consent to text. A payment-related service text is on firmer footing than a fundraising appeal, but "firmer" isn't "skip the opt-in."

Ready records opt-in attestation on bulk and API sends, so you keep an audit trail of who consented and when. That trail is the thing you want to have if a donor ever disputes being texted. Compliance is still ultimately your responsibility — the tooling reduces exposure, it doesn't grant immunity.

Two more guardrails that run automatically once you're set up:

  • Quiet-hours enforcement. A pre-expiry text has zero urgency, so there's no reason for it to land at 9:40 PM. Ready holds sends outside permitted local hours based on the recipient's area, which keeps you inside TCPA quiet-window expectations without you managing time zones by hand.
  • Automatic STOP handling. If a donor replies STOP, they're opted out and it propagates so they can't be messaged again across campaigns. On a card-updater flow that's a feature: someone who wants to cancel their gift can just say so and you'll know.

The template pack

Keep these short. A single SMS segment is 160 GSM-7 characters; go over and it splits into 153-char pieces, and any emoji drops the limit to 70. On a service message like this you don't need emoji — plain text keeps you at one segment and reads more sincere anyway.

1. First pre-expiry notice (~21 days out)

Hi {FirstName}, it's {Org}. The card behind your $25 monthly gift expires soon. Update it here so your support keeps going: {Link}. Reply STOP to opt out.

That's 156 characters — one segment. Nice.

2. Reminder (~7 days out, non-updaters only)

{FirstName}, quick heads-up — your card expires this month and we'd hate for your monthly gift to lapse. 30 seconds to update: {Link}. Thank you for being here.

3. Confirmation (fires when they update)

Got it, {FirstName} — your card's updated and your monthly gift continues uninterrupted. Thank you for sticking with {Org}. It matters more than you know.

4. If they reply asking to pause instead

Totally understand, {FirstName}. I can pause your monthly gift — want me to hold it for a few months or cancel? Just reply PAUSE or CANCEL and I'll take care of it.

That last one matters. Some donors use the expiry moment to reconsider, and a two-way inbox that catches "pause" instead of forcing a hard cancel keeps the door open. Ready's conversations inbox lands those replies in-app (and in GoHighLevel for connected accounts), so a human can catch the nuance.

What this costs and what it saves

Say you have 3,000 active sustainers. Card expirations are spread across the year, so in any given month roughly 1/48 of your file is inside a two-year card's final month — call it ~60 donors/month realistically once you account for reissues and varied expiry dates.

  • 60 donors × 2 texts each = 120 segments/month
  • On Ready Standard: 120 × ($0.02 + $0.0045 carrier) = $2.94/month

For under three dollars you're proactively catching the sustainers most likely to silently disappear. If even 15 of those 60 would've otherwise lapsed on a failed charge, and each is worth $25/month — that's $375/month in gifts you protected, roughly $4,500/year, against a ~$35/year texting cost.

Even if half of those would've been recovered anyway by your failed-payment flow, you're still catching the ones who never open the "payment failed" email and just quietly churn. Compare that math against what it actually costs to raise $1 by text vs email and the pre-expiry text is one of the cheapest retention plays on the board.

Where it fits in your donor lifecycle

Card-updater texts aren't a campaign — they're plumbing. They run quietly in the background protecting revenue you've already earned. That frees your actual appeals to do the emotional work of asking and thanking, which is where your opt-out risk lives. Keep an eye on your overall cadence so a service text plus an appeal don't stack into fatigue — we mapped that in the ask-to-gratitude ratio that keeps opt-outs low.

And once you've saved a card, you've also confirmed a donor who's still engaged — a good candidate for the next step up. If you're running upgrade asks, the sustainer upgrade flow is the natural sequel.

The takeaway

The card expiry date is sitting in your processor right now, telling you exactly which sustainers are about to hit a wall. Reading it two weeks early instead of finding out via a decline code is the whole difference between a courtesy text and a recovery scramble.

Two texts, plain and short, gated behind real SMS consent, held to quiet hours, with a confirmation that closes the loop. Under three dollars a month for a mid-size file. If you want to see how the flow, quiet-hours enforcement, and consent tracking come together, take a look at Ready or start with 2,500 free credits and build the sequence against a small test segment first.