The signal in Stripe
The charge fails with do_not_honor or generic_decline. These are the issuer's way of refusing without a reason. The card might be fine tomorrow; the account might be closed; the bank might simply have declined to elaborate.
Why it happens
Generic declines are a catch-all: temporary holds, internal risk rules, account states the bank will not disclose. The honest answer is that you cannot know from the code alone, which is exactly why this play is built around sequencing information instead of assuming it.
What happens if you do nothing
Fixed-schedule retries treat an unknowable decline like a known one. Some recover by luck; the rest burn retry attempts and customer patience on a card that needed a different intervention entirely, usually a new payment method.
The play, step by step
Chaser, the Stripe-native failed-payment recovery tool, runs one spaced retry first, because a meaningful share of generic declines are transient. If that fails, the play switches from retrying to asking: the customer receives the branded update page with a note that their bank declined the charge without details, and the fastest fix is confirming the card or using another. Two failed cycles exhaust the sequence and the case lands in the attention queue, where the operator card shows everything tried so far.
The email that works
Honesty about the ambiguity reads as competence. "Your bank declined the charge without telling us why. The quickest fix is to confirm or swap your card here." No fake precision, no blame.
