Stripe's September 2026 Billing release ("Endive") added a status_details.uncollectible.reason field to invoices, so you can finally see why a payment failed instead of just that it did. The same release also lets you pause a subscription automatically after a failed payment, instead of only ever canceling it. For early-stage SaaS founders, that's a real opening to stop treating every failed card the same way.

What did Stripe actually change?

Stripe shipped four related Billing changes in the same API version (2026-09-30, "endive"):

  1. Uncollectible reason codes. When an invoice is marked uncollectible, it now carries a status_details.uncollectible.reason value: max_payment_attempts, payment_not_received, subscription_canceled, subscription_paused, or user_forgiven. Before this, "uncollectible" was a dead end with no explanation attached.
  2. Automatic pause on payment failure. You can now configure a subscription to pause itself after a first or final payment failure (status_details.paused.subscription.type reports which), rather than only letting it cancel or keep retrying indefinitely.
  3. On-demand pause and resume. Subscriptions can be paused and resumed directly via the API, with webhooks (customer.subscription.paused, customer.subscription.resumed) to track the change. Pausing stops invoice generation entirely, which Stripe notes is different from pausing payment collection.
  4. Scheduled cancellation on a pending update. You can now set cancel_at_period_end as part of a pending update tied to a payment outcome, so a cancellation only takes effect once a specific payment event resolves, rather than applying immediately.

All four are documented on Stripe's public changelog (linked above). None of this is marketing copy; it's the API reference for what you can now ask Stripe to do.

Why does the "why" behind a failed payment matter?

Because a card that expired and a customer who's actively trying to leave are not the same problem, and they don't deserve the same recovery email.

Before this update, most dunning logic ran on one signal: invoice went unpaid after N retries, so send the "your payment failed" sequence and eventually give up. That treats an expired card, a disputed charge, a canceled subscription, and a subscription you paused yourself all the same way, because Stripe didn't tell you which one you were looking at.

With the new reason codes, you can split your response:

Reason code What likely happened Reasonable response
max_payment_attempts Card retries exhausted, usually an expired or declined card Card-update email/SMS with a direct update link, time-sensitive
payment_not_received No successful attempt registered (e.g., bank transfer never came through) Reminder with payment instructions, not a "fix your card" message
subscription_canceled The subscription itself was already canceled before the invoice resolved No recovery message needed; this is an artifact, not a lead
subscription_paused You or the customer paused collection Nothing urgent; this is expected state, don't dun a paused account
user_forgiven Someone manually wrote off the invoice Exclude from all recovery flows; it was closed on purpose

If you're running the same three-email dunning sequence against all five of these today, you're very likely emailing people who already canceled, or chasing invoices your own team marked as forgiven. That's not just wasted effort, it's the kind of message that makes a churned or already-frustrated customer view your product less favorably.

Should you pause subscriptions instead of canceling them on failed payment?

For many SaaS products, pausing is the better default than an immediate hard cancel, because it keeps the account and its data intact while removing the only one that's broken (payment), and it avoids a hard "you're gone" moment over what's often a temporary card issue.

A pause is a good fit when:

  • The product has meaningful setup or stored data a customer would lose context from if the account were deleted or downgraded.
  • Your plan doesn't automatically delete data soon after cancellation.
  • You'd rather give a card a short window to get fixed than force an immediate downgrade.

A pause is a worse fit when:

  • Seat-based pricing means a paused-but-not-canceled account still implies headcount you need to reconcile elsewhere.
  • Your billing and provisioning systems don't yet have a clean "paused" state to key off of (building for customer.subscription.paused is new plumbing, not a toggle).

Either way, this is now a real choice Stripe lets you make explicitly, not just a side effect of how retries happen to resolve.

What should you actually do this week?

  • Check whether you're reading status_details on uncollectible invoices anywhere in your dunning or alerting code. If not, you're probably still triggering off bare "payment failed" events.
  • Audit your current dunning emails against the five reason codes above. If the same message goes out regardless of reason, that's the first fix.
  • Decide, deliberately, whether a failed payment should pause or cancel the subscription for your product, instead of letting Stripe's defaults decide for you.
  • If you use scheduled cancellation, make sure your cancel confirmation and any win-back messaging account for the fact that the cancellation may not take effect until a pending payment resolves one way or the other.

Key takeaways

  • Stripe's September 2026 Billing update adds reason codes for why an invoice is uncollectible, plus the ability to pause subscriptions automatically on payment failure.
  • Treating all failed payments the same wastes recovery effort on invoices that are already canceled, paused, or deliberately forgiven.
  • Pausing instead of canceling on failed payment is now a real, documented option, not just a side effect of retry timing.
  • Review your dunning logic against the specific failure reason before your next billing cycle, not after.

If building and maintaining that kind of dunning logic yourself isn't where you want to spend time, that's the gap tools like Lokuna are built for: it connects to Stripe, detects churn risk including failed payments, and handles the recovery messages by email and SMS.