Say which plan an organization is on, and who may change it

FeatureSecurityService
Shipped
September 6, 2026 at 5:42 PM UTC
Author
Kamo
Commit
c550f7d

The console could tell that a trial was running and nothing else. entitlementSource is "TRIAL" or null, so free, expired-trial, paid and comped organizations were all the same value — which is why an organization whose trial had just ended saw no pill, no explanation, and no sign that the product had become smaller. planMode names the state and planAccessTier names who may act on it. Both ride the entitlement payload every page already loads, so the pills that read them cost no extra request on any route — which matters, because the nav rail renders on all of them. entitlementSource is deliberately untouched. It has two values today and is read by two pill sites plus, pre-authentication, **************** which paints the login and register screens; widening it would change what all three mean at once. Precedence is PAID > COMP > TRIAL_ACTIVE > TRIAL_PENDING > TRIAL_EXPIRED > FREE over subscriptions filtered by the shared isLive rule — the same one BillingService's EntitlementModeResolver uses, so the two cannot disagree about a PAST_DUE account inside its grace period. It is load-bearing: a FREE_DEFAULT row is seeded at signup and is never removed when a plan is bought, so "the first row found" reports FREE for most paying customers. The tier is resolved here rather than in the browser because the browser cannot resolve it honestly: deciding it from account-membership rows means listing members, which already requires the access being decided. A delegate counts only on an Account funding THIS organization — platform staff routinely administer Accounts targeting elsewhere.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing