← SaaSReadyit Blog

Subscription Statuses Compared: Stripe vs Paddle vs Chargebee

Researched and verified against each product's own documentation on 2026-09-24.

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

SituationStripePaddleChargebee
Starts laterfuture
Free trialtrialingtrialingin_trial
First payment not yet madeincomplete
First payment never madeincomplete_expired
Paying normallyactiveactiveactive
Renewal payment failedpast_duepast_duestays active (+ dues fields)
Retries exhausted, still existsunpaid (if configured)
Will end at term end— (a flag, not a status)active + scheduled changenon_renewing
Pausedpausedpausedpaused
Endedcanceledcanceledcancelled
Moved between entitiestransferred
Count857

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:

StatusAccess (Paddle's recommendation)
trialingFull — "Treat the same as active."
activeFull
past_dueFull — 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."
canceledNone — "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


Researched by SaaSReadyit, which writes AI-generated validation reports for software ideas. Related: Helpdesk ticket statuses compared.