#36 Multi-plan catalog: Founders ($10, public), Standard ($15), Pro ($40), Business ($99), Backer ($0). Future tiers seeded but hidden/is_selectable=false. Backer email whitelist auto-assigns Founders-level access with no checkout.
#36 Feature + prompt gating: plan feature flags (text vs image); rolling 6h prompt windows (100 / 200 / 300 / 300 / 300). Enforced in both chat consumers when ENFORCE_SUBSCRIPTION_GATES=true.
#17 Token-period quotas: optional monthly_token_quota on plans + per-user override; calendar-month aggregation from PromptMetric; warn/block when reported token totals exceed cap. Null provider usage never fabricated as 0; tracked via turns_missing_token_usage.
#16 Token API exposure: tokens_in / tokens_out on conversation + prompt serializers (null when unknown). GET /api/finance/subscription/ returns plan + usage snapshot for the FE.
Checkout defaults to Founders; Stripe paid webhooks assign Founders. Registration/OAuth redeem Backer whitelist and return needs_checkout.
Companion FE PR: chat_web_app branch feature/plans-quotas-token-usage.
Test plan
manage.py migrate seeds five plans; admin can add Backer emails
Public GET /api/finance/plans/ returns only Founders
Register with Backer email → active Backer, needs_checkout=false, checkout rejected
Founders checkout + paid webhook → active Founders subscription
Chat turn blocked without subscription / when prompt window exceeded / when token period exceeded
Standard plan denies image feature; Pro/Founders/Backer allow
Conversation/prompt API returns null tokens when unreported, sums when present
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Implements #16, #17, and #36 in one backend PR.
is_selectable=false. Backer email whitelist auto-assigns Founders-level access with no checkout.ENFORCE_SUBSCRIPTION_GATES=true.monthly_token_quotaon plans + per-user override; calendar-month aggregation fromPromptMetric; warn/block when reported token totals exceed cap. Null provider usage never fabricated as 0; tracked viaturns_missing_token_usage.tokens_in/tokens_outon conversation + prompt serializers (null when unknown).GET /api/finance/subscription/returns plan + usage snapshot for the FE.needs_checkout.Companion FE PR:
chat_web_appbranchfeature/plans-quotas-token-usage.Test plan
manage.py migrateseeds five plans; admin can add Backer emailsGET /api/finance/plans/returns only Foundersneeds_checkout=false, checkout rejectednulltokens when unreported, sums when presentfinance.tests.test_plans_quotas+ existing finance/checkout tests pass