ExeechainExeechain

Detect

  • Churn prediction0-100 daily, with the drivers
  • Customer health scoreThe three reasons, quoted
  • Revenue forecastNext quarter, defensible

Act

  • Retention playbooksDrafted per customer
  • Workflow automationWorkflows you compose
  • CopilotAsk about any account

Prove

  • QBR automationEight hours to thirty seconds
  • Revenue leak benchmarkSize the leak from your MRR, free
  • Retention intelligenceThe whole loop

Alternatives

  • vs Gainsight
  • vs ChurnZero
  • vs Vitally
  • vs Planhat
  • vs Totango

What they cost

  • Gainsight pricingEvery reported figure, sourced
  • ChurnZero pricingListed vs actually paid
  • Buyer's guideHow to choose

Connect

  • Stripe
  • HubSpot
  • Intercom
  • Zendesk
  • Mixpanel
  • Slack

Bring your own

  • API & CSVREST, webhooks, import
Pricing

Read

  • Documentation
  • Blog
  • Getting started

Look around

  • Live demoA seeded workspace
  • Churn calculatorLogo and revenue churn, annualised
  • NRR calculatorNet and gross retention
  • SecurityWhat we have, and don't
Sign inStart free
  1. Home/
  2. Failed payment recovery

Failed payment recovery

Failed payment recovery
that reads why the bank said no.

When a subscription charge fails, the decline code says whether charging the same card again can ever work. Most tools retry everything on the same schedule. Exeechain routes each failure by its code: retry the ones that can clear, ask for a new card where retrying is futile, and stop entirely where the issuer has blocked it.

View demoWhat involuntary churn is ›

Read-only to start. Connect Stripe and see the open invoices, the codes behind them, and what each one is worth.

The routing table

29 Stripe decline codes, four different answers.

This is the live classification Exeechain routes on, not an illustration. The only question it asks is mechanical: can charging the same card again ever work?

The card is fine, the moment was wrong

Retry can work. Timing is the only lever.

insufficient_funds

The card works, but the balance was short at the moment we charged it.

Retry near the next payday window. Do not ask for a new card yet.

card_velocity_exceeded

The card hit its spending or frequency limit.

Wait and retry. Repeated quick attempts will keep hitting the same limit.

withdrawal_count_limit_exceeded

The card exceeded its allowed number of withdrawals.

Wait and retry, or ask the customer to use a different card.

processing_error

A temporary processing error. Nothing is wrong with the card.

Retry shortly. This usually clears on its own.

try_again_later

The issuer asked us to try again later.

Retry shortly.

issuer_not_available

The issuing bank could not be reached.

Retry shortly. This is the bank being unreachable, not a refusal.

reenter_transaction

The issuer could not process it and asked for the charge to be re-submitted.

Retry shortly.

The card itself is unusable

No retry will ever clear. Ask for new details.

expired_card

The card has expired. Every retry will fail the same way.

Send a card-update link. Do not retry this card.

incorrect_number

The card number is wrong, so no charge against it can succeed.

Send a card-update link.

incorrect_cvc

The security code is wrong. Only the customer can correct it.

Send a card-update link so they can re-enter the card.

invalid_cvc

The security code is invalid.

Send a card-update link so they can re-enter the card.

invalid_expiry_month

The expiry month on file is invalid.

Send a card-update link.

invalid_expiry_year

The expiry year on file is invalid.

Send a card-update link.

invalid_account

The account behind this card is not valid.

Ask for a different payment method.

currency_not_supported

The card cannot be charged in this currency.

Ask for a card that supports the billing currency.

card_not_supported

The card does not support this kind of purchase.

Ask for a different payment method.

The issuer refused and will not say why

One retry is reasonable. After that, ask.

do_not_honor

The issuing bank refused and gave no reason. The card itself looks valid.

One retry is reasonable. If it fails again, a person should call them.

generic_decline

The bank declined without giving a reason.

One retry is reasonable. If it fails again, a person should reach out.

transaction_not_allowed

The bank does not permit this type of transaction on this card.

Ask for a different card. Retrying this one is unlikely to change the answer.

service_not_allowed

The bank does not permit this service on this card.

Ask for a different card.

authentication_required

The bank requires the cardholder to authenticate this payment.

Send a payment link so the customer can complete authentication themselves.

The issuer has blocked the card

Stop. Automated contact is inappropriate here.

lost_card

The card was reported lost. The issuer has blocked it.

Stop automated retries and outreach. A person should contact the customer.

stolen_card

The card was reported stolen. The issuer has blocked it.

Stop automated retries and outreach. A person should contact the customer.

pickup_card

The issuer has flagged this card and asked for it to be retained.

Stop automated retries and outreach. A person should contact the customer.

fraudulent

The payment was declined as suspected fraud.

Stop automated retries and outreach. Review before contacting anyone.

merchant_blacklist

The payment was blocked by a merchant-level block list.

Stop automated retries. Review before contacting anyone.

revocation_of_authorization

The cardholder revoked authorisation for recurring charges on this card.

Stop charging this card. Ask for explicit re-authorisation before any retry.

revocation_of_all_authorizations

The cardholder revoked authorisation for all recurring charges.

Stop charging this card. Ask for explicit re-authorisation before any retry.

stop_payment_order

The cardholder placed a stop-payment order on this charge.

Stop charging this card. This needs a conversation, not a retry.

