---
title: "Subscription Statuses Compared: Stripe vs Paddle vs Chargebee"
short_title: "Subscription Statuses: Stripe vs Paddle vs Chargebee"
description: "Stripe has 8 subscription statuses, Paddle 5, Chargebee 7 — and Chargebee has no past-due status at all. What each means and when to cut access, from the docs."
date: 2026-09-24
products: Stripe Billing=https://stripe.com/billing; Paddle=https://www.paddle.com; Chargebee=https://www.chargebee.com
faq: What are the Stripe subscription statuses?=Stripe subscriptions can be trialing, active, incomplete, incomplete_expired, past_due, canceled, unpaid or paused. || How long does a customer have to pay an incomplete Stripe subscription?=23 hours. If the first payment isn't made within 23 hours the subscription becomes incomplete_expired and its invoice is voided. || What are the Paddle subscription statuses?=Paddle Billing subscriptions are trialing, active, past_due, paused or canceled. Paddle recommends full access for trialing, active and past_due. || Does Chargebee have a past_due status?=No. Chargebee's subscription statuses are future, in_trial, active, non_renewing, paused, cancelled and transferred. Unpaid invoices are tracked with the due_since, due_invoices_count and total_dues fields instead.
---

# Subscription Statuses Compared: Stripe vs Paddle vs Chargebee

<p class="meta">Researched and verified against each product's own documentation on 2026-09-24.</p>

:::tldr
**Short answer:** Stripe Billing has eight subscription statuses, Paddle Billing five and Chargebee seven. The biggest difference is how each handles a failed payment: Stripe and Paddle move the subscription to `past_due`, while Chargebee has no such status and keeps the subscription `active`, recording the debt in separate fields.
:::

## The statuses side by side

| Situation | Stripe | Paddle | Chargebee |
|---|---|---|---|
| Starts later | — | — | `future` |
| Free trial | `trialing` | `trialing` | `in_trial` |
| First payment not yet made | `incomplete` | — | — |
| First payment never made | `incomplete_expired` | — | — |
| Paying normally | `active` | `active` | `active` |
| Renewal payment failed | `past_due` | `past_due` | stays `active` (+ dues fields) |
| Retries exhausted, still exists | `unpaid` (if configured) | — | — |
| Will end at term end | — (a flag, not a status) | `active` + scheduled change | `non_renewing` |
| Paused | `paused` | `paused` | `paused` |
| Ended | `canceled` | `canceled` | `cancelled` |
| Moved between entities | — | — | `transferred` |
| **Count** | **8** | **5** | **7** |

Note the spelling: Stripe and Paddle use `canceled`, Chargebee uses `cancelled`. If you support more than one, normalise it.

## Stripe: the 23-hour window

Stripe is the only one of the three with statuses for a subscription that never got going. When a subscription needs an immediate payment, "the subscription’s initial status is incomplete, then becomes active after the customer pays the first invoice." The customer has a fixed window: "Your customer has 23 hours to pay." After that, "if the customer doesn’t pay within 23 hours, the subscription updates to incomplete_expired and the invoice becomes void." Stripe says this status "exists so you can track customers that failed to activate their subscriptions" — useful for measuring checkout abandonment.

For renewals that fail, Stripe moves the subscription to `past_due`, and what happens next is your choice: "If the invoice is still unpaid after all attempted payment retries, you can configure the subscription to move to canceled, unpaid, or leave it as past_due."

`unpaid` is the status that tells you to cut access. Stripe's own guidance: "Revoke access to your product when the subscription is unpaid because payments were already attempted and retried while past_due."

And `canceled` is final: "This is a terminal state that can’t be updated."

One subtlety: `active` does not mean fully paid. Stripe notes "active doesn’t indicate that all outstanding invoices associated with the subscription have been paid."

## Paddle: an access table you can copy

Paddle Billing has five statuses and publishes exactly how much access each should get:

| Status | Access (Paddle's recommendation) |
|---|---|
| `trialing` | Full — "Treat the same as `active`." |
| `active` | Full |
| `past_due` | Full — show a banner and link to update the payment method; Paddle retries payment for you |
| `paused` | "None or read-only" — "No transactions are created while paused." |
| `canceled` | None — "Revoke access when the status changes to `canceled`." |

Two Paddle rules worth knowing. First, you cannot edit a subscription that is behind on payment: "You can't make changes to a subscription if the next billing period is within 30 minutes, or the subscription status is `past_due`." Second, cancellation is permanent: "In Paddle Billing, canceled subscriptions can't be reinstated. Create a new subscription for customers who have canceled if they want to return."

When a customer cancels from Paddle's portal, the subscription doesn't change status straight away — "The subscription remains `active` until the next billing date, at which point its status changes to `canceled`." When retries run out, Paddle can either pause or cancel the subscription automatically, and you choose which.

## Chargebee: no past-due status

Chargebee's API lists seven statuses: `future` ("scheduled to start at a future date"), `in_trial`, `active` ("will be charged for automatically based on the items in it"), `non_renewing` ("will be canceled at the end of the current term"), `paused`, `cancelled` ("canceled and is no longer in service") and `transferred`.

There is no `past_due`. Instead, a subscription with unpaid invoices carries three fields: `due_invoices_count` ("Total number of invoices that are due for payment against the subscription"), `due_since` ("Time since this subscription has unpaid invoices") and `total_dues` ("Total invoice due amount for this subscription").

That is a genuinely different model. In Stripe and Paddle, "is this customer behind on payment?" is a status check. In Chargebee it is a field check — and code that only looks at `status == "active"` will happily keep serving a customer who hasn't paid in months.

Chargebee is also the only one of the three to make "will cancel at term end" a status of its own (`non_renewing`), and the only one with `future` for subscriptions that start later.

## What this means if you are building on one of them

1. **Gate access on the right thing.** On Stripe, cut access at `unpaid` or `canceled`. On Paddle, at `paused` or `canceled`. On Chargebee, status alone is not enough — check `due_since` too.
2. **Treat cancel as final everywhere.** All three say a cancelled subscription can't come back; a returning customer gets a new subscription. Design your data model so one customer can have several.
3. **Measure the failures that aren't churn.** Stripe's `incomplete_expired` is the only built-in record of people who started paying and didn't finish. On the other two you have to track that yourself.

## Method and limits

Read from each vendor's own documentation on 2026-09-24: Stripe's Billing docs, Paddle's developer docs (via its published Markdown), and Chargebee's API reference. Each product has settings that change behaviour — retry schedules, what happens after retries, cancellation timing — so your account may differ from the defaults described. We have no affiliation with any of the three.

## Sources

- Stripe — [How subscriptions work](https://docs.stripe.com/billing/subscriptions/overview)
- Paddle — [Provision access with webhooks](https://developer.paddle.com/build/subscriptions/provision-access-webhooks)
- Paddle — [Configure payment recovery](https://developer.paddle.com/build/retain/configure-payment-recovery-dunning)
- Paddle — [Pause subscriptions](https://developer.paddle.com/build/subscriptions/pause-subscriptions)
- Paddle — [Cancel subscriptions](https://developer.paddle.com/build/subscriptions/cancel-subscriptions)
- Chargebee — [Subscriptions API](https://apidocs.chargebee.com/docs/api/subscriptions)

---

*Researched by [SaaSReadyit](https://saasreadyit.com), which writes AI-generated validation reports for software ideas. Related: [Helpdesk ticket statuses compared](https://saasreadyit.com/blog/helpdesk-ticket-statuses-zendesk-freshdesk-help-scout.html).*
