cartwright
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 by userId, 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-off payment_intent path, signature verification and idempotency are untouched.

Tier & defaults

Flagsubscriptions
Tiercompile-time (redeploy); precondition: ecommerce
Defaultoff
Toolssubscriptions.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.

On this page