Licensing & Monetization

The commercial engine your SaaS infrastructure needs.Built into the control plane.

Licenses, add-ons, prices and vouchers: four primitives that turn your commercial contracts into infrastructure rules. Versioned licenses and the entitlements they grant run today. Add-ons, prices and vouchers — including vouchers that grant a feature flag — are on the roadmap, and billing stays provider-agnostic by design.

The Problem

Your licensing service is quietly killing you.

Every B2B SaaS ends up having the same conversation: "We need to let the AE grant a temporary Pro access." Then: "+2 extra seats for this deal." Then: "Turn on the beta dashboard for Acme for 6 months." Three tickets, three deploys, three ways to break production.

Hardcoded plans

if (plan === 'enterprise') scattered across your codebase. Every pricing change requires a deploy. Every negotiated contract becomes a code exception.

Coupons that only discount

A billing coupon gives you -20%. It can't grant 500 extra API calls. It can't turn on a feature flag. So your team writes custom code for every negotiated deal.

Vendor lock-in

Entitlements tied to one billing provider make every provider change a rewrite of your monetization stack. You're paying for lock-in, not flexibility.

The Kaiten Way

Four primitives. One unified model.

Kaiten's licensing model is built into the control plane — not bolted on. Licenses ship today: versioned, audited, and queryable through the API, the SDKs and the MCP server. Add-ons, prices and vouchers are on the roadmap, on the same model.

01

License

The Kaiten plan

The commercial contract as code, and it ships today. Types: DEVELOPMENT, TRIAL, PAID, COMMUNITY. Each license is a numbered version of a product: publish a new version and existing customers stay on theirs until you move them. Grants entitlements — on/off features, quotas, AI credits and JSON config.

license.name = "Pro"
license.type = PAID
license.version = "3"
license.lifecycleState = PUBLISHED
02

Add-on

Modular extensions

On the roadmap: add-ons mirror the license structure and attach to a license at subscription time, with their own entitlements and prices. An override_behavior (ADD, OVERRIDE, MAX) will decide how an add-on's quotas combine with the base license — "+5000 API calls" ADDs, "unlimited API calls" OVERRIDEs.

addon.name = "Extra Seats"
addon.compatible_licenses = [Pro, Enterprise]
addon.max_quantity = 100
entitlement.override_behavior = ADD
03

Price

6 billing models

On the roadmap: native pricing with six billing models — flat fee, usage-based, pay-in-advance, overage, tiered, graduated. Each price will link to a provider price through billing_provider_id + external_id, or be declared natively, and one license will carry several (monthly and annual).

price.billing_model = OVERAGE
price.included_units = 10_000
price.billing_period = MONTHLY
price.external_id = "price_xxx" (Stripe)
04

Voucher

Beyond coupons

On the roadmap: four types — PRICE (discount), ENTITLEMENT_BOOST (modify quotas), FLAG_GRANT (activate a feature flag), COMPOSITE (combine all three). One voucher will act on price, quotas and flags at once, so Sales can negotiate a whole deal package in one instrument.

voucher.type = COMPOSITE
voucher.price_discount = 30%
voucher.entitlement_boost = { api-calls: x2 }
voucher.flag_grants = [white-label]

Voucher Types

The commercial instrument your Sales team always needed.

On the roadmap: a voucher that acts on three dimensions at once — price, entitlement limits and feature flag access. One code will replace three tickets.

PRICE

Classic discount

Percentage or fixed amount off the price. Duration: one-time, repeating for N periods, or forever. Links to a provider coupon (stripe_coupon_id) or is declared natively.

Example

code: "WELCOME20"
discount: -20% FOREVER
ENTITLEMENT_BOOST

Modify quotas

Multiply, add, set, or lift the limit on an entitlement value for a duration. Perfect for onboarding: give 2x quotas for the first 3 months to reduce activation friction.

Example

code: "SUMMER_BOOST"
api-calls: MULTIPLY x2
duration: 3 months
FLAG_GRANT

Feature flag activation

Temporarily turn on a feature flag for a customer — without reassigning them to a different plan. Ideal for beta access, Sales-negotiated early access, or support overrides.

Example

code: "BETA_DASH"
flag: new-dashboard = true
expires: 2026-12-31
COMPOSITE

Big deal combo

Combine the three. For enterprise negotiations: "-30% + quotas ×2 + white-label flag on for 12 months." One voucher code, full audit trail, clean lifecycle.

Example

code: "ACME_2026"
discount: -30% 12mo
quotas: x2
flag: white-label
Billing Adapter

Stripe, Lago, or your own.

