Subscription Statuses
| Status | Description |
|---|---|
pending | Created but not yet activated (awaiting payment confirmation) |
trial | In a free trial period |
active | Paid and active |
past_due | Payment failed — grace period |
pending_cancel | Cancellation requested; access continues until currentPeriodEnd |
canceled | Canceled. For manual billing subscriptions, this is set immediately on cancellation; for recurring subscriptions, it is set at period end. |
expired | Trial or subscription ended without renewal |
Status Transitions
Transitions are triggered by Stripe webhook events or explicit API calls:| Event / Action | Transition |
|---|---|
checkout.session.completed | pending → active or trial |
customer.subscription.updated | trial → active |
invoice.payment_failed | active → past_due |
customer.subscription.deleted | any → canceled |
POST /subscriptions/{id}/cancel (recurring) | active / trial / past_due → pending_cancel |
POST /subscriptions/{id}/cancel (manual billing) | active / trial / past_due → canceled |
Subscription Fields
Event Sourcing
Every subscription status change is written tosubscription_events. This gives you a complete audit trail: