Skip to main content

Seat-based billing model

Seat-based billing is modeled at the billing account level. The account pays for the team, and each active billing user under the account consumes one seat.

Configuration

Define seat packaging in billing plan or catalog metadata:

{
"seat_limit": {
"mode": "fixed",
"limit": 5
}
}

For quantity-based subscriptions:

{
"seat_limit": {
"mode": "per_unit",
"seats_per_unit": 1
}
}

Provider sync writes the effective value to billing_accounts.seat_limit.

Runtime behavior

Runtime requests still include both X-Principal-Id and X-User-Id. Vluna resolves them to a billing account and billing user. The guard rejects disabled/deleted billing users, but it does not count seats on every request.

Seat capacity is enforced when active billing users are created or restored:

  1. Billing account owns seat_limit.
  2. Active billing users consume seats.
  3. Disabled/deleted billing users do not consume seats.
  4. seat_limit = null means unlimited.
  5. Downgrades can make an account over limit without disabling existing users.

Next