Anything Stripe does not give a code for falls through to a conservative default: Exeechain says it does not know, rather than assuming the harmless case. What is deliberately absent from this table is any estimate of how often a retry succeeds. That is a measurement, not a constant, and it belongs to your book rather than to a vendor page.

The question is mechanical

Not how bad the failure is, but whether charging the same card again can ever succeed. Insufficient funds can clear. An expired card never will.

Retrying a dead card costs you

Every attempt on an expired or blocked card is a hard decline against your merchant account, and card networks price merchants on their decline ratio.

No recovery rate is claimed

How likely a retry is to succeed is a measurement, not a constant. Exeechain holds out a control group and reports what actually cleared.

Why generic dunning underperforms

One sentence for every failure
is the same as no diagnosis.

Most billing tools treat a failed charge as a single event: retry it a few times on a fixed schedule, send a chasing email, then cancel. That is the right handling for exactly one class of failure and the wrong handling for the rest.

A card short of funds on the 28th is not the same problem as a card that expired last month, and neither is the same as a card the issuer has reported stolen. The first needs better timing. The second needs the customer. The third needs you to stop.

Timing is the only lever that matters for a short balance

Nothing is wrong with the card. Retrying near the next likely payday is the fix, and Exeechain labels that as the heuristic it is rather than presenting it as a prediction.

An expired card cannot be retried into working

Stripe will keep scheduling attempts and every one will fail. The only useful action is a card-update link the customer can complete in one tap.

A blocked card is a stop signal, not a slower retry

Lost, stolen, fraudulent and revoked authorisations end automated contact. A person decides what happens next.

What Exeechain does with it

The invoice ledger, not a boolean.

Failed payments used to be a flag on a customer record, which is enough to say something is wrong and not enough to say what it is worth or what to do. Exeechain reads Stripe invoices directly, so a failure carries its amount, its attempt count, its decline code and its age.

That is what makes the queue orderable by money rather than by date, and it is what lets a save be attributed later: an invoice that moved from open to paid is a receipt, not an inference.

Cash, not annualised

An unpaid invoice is money that failed to clear. It is reported as cash and never multiplied into a yearly figure to make the number larger.

One-tap card update

A hosted link the customer opens without logging in, because the point of failure is usually a card, not an account.

Recovery is verified or it is not counted

The impact ledger records a recovery only when the invoice actually settles. Estimated value is kept in a separate tier and labelled.

Keep reading

Where to go next
from here.

Where to go next, depending on what you're trying to work out.

Involuntary churn›

Size the lane before you work it

Stripe integration›

What Exeechain reads from billing

Revenue leak benchmark›

Size the leak from your MRR

Customer success software›

The buyer guide for SaaS teams

FAQ

Questions buyers ask
before they book a call.

Why do Stripe payments fail?▼

Most failures fall into four groups: the balance was short, the card details are no longer valid (expired, wrong number, wrong CVC), the issuing bank refused without giving a reason, or the card has been blocked as lost, stolen or fraudulent. Only the first group reliably clears on a retry.

Can you retry a failed payment on Stripe?▼

Yes, Stripe can retry automatically and you can also retry an invoice manually. Whether you should depends on the decline code. Retrying an insufficient-funds decline is sensible. Retrying an expired card produces another hard decline and no revenue.

What happens if a Stripe subscription payment keeps failing?▼

Stripe exhausts the retry schedule you configured and then applies your chosen end state, usually cancelling or marking the subscription unpaid. Customers lost this way did not choose to leave, which is why the lane is worth working before the schedule runs out.

Does Stripe email the customer when a payment fails?▼

Stripe can send its own dunning emails. They are generic by design and identical for every decline code. Exeechain sends the action that matches the code instead, and never contacts an account where the issuer has blocked the card.

What failed payment recovery rate should I expect?▼

Exeechain does not publish one, and treats any vendor figure with suspicion. Recovery depends on your customers, your prices and your decline mix. What the product does instead is hold back a control group and report the difference, so the number you get is measured on your own book.

See the invoices
that failed this month.

Connect Stripe read-only. Every open invoice with its amount, decline code and age, before you change anything.

View demoSee pricing ›
From $299/mo·First scores in 15 minutes·Cancel any time

Not ready to switch? Run the free 60-second revenue leak scan and see what staying put costs.

ExeechainExeechain

Find the revenue you never decided to lose. Failed payments, cards expiring before renewal, and renewals slipping, by customer, with the dollars attached.

Product

  • Free revenue leak scan
  • Churn prediction
  • Health scores
  • Copilot
  • Playbooks
  • QBR automation
  • Forecast
  • Retention intelligence
  • Pricing

Integrations

  • Stripe
  • HubSpot
  • Intercom
  • Zendesk
  • Mixpanel
  • Slack

Free tools

  • Churn rate calculator
  • NRR calculator

Compare

  • vs Gainsight
  • vs ChurnZero
  • vs Vitally
  • vs Planhat
  • vs Totango
  • Gainsight pricing
  • ChurnZero pricing
  • Buyer's guide

Resources

  • Live demo
  • Blog
  • Failed payment recovery
  • Involuntary churn
  • API reference

Company

  • Contact

Legal

  • Privacy
  • Terms
  • Security
AES-256 at restTLS 1.2+DPA available
© 2026 Exeechain·Built for SaaS teams who take retention seriously.
Sign in