Skip to content

Core concepts

Plans, limits and invoices.

Each workspace has a subscription. The API decides what it is entitled to from verified payment events, never from a browser redirect.

The plans

The sample plans are Starter at $29 a month (3 seats, 10,000 API requests, 5 GB), Pro at $99 (10 seats, 100,000 requests, 20 GB) and Scale at $249 (30 seats, 500,000 requests, 100 GB). They are the example product's own prices, separate from the Northstack licenses. A new workspace starts on a 14-day Starter trial.

Two providers

BILLING_PROVIDER chooses how payments are taken:

  • simulator: a checkout page inside the dashboard that needs no keys and moves no money.
  • stripe: Stripe Checkout in subscription mode and the Stripe billing portal, with STRIPE_SECRET_KEY.

Webhooks

Point a Stripe webhook at POST /api/billing/webhooks/stripe and set STRIPE_WEBHOOK_SECRET. The API checks every signature and processes each event only once. When someone returns from Checkout, the API also reads the session from Stripe, so a local install without webhook forwarding still confirms the payment.

Past due and cancellation

A failed payment marks the workspace past due and shows a notice. After BILLING_GRACE_DAYS (seven by default) the workspace stays readable but stops new billable work; no data is ever deleted for a failed payment. A cancelled subscription stays active until the end of the paid period.

License checkout

The pricing page sells the two licenses through the site's own checkout at /checkout. The buyer gives an email and a name, picks card or PayPal, and pays on Stripe's or PayPal's own page: the site never shows a card field.

  • Cards use STRIPE_SECRET_KEY, and their events arrive on the same webhook as billing.
  • PayPal uses PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET, with PAYPAL_ENV=sandbox until you go live. The API captures the payment when the buyer returns.
  • A method with no keys goes through the site's test checkout, which charges nobody. In demo mode a live key is never offered.

An order counts as paid only once the API has verified it with the processor. The receipt then shows a license key, and the same key is emailed to the buyer. The prices the API charges are in back-end/src/modules/licenses/constants/license-offers.ts; keep them equal to website/src/config/licenses.ts, which prints them.

Next: Platform administration