Skip to main content

Entitlements

Named capabilities and limits granted by a license (feature flags, module codes, numeric caps). Entitlement codes are technical identifiers — do not translate them in UI or code samples.

How packaging fits together

LayerRole
PolicyTechnical rules (grace, lease, heartbeat, offline clamps)
License Plan (POL)Packaging bound to a catalog product — not SaaS PlatformPlan
FeatureLimitBackend-enforced caps on a Policy or Plan (code, max / unlimited)
License entitlementsGrants attached to a specific license (copied into signed leases on activate / refresh / offline)
Custom data slotsFixed vendor fields on signed artifacts — not a replacement for entitlement codes (ADR-0026)

Custom data (vendor slots)

v1 shape (locked): 2 strings (≤100 Unicode chars each), 2 booleans, 3 finite numbers. Values live on Management SoR and appear in signed lease / offline claims after the next activate, refresh, or offline response — never inside the human license key string.

Vendors edit slots in Vendor Console → license detail. Integrators read them only after JWS verify. Management also exposes GET / PUT /api/v1/licenses/{licenseId}/custom-data.

Console packaging surfaces

SurfaceWhat you see
License plans (/plans)List + create License Plan (code, name, policy, catalog product)
Product → Policy tabCreate-plan CTA (product prefilled) + FeatureLimit matrix for bound plans
License detailCustom data editor (fixed slots)
Product → KeysRead-only custom data summary on each key row
FloatingLicense-wide and feature-scoped seat pools (feature:{code}) — capacity and force-release

Upgrade path (vendor SKU → more features)

  1. Customer buys / is assigned a higher License Plan (or additional entitlement grants).
  2. Management binds plan/policy and updates license entitlements / FeatureLimits.
  3. Next Runtime validate / refresh / offline response carries the new signed snapshot (including custom data when set).
  4. Client re-verifies JWS (Verify trust) and unlocks features.

Feature-floating (module seats)

Concurrent seats can be scoped to an entitlement / feature code (not only the whole license). Runtime checkout sends featureCode; Management and Vendor Console configure a separate pool with ScopeKey feature:{code}, isolated from the license-wide default pool (UC-FF-01, UC-FF-02; ADR-0036). The feature code must match a grant on the license.

Next steps