Plans inside your App
How an App gates features, caps usage and counts seats from the customer's plan, and what each screen shows when the plan changes.
Your App reads each Customer's plan before every screen and every call. Lock a feature, cap a count or charge per person on the Offer, and the buttons, limits and invoices follow.
What a plan controls
Every row comes from the Offer the Customer holds. You write no gating code for any of them.
| The customer has | The App shows | It comes from |
|---|---|---|
| A feature on a higher plan | The button, with a lock and the plan that unlocks it | An Entitlement with no Limit |
| A capped feature | A usage bar, then the upgrade offer at the cap | An Entitlement with a Limit, and the Offer's atBound |
| A per-seat plan | Seats used and paid, on the members screen | The Offer's seats |
| A trial | Days left, and a button to add a card | The Offer's trial |
| A failed renewal | A banner to update the card; everything still works | A Subscription in pastDue |
The same answer reaches the API and the MCP server, so an agent calling your App meets the same plan as a person clicking it. Checking access covers the check itself.
Lock a feature, cap a count
A feature is a Verb the plan grants. To lock CSV export to pro, grant Collection.export on that Offer with Offer.grant, and leave it off starter.
Show the locked button; never hide it. A locked button with the plan name on it is the cheapest upgrade prompt you have.
A cap is the same grant with a Limit. Give starter ten exports a day and set atBound:, and the eleventh export offers pro instead of failing. Cap what costs you money, and leave the rest unlimited.
Seats
A per-seat Price counts people. The Offer's seats says how.
seats | How the count moves | Use it for |
|---|---|---|
members | Follows the people in the Customer's Tenant: an invite adds a seat and prorates it in | Small groups that add people as they grow |
manual | The buyer sets the quantity; an invite past it asks an admin to buy a seat | Buyers who budget by headcount |
Charge per seat only when each extra person gets value of their own. Leaseline prices by units managed, not people, because one manager runs 200 units alone. Per seat there would cap its own growth.
When the plan moves
| Move | Access | Money |
|---|---|---|
| Upgrade | The new grants work on the next call | The prorated difference, charged at once |
| Downgrade | Keeps the higher plan to the end of the period | The lower amount from the next period |
| Past a new cap | Existing records stay readable; new writes past the Limit get the upgrade offer | None |
| Cancel | Full access until the period closes | Nothing more |
| A failed charge | Full access while retries run | Retried on the dunning schedule |
A plan change never deletes a record. Past a new cap, existing records stay readable and only new writes stop.
Next
- Charge per seat, lock a feature to a plan or cap usage on a plan: the asks.
- Anatomy of an Offer: every field an Offer holds.
- Recurring billing: proration, pauses and retries.