Skip to content

Billing

Nothing instantiates the Stripe client until billing.enabled is on, so an instance with no Stripe account is not merely unbilled — the integration is never constructed.

VariablePurpose
STRIPE_SECRET_KEYAPI key
STRIPE_WEBHOOK_SECRETVerifies inbound webhooks

/admin/status reports whether both are set once the flag is on.

What it adds

/billing/subscribe offers the plan, /billing/checkout starts a Stripe Checkout session, /billing/checkout/success returns from it, and /billing/portal sends a subscriber to Stripe’s own management portal.

Trials end on a schedule rather than on a request: app:sweep-ended-trials disables expired trials and cancellations past their period, and sends survey emails. Like everything scheduled, it runs only if a worker is consuming — see What runs in production.

An account disabled this way meets a paywall that still lets it reach the subscribe page, and — when a registration cap is full — the waitlist.