Guide
Stripe is not retrying your failed invoice. Here are the nine reasons why.
Last updated 16 August 2026 · written by Bruce McGinley, who builds RecoverFlow
Stripe states four of these outright: it does not retry when no payment methods are available, when the issuer returned a hard decline code, when the card is India-issued, or when the Connect account has been disconnected.
The other five are configuration. The invoice is on send_invoice, auto_advance is off, the retry schedule is finished, the subscription already moved to unpaid or canceled, or the payment is a local payment method whose retries are off by default.
Read next_payment_attempt on the invoice first. It answers whether there is a retry coming, and everything below explains why there is not.
On this page
Start with one field
Pull the invoice and look at next_payment_attempt. Stripe documents it as the time at which payment will next be attempted, and as null for invoices where collection_method=send_invoice.
If it holds a timestamp, Stripe does intend to retry and your problem is timing, not configuration. Wait for that moment and check again. If it is null, one of the nine below is true.
While you are there, note status and attempt_count. An invoice that is draft is not being collected at all. An attempt_count that keeps rising while nothing appears in your payments list is the signature of cause 2.
The four Stripe states outright
Stripe's Smart Retries page lists these as the conditions under which it does not retry payments. They are quoted, not inferred.
-
No payment methods are available. There is nothing to charge. Stripe retries against the first available payment method in a documented order: the subscription's
default_payment_method, then the subscription'sdefault_source, then the customer'sinvoice_settings.default_payment_method, then the legacycustomer.default_source. Check all four, in that order.There is a trap here worth knowing. Stripe says that when you update payment methods after a failed attempt, you should update the field where the previous payment failed. If the subscription has a
default_payment_methodand you only updatecustomer.invoice_settings.default_payment_method, Stripe carries on retrying the subscription's one. Your customer added a working card and nothing changed. -
The issuer returned a hard decline code. Nine codes stop execution:
incorrect_number,lost_card,pickup_card,stolen_card,revocation_of_authorization,revocation_of_all_authorizations,authentication_required,highest_risk_levelandtransaction_not_allowed. Readlast_payment_error.decline_codeon the failed PaymentIntent.Stripe is precise about what happens next, and it is not what most people expect: retries continue to be scheduled and
attempt_countcontinues to increment, but retries only execute after a new payment method is detected, and unexecuted retries do not create a new Charge. So the invoice looks busy while nothing is being attempted. Full breakdown of the nine. -
The payment card is India-issued. Check
card.countryon the payment method forIN. Recurring payments on India-issued cards run under the Reserve Bank of India's e-mandate rules, which require a registered mandate authenticated by the cardholder, a pre-debit notification at least 24 hours before each charge, and fresh authentication above 15,000 INR. Stripe cannot satisfy that with a silent background retry. Watch forpayment_intent_mandate_invalidandindia_recurring_payment_mandate_canceledon the PaymentIntent. -
The Stripe Connect account has been disconnected. If you are a platform, the merchant may have revoked you. Stripe sends
account.application.deauthorizedwhen a user disconnects your platform from their account. If you are the merchant and an app was retrying on your behalf, the same event is why it stopped.
The five that are your own configuration
None of these are failures. They are settings doing exactly what they say, usually set months ago by someone else.
-
collection_methodissend_invoice. Stripe documents the two values plainly: withcharge_automaticallyit attempts payment using the default source attached to the customer, and withsend_invoiceit emails the invoice to the customer with payment instructions. There is no card charge to retry, which is whynext_payment_attemptis documented asnullfor these. What you want instead is the unpaid invoice reminder, which is a separate setting and is covered in the free settings checklist. -
auto_advanceisfalse. Documented as controlling whether Stripe performs automatic collection of the invoice, and if false, the invoice's state does not automatically advance without an explicit action. An invoice created by your own code withauto_advanceoff will sit there indefinitely, correctly, forever. -
The retry schedule is finished. Stripe's wording is that after the final payment attempt, no further payment attempts are made, and that changing your subscription settings only affects future retries. Widening the window today does not give an already-exhausted invoice more chances. Check the configured schedule at Billing > Revenue recovery > Retries and compare it with
attempt_count. -
The subscription already moved on. When recovery fails, the subscription transitions according to your setting: cancel it, mark it
unpaid, or leave itpast_due. Theunpaidbranch is the one that confuses people, because Stripe documents that invoices continue to be generated and stay in a draft state. New invoices keep appearing and none of them are collected, which looks exactly like a broken retry engine. Readsubscription.statusandinvoice.statustogether. -
It is a local payment method and retries are off. Stripe is explicit that by default it does not automatically retry failed payments made with local payment methods. ACH Direct Debit, ACSS, Bacs, SEPA and both Australian and New Zealand BECS all need the Local payment methods section turned on. Even switched on, the allowances are small and the only retryable failure is insufficient funds.
The whole checklist in one table
| # | Cause | Field or setting to read |
|---|---|---|
| 1 | No payment method available | subscription.default_payment_method, subscription.default_source, customer.invoice_settings.default_payment_method, customer.default_source |
| 2 | Hard decline code | last_payment_error.decline_code, against the nine |
| 3 | India-issued card | card.country equal to IN, plus mandate status |
| 4 | Connect account disconnected | the account.application.deauthorized event |
| 5 | Manual collection | invoice.collection_method equal to send_invoice |
| 6 | Automatic advancement off | invoice.auto_advance equal to false |
| 7 | Schedule exhausted | invoice.attempt_count against your configured retry policy |
| 8 | Subscription already unpaid or canceled | subscription.status, and invoice.status of draft |
| 9 | Local payment method with retries off | the Local payment methods retry setting |
One more thing that looks identical and is not on the list
If you have ruled out all nine and attempts are still coming back failed without ever reaching the bank, check whether the attempt was blocked rather than declined.
Visa's rules broadly prohibit more than 15 retries of a single payment over 30 calendar days, and Stripe blocks subsequent retry attempts after the 15th on a Visa transaction where it judges a low chance of authorization. That charge reports an outcome.type of blocked with an outcome.reason of previously_declined_do_not_retry, while the error your code sees is a plain generic_decline. It is a different failure from every cause above, because here Stripe did schedule the retry and did try to send it.
This is easy to miss because it hides inside your most boring decline code. There is a full page on the reattempt budget, including why it is a separate limit from the nine codes.
Questions people actually ask
Why is next_payment_attempt null on my invoice?
Stripe documents it as null for invoices where collection_method is send_invoice. On an automatically collected invoice, null means no further attempt is scheduled: the retry schedule is finished, the invoice is no longer open, auto_advance is off, or the subscription has already moved to unpaid or canceled.
Does attempt_count going up mean Stripe is really charging the card?
No. Stripe documents that when a failure returns a non-retryable code, retries continue to be scheduled and attempt_count continues to increment, but retries only execute once a new payment method is obtained, and unexecuted retries do not create a new Charge. If attempt_count is climbing and no new charges appear, that is the reason.
Does Stripe retry failed ACH and SEPA payments?
It can, but not by default. Stripe states that by default it does not automatically retry failed payments made with local payment methods, and you turn it on in the Local payment methods section. The only retryable failure is insufficient funds, and the allowances are small: ACH Direct Debit is 2 retries over 40 days, SEPA, Bacs and Australia BECS are 2 retries over 30 days, and ACSS and New Zealand BECS are 1 retry over 30 days.
Why does Stripe not retry India-issued cards?
Stripe lists India-issued cards among the cases where it does not retry. Recurring charges on those cards fall under the Reserve Bank of India's e-mandate rules, which require a mandate the cardholder has authenticated, a pre-debit notification at least 24 hours before each charge, and fresh authentication above 15,000 INR. A silent background retry cannot satisfy any of that.
My subscription is unpaid and new invoices are not being charged. Is that a bug?
No. If your end-of-retry setting marks the subscription unpaid, Stripe documents that invoices continue to be generated and stay in a draft state. A draft invoice is never collected. That is the configured behaviour, and the fix is a decision about what you want to happen at the end of dunning rather than a change to the retry schedule.
Where this came from
Checked against primary sources on 4 August 2026. If Stripe changes something and this page has not caught up, tell us and it gets fixed.
- Stripe: Smart Retries — the source for the 8 tries in 2 weeks default, the configurable window, and the nine code list.
- Stripe: Invoice object, API reference — the field definitions for attempt_count, next_payment_attempt, attempted and billing_reason.
- Stripe: Subscription lifecycle and statuses — the source for every status definition quoted on this page.
- Stripe: India recurring payments — the RBI e-mandate rules behind Stripe not retrying India-issued cards.
- Stripe: Using OAuth with Standard accounts — the source for the account.application.deauthorized event.
If you would rather not build this yourself
RecoverFlow watches your Stripe account for failed subscription payments, stops retrying the ones that cannot succeed, and emails the customers whose card simply needs replacing. It charges 25% of what it can attribute to a specific action it took, with a $29 monthly floor and a $299 monthly ceiling, and the floor is waived for the first 30 days.
Before any of that, you can find out whether it is worth doing at all. Answer three questions in a reply and I will send back what your failed payments are probably costing you, how much of it is genuinely recoverable, and whether Stripe's own free features already handle it. No Stripe connection, no account, no card.
It is early. It is run by one person. If Stripe's own free retry settings are enough for you, use those instead, and the pricing page says exactly when that is the right call.
Get the free audit
Recover