Skip to main content

Subscription statuses

A subscription moves through a defined set of statuses across its lifecycle. The status drives what your frontend shows, what API operations are allowed, and which webhooks fire.

Status values

StatusMeaning
pendingSubscription created, first payment not yet completed. The customer completes the first payment on the hosted payment form before the subscription becomes active.
activeSubscription is running normally. Renewals charge on schedule against the active payment instrument.
trial-endedThe trial period has finished. Transitions to active once the first paid renewal succeeds.
pausedSubscription is temporarily paused. No renewals are charged until the pause is resumed. See Subscription pauses.
unpaidA renewal payment has failed and dunning is in progress. Further retries follow the configured schedule — see Dunning and retries.
suspendedSubscription is administratively suspended (for example, on risk review).
canceledSubscription has been canceled. See Subscription cancellations.
churnedSubscription has ended after the paid period expired without further renewal.
completedSubscription reached its planned end (for example, a fixed number of cycles defined by recurringInterval.limit).
voidedSubscription was voided before it ever became active.
abandonedSubscription was abandoned without ever reaching active.
connectedSubscription is connected but not yet started.

pending — the first-subscription case

Most integrators see pending for the first time when they create a subscription with a new payment instrument. The instrument is inactive — PaymentsAI does not auto-charge inactive instruments. The create response includes a recentInvoicePaymentFormUrl and the subscription stays in pending until the customer completes the first payment on the hosted form.

Two consequences for your code:

  • Frontend: pending must be in the set of statuses that trigger a redirect to the hosted payment form. A frontend that only checks status === 'waiting' (the 3DS transaction status) misses this case.
  • Backend: read recentInvoicePaymentFormUrl from the response and pass it to the frontend as the redirect URL.

See Create a subscription for the flow and code snippets, and Hosted payment form for what happens on the form itself.

State transitions

What the frontend should show

StatusRecommended UI
pendingRedirect to recentInvoicePaymentFormUrl. After return, poll the subscription.
active, trial-endedNormal subscription view: next renewal date, manage button.
pausedPaused badge, "Resume" action.
unpaid"Payment failed" message with retry-status indicator. Surface link to update the payment instrument.
canceled (recent)"Canceled" view with "Reactivate" action if applicable.
canceled (older), churned, completed, voided, abandonedRead-only history view.
suspended"On review" message; suggest contacting support.