Skip to main content
An entity is a resource that lives under a parent customer — a user, a workspace, a project. Entity plans let each of those hold its own plan, with its own balances, while the parent customer pays.
Example
A team plan costs $30/seat/month. Each seat gets 50 AI meeting summaries per month. If a team has 5 users, each user has their own balance of 50 summaries — they can’t use each other’s allocation.

Two ways to provision

Both approaches end in the same place: an entity holding a plan. They differ in where capacity comes from.
Pick with one question: do you sell capacity before you know who fills it? Different tiers per entity work in both modes — attach different plans to different entities, or offer more than one license plan under the same parent.
Entities are created with a feature_id identifying their type (e.g. a non-consumable seats or workspaces feature). If you only need to count seats and bill for them, with no per-seat balances or identity, you don’t need entities at all — see per-seat pricing.

Attaching plans directly

Create your plans as normal — no entity-specific configuration on the plan itself. Put plans that should replace each other on upgrade/downgrade in the same group.
autumn.config.ts
Push changes with atmn push.

Create the entity

Attach a plan to it

Pass entityId to scope the attach to that entity:
Each entity’s subscription is created separately in Stripe, with billing cycles synced to the parent customer. To upgrade or downgrade, attach the new plan with the same entityId — the usual upgrade/downgrade logic applies.

Cancel an entity’s plan

The same cancel/uncancel behavior applies.

Licenses

A license plan describes everything one entity gets. The parent plan offers a pool of them, and you assign one to an entity to hand it its own balance.
The pool has a granted size (included seats plus any paid seats), a usage count (seats currently assigned), and a remaining count. Assigning consumes a seat; releasing gives it back.
Create the feature each seat consumes, then a license plan holding what one seat gets. Link it from the parent plan via licenses:
autumn.config.ts
included: 1 means the Team plan comes with one free seat. Seats beyond that are paid at the license plan’s own price.Push changes with atmn push.
Give the license plan its own group. Attaching a plan replaces other plans in the same group, so a license plan sharing a group with its parent would knock the parent off.

Buy seats

Seats are bought on the parent plan. quantity is the total number of seats, including the plan’s free included amount:
With 1 included seat and quantity: 5, the customer gets 5 seats and pays for 4. Attach again with a new quantity to change the count later — Autumn prorates the difference.
A priced license plan must be attached at the customer level before it can be assigned to entities. Buying seats with licenseQuantities does this for you.

Assign a license

Assigning is what provisions the entity’s individual balance — creating an entity on its own does not:
feature_id is the entity type and is required only when the entity doesn’t exist yet — Autumn creates it for you. You can pass several entities in one call.
Assignment is idempotent. Re-assigning an entity that already holds an active license for the same plan succeeds without consuming another seat. If the pool has no seats left, the call errors — buy more seats first.

Release a license

The entity’s balance is removed and the seat returns to the pool, ready to reassign:
Releasing frees the seat but does not change what the customer pays — they keep the seats they bought. To stop paying for one, attach the parent plan again with a lower quantity. license_plan_id is optional, and only needed to disambiguate when an entity holds licenses from more than one plan.

Inspect seats

licenses.list returns each pool with its granted, usage, and remaining counts. licenses.list_assignments returns which entities currently hold one.
cURL

Checking and tracking per entity

Regardless of how the entity got its plan, pass entity_id to check and track to operate on that entity’s balance:
Track the same way:

Customer-level vs entity-level

When tracking at the customer level (without entity_id), usage is deducted from the first-assigned entity to keep entity-level totals in sync with the customer-level total.

Worked example

Entity-level balances walks the licenses model end to end: an AI meeting-notes product on team pricing, from customer creation through buying seats, assigning them, and releasing them when someone leaves.