Kaiten doesn't replace your billing engine — it feeds it. Today the seam is the event stream: every accepted usage report and every license change commits an event through the transactional outbox, and a consumer you write feeds your billing provider from it. Native billing adapters are on the roadmap: they will make the provider a configuration choice rather than a consumer you write.

The direction is provider-agnostic by design: one canonical event model, so a webhook from Stripe or Lago will land in the same shape, and switching providers will be a configuration change rather than a code migration.

Consume the event stream today · Native billing with Stripe and Lago on the roadmap

Your commercial team

Kaiten Licensing Model

Licenses · Add-ons · Prices · Vouchers

Billing adapters (on the roadmap)
Stripe
Lago
Custom

React SDK

Your plan UI and paywalls, as React components.

Prebuilt React components for pricing tables, customer portals, usage meters and paywalls, on a headless core you can also use alone. The paywall checks an entitlement and a feature flag in one gate.

Prebuilt, or headless.

@kaitencloud/react-ui draws the components — PricingTable, CustomerPortal, UsageMeters, Paywall, PlanBadge and more — with every style scoped under one root, so none of it reaches the rest of your app. @kaitencloud/react is the headless core underneath: the provider, the hooks and a Gate, for teams who draw in their own design system.

Signed in, the provider reads one customer's plan, entitlements, usage and flags from your Kaiten API, and reads them again every five minutes. A pricing page renders from a plan catalog you supply, with no key and no request. Both packages are on the roadmap.

React components on the roadmap · Vue, Svelte and Angular after them

@kaitencloud/react-ui — on the roadmap
import { KaitenProvider, KaitenStyleRoot, Paywall }
  from "@kaitencloud/react-ui";
import "@kaitencloud/react-ui/styles.css";

function App() {
  return (
    <KaitenProvider
      mode="authenticated"
      apiUrl="https://app.kaiten.sh/api"
      accessToken={getSessionToken} // called on every request
      customerId="cust_123"
      instanceId="inst_456"
    >
      <KaitenStyleRoot>
        {/* One gate: the entitlement's usage AND the flag */}
        <Paywall
          entitlement="api-calls"
          flagKey="premium-feature"
          threshold={0.8}
          onUpgrade={(action) => openUpgrade(action?.type)}
        >
          <ApiPlayground />
        </Paywall>
      </KaitenStyleRoot>
    </KaitenProvider>
  );
}

Domain Events

Every change. Fully audited. Stream-ready.

Licenses and their families emit 12 of the 55 event types Kaiten publishes as webhook contracts, and usage reports emit the signals billing listens to. Each event is committed through a transactional outbox, in the same transaction as the change, then carried by the event pipeline to the audit trail and, on Kaiten Cloud, to your webhook endpoints.

Event nameDescriptionType
LICENSE_CREATEDNew license createdcreate
LICENSE_UPDATEDLicense details updatedupdate
LICENSE_DELETEDLicense deleteddelete
LICENSE_PUBLISHEDLicense version publishedlifecycle
LICENSE_ARCHIVEDLicense version archived; instances on it keep itlifecycle
LICENSE_UNARCHIVEDArchived license version back in uselifecycle
LICENSE_FAMILY_CREATEDA product opened by its first versioncreate
LICENSE_FAMILY_UPDATEDThe version a product serves changedupdate
LICENSE_FAMILY_DELETEDA product closed with its last versiondelete
LICENSE_ENTITLEMENT_ASSIGNEDEntitlement granted by a licenseassign
LICENSE_ENTITLEMENT_UPDATEDGrant's value or overage allowance changedupdate
LICENSE_ENTITLEMENT_UNASSIGNEDEntitlement no longer granted by a licenseunassign
INSTANCE_ENTITLEMENT_USAGE_WARNING_THRESHOLD_REACHEDUsage crossed the entitlement's early-warning percentageusage
INSTANCE_ENTITLEMENT_CAP_EXCEEDEDUsage went past a soft-limit grant, within its allowanceusage
ENTITLEMENT_USAGE_REPORT_ACCEPTEDUsage report recorded, overage includedusage
ENTITLEMENT_USAGE_REPORT_REJECTEDUsage report refused with a 409; usage left unchangedusage

The 16 events above are 16 of the 55 webhook contracts. The other 39, and the payload schema of every one, are in the OpenAPI document. See the full API reference.

Pairs naturally with the rest of Kaiten.

Stop hardcoding plans.
Start enforcing contracts.

Licenses and the entitlements they grant are in the open-source engine and in every Kaiten Cloud tier — Kaiten Cloud is in private beta.