Subscription Lifecycle

A subscription moves through a number of states over its lifetime. These transitions happen automatically, and you get a webhook at each stage.

Subscription state machine: Pending, Active, Past due, Canceled, Expired

Subscription States

PENDING

Subscription created and waiting for checkout, nothing has been charged. You receive subscription.created. Don't provision access yet.

ACTIVE

The subscriber has authorised the subscription and the first payment has been confirmed. Recurring charges then run on schedule, each firing subscription.payment.succeeded — provision and extend access on these. A healthy subscription spends most of its life here, and indefinite plans (no termCycles) stay here until canceled.

PAST_DUE

A recurring charge failed, usually because the wallet balance is too low or the subscriber has revoked their on-chain allowance. It is recommended at this stage to prompt the subscriber to top-up their balance. Confirmo retries through the grace period configured for the plan; if one succeeds, the subscription returns to ACTIVE (subscription.resumed).

CANCELED

Stopped for good before its natural end (subscription.canceled), at this stage you should turn off the subscriber's access. See cancellation.reason for why. Terminal state.

EXPIRED

Ended on its own terms (subscription.expired), at this stage you should turn off the subscriber's access.. See expiration.reason for why. Terminal state.

How subscriptions move between states

From → ToWhat triggers it
PENDINGACTIVEThe subscriber completes checkout and the first charge confirms.
PENDINGCANCELEDCheckout isn't completed before it times out.
PENDINGEXPIREDThe first charge fails.
ACTIVEPAST_DUEA recurring charge fails.
PAST_DUEACTIVEA retry succeeds during the grace period.
PAST_DUECANCELEDThe grace period runs out with no successful charge.
ACTIVECANCELEDYou or the subscriber cancels the subscription before the term ends.
ACTIVEEXPIREDA subscription with a fixed term completes. Subscriptions on indefinite plans never expire.

Reason codes

A terminal event carries the reason it ended — cancellation.reason for CANCELED, expiration.reason for EXPIRED.

cancellation.reason

ValueWhat it means
SUBSCRIBERThe subscriber canceled.
MERCHANTYou canceled.
MERCHANT_DISABLEDCanceled because your account was disabled.
ADMINCanceled by Confirmo e.g. for compliance reasons.
EXPIREDCanceled as part of the subscription expiring.
DUNNING_EXHAUSTEDAuto-canceled after the grace-period retries ran out.
SANCTIONS_HITAuto-canceled because a sanctions / risk screening blocked the payment.
CHECKOUT_TIMEOUTAuto-canceled because checkout wasn't completed in time.

expiration.reason

ValueWhat it means
TERM_REACHEDThe plan's fixed termCycles finished.
PAYMENT_FAILEDEnded after a terminal payment failure — the first charge failed, or no grace period was set.