Features
Subscriptions
Recurring billing via Stripe Billing — admin management and a self-service customer portal, additive and flag-gated so one-off checkout is unchanged when off.
subscriptions adds recurring billing on top of Stripe Billing, using the existing Subscription model. It is additive and flag-gated: with the flag off, one-off checkout and the Stripe webhook behave exactly as before.
Enable it
Run the migration —
pnpm db:push (the Subscription model gains a few additive columns).Set
brand.features.subscriptions = true (compile-time — redeploy). Requires ecommerce mode.Create your recurring Prices in Stripe (they are currency-locked on Stripe's side).
What ships
- Admin —
/admin/subscriptions: list subscriptions with status, customer, plan and next renewal; cancel-at-period-end. - Customer —
/account/subscriptions: start, pause, resume and cancel, scoped to the signed-in user (queries are keyed byuserId, so one customer can never act on another's subscription). - Webhook — subscription/invoice events (
customer.subscription.*,invoice.*) are handled additively and only when the flag is on; the existing one-offpayment_intentpath, signature verification and idempotency are untouched.
Tier & defaults
| Flag | subscriptions |
| Tier | compile-time (redeploy); precondition: ecommerce |
| Default | off |
| Tools | subscriptions.list, subscriptions.cancel (scope-gated) |
Subscription Prices are currency-locked on Stripe — there's no local currency conversion for recurring charges, so it does not interact with multi-currency one-off pricing.