Stripe past_due vs unpaid vs canceled explained | RecoverFlow

Guide

past_due, unpaid, canceled: what each Stripe subscription status means

Last updated 28 July 2026 · written by Bruce McGinley, who builds RecoverFlow

Short answer

past_due means the latest finalised invoice failed or was not attempted, and Stripe is still working on it. unpaid means Stripe has finished retrying, kept the subscription alive, and stopped attempting payment. canceled is terminal and cannot be updated.

Which of the three you end up in when the retry window closes is not fixed behaviour. It is a choice in your Stripe subscription settings, and most people have never looked at it.

Every status, and what Stripe means by it

StatusWhat it means
trialingIn a trial period. Safe to provision the product. Moves to active automatically on the first successful payment.
activeIn good standing. Worth knowing: this does not mean every outstanding invoice has been paid. Paying the latest invoice on a past_due subscription, or marking it uncollectible, flips it back to active.
incompleteThe first payment has not succeeded yet. The customer has 23 hours to complete it, including any authentication step.
incomplete_expiredThe 23 hours ran out. These subscriptions never bill. The status exists purely so you can count customers who failed to get started.
past_duePayment on the latest finalised invoice failed or was not attempted. Invoices keep being created. Retries are still happening.
unpaidThe latest invoice is unpaid but the subscription is still there. Invoices keep generating. Payments are no longer attempted.
canceledTerminal. Automatic collection on unpaid invoices is switched off (auto_advance=false). This state cannot be changed.
pausedA trial ended with no payment method on file and your trial settings said pause rather than cancel. No further invoices are created.

The distinction that costs people money is past_due against unpaid. Both look like "they owe us". Only one of them still has Stripe working on your behalf.

Why a first payment fails differently from a renewal

A failed first payment does not produce past_due. It produces incomplete, and the customer gets 23 hours before it becomes incomplete_expired and stops mattering forever.

That short clock is the argument for treating signup failures as a completely separate problem from renewal failures. A renewal failure has weeks of retries and dunning emails ahead of it. A signup failure has less than a day, and after that the record just sits there as evidence that someone tried to buy from you and could not.

Worth checking: count your incomplete_expired subscriptions. Every one is a customer who chose you, entered a card, and did not get through. That is a different and usually more fixable problem than churn.

The three things that can happen when retries run out

When the retry window closes on a past_due subscription, Stripe does one of three things, and you choose which in your Dashboard subscription settings:

None of these is obviously right. Cancelling keeps your subscriber count honest and your Stripe data clean. Marking unpaid keeps the door open for a customer who reappears in three weeks with a new card. Leaving it past due keeps charging, which is either persistence or harassment depending on how long you leave it.

When to actually cut off access

Stripe's own guidance is unusually direct here: revoke access to your product when the subscription is unpaid, because by that point payments have already been attempted and retried while it was past_due.

That is a sensible default and it is worth understanding why. Cutting access the moment a payment fails punishes a customer whose bank happened to decline on a Tuesday and who will pay fine on Thursday. Never cutting access means an expired card buys somebody a free year. The unpaid boundary sits where Stripe has genuinely exhausted the automated options, which is the natural point for a human decision.

If you leave subscriptions past_due forever, you have no such boundary and you will have to invent one in your own code.

How to read this from the API

The subscription's status field carries all of this. For the invoice side, next_payment_attempt tells you when Stripe will try again, and it is null when the invoice is set to collection_method=send_invoice rather than automatic charging.

If you want the fuller picture of which fields to watch and which webhooks announce these transitions, that is covered in the webhooks guide.

Questions people actually ask

What is the difference between past_due and unpaid in Stripe?

past_due means the latest finalised invoice failed and Stripe is still retrying it on schedule. unpaid means retrying has finished, the subscription is still in place, invoices keep generating, but no further payment attempts are made. past_due is an active process; unpaid is a resting state.

Does a Stripe subscription cancel automatically when payment fails?

Only if you have configured it to. When the retry window ends, Stripe can cancel the subscription, mark it unpaid, or leave it past_due, and which one happens is a setting in your Dashboard subscription settings. There is no universal default behaviour you can assume from outside the account.

How long does a Stripe subscription stay incomplete?

23 hours. If the first payment on the subscription has not succeeded within 23 hours of creation, the subscription becomes incomplete_expired, which is terminal and never bills the customer.

Can I reactivate a canceled Stripe subscription?

No. canceled is described by Stripe as a terminal state that cannot be updated. You would create a new subscription instead. This is the main practical argument for choosing unpaid rather than cancel as your end-of-retry behaviour if you expect customers to come back.

Does active mean all invoices are paid?

No, and this catches people out. Stripe states explicitly that active does not indicate that all outstanding invoices associated with the subscription have been paid. If you are using status alone as a proxy for 'this customer is square with us', you will be wrong sometimes.

Where this came from

Checked against primary sources on 28 July 2026. If Stripe changes something and this page has not caught up, tell us and it gets fixed.

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 actually recovers, with a $29 monthly floor, and nothing at all if it recovers nothing.

It is early. It is run by one person. If Stripe's own free retry settings are enough for you, use those instead, and there is a page on this site that says exactly when that is the right call.

See how the pricing works