backend/internal/entitlement if you want the code this page describes.
Exact seat counts, scan allowances and feature lists live on the
pricing page rather than here, because that
page is checked against the migrations that seed them on every build — a
number transcribed a second time here would drift the first time either one
changed and nobody remembered the other copy existed.
Two kinds of limit
- Stocks — assets, seats, API keys, webhook endpoints, policies, agents and other non-human identities. A ceiling on how many exist right now. Deleting one frees the room immediately.
- Flows — scans per month is the one flow limit today. A ceiling on consumption within the current billing period; deleting a scan that already ran does not give the allowance back, because the CPU, the egress and the vulnerability-database read already happened.
What happens at the ceiling
Every metered action is checked at the service layer, before the write, and a refusal is 402 Payment Required, not 403: a wrong credential cannot fix it, and only a plan change can. The response names what was refused, where you stand against it, and — when a self-serve plan would fix it — which one:GET /api/v1/billing/entitlements.
The lifecycle
Signing up puts an organisation on Free, active, with no trial to expire — a trial of a plan with nothing to trial granted nothing and used to render as “Trial · 7 days left” and then as cancelled, which was a defect, not a feature. From there:- Upgrading or downgrading goes through Manage billing and a hosted checkout, on a deployment that sells self-serve. Nothing in the dashboard writes a plan directly — a plan changes only when the payment provider reports it, over a channel whose signature is verified first.
- Cancelling keeps you entitled through the period you already paid for, then falls back to Free. Your data is never deleted by a plan lapsing.
- A failed payment does not withdraw anything immediately. TRUSTIVAN carries a past-due subscription at its plan for a grace period before falling back to Free, because a card that expired on a Friday should not stop a security product from scanning over the weekend.
- Reactivating is the same checkout as upgrading: buy the plan again and your entitlements resume.
subscription.changed entry, so “what did this account’s plan
actually do, and when” is answerable without a support escalation to a
payment dashboard.
What this deployment can charge you
TRUSTIVAN’s payment integration is a small, provider-neutral interface (internal/commerce.Provider): create a customer, start a checkout, open a
portal, report a subscription’s state, cancel it, and verify a webhook. Two
implementations exist — a Stripe adapter, and a manual provider that
sells nothing and answers every checkout request honestly with “this
deployment does not sell subscriptions; your plan is set by agreement.”
If Manage billing or Upgrade is missing or answers that way, this
deployment has no payment provider configured. That is a normal, supported,
permanent state for a self-hosted install or a contract-invoiced enterprise —
plans are still enforced exactly as described above, assigned by an operator
or a signed agreement instead of a card. It is never a broken checkout form;
if a deployment cannot sell you a plan, it says so rather than pretending.
Invoices, receipts and payment-method management live entirely at the
payment provider, opened from Manage billing — TRUSTIVAN stores no card
data and reimplements none of a billing system’s own surface.

