Every plan ships with a fixed pool of usage quotas. Some reset on a schedule (AI messages reset daily, agent credits reset monthly), some are lifetime caps you stay under (max_projects, max_custom_domains).
How quota types differ
| Quota type | Behaviour | Examples |
| Period-bound counter | Increments on use, resets at the start of each period (UTC). | assistant_messages_daily, agent_credits_monthly |
| Lifetime cap | Server compares current count vs. limit at creation time; no auto-reset. | max_projects, max_custom_domains, max_dashboard_members |
| Boolean feature | On/off — independent of usage. | mcp_server, writing_agent, password_protection, custom_css |
Period boundaries
| Quota | Period | Reset moment |
assistant_messages_daily | 24 hours | UTC midnight |
agent_credits_monthly | Calendar month | 1st of every month, 00:00 UTC |
What "credit" means
A writing-agent credit is roughly 1,000 tokens (input + output combined). A typical "improve this page" run on a 500-line MDX file costs 3–8 credits. Your usage on every run is shown inline on the diff modal:
Used 5 credits · 4,231 in / 892 out · 4,995 of 5,000 left this month
What happens when you hit a cap
| Scenario | Behaviour |
| Under quota | Allowed, counter increments |
| Over quota + overage configured (Pro/Team writing agent) | Allowed, billed $0.01 per overage credit at month end |
| Over quota + no overage | Denied with 429 Too Many Requests; the counter rollback is atomic so you don't get charged for the rejected call |
| Lifetime cap hit | Creating one more (project / domain / member) returns a friendly error with an upgrade link |
The Retry-After header on 429 tells the client when the daily counter resets.
Where to see your usage live
Settings → Subscription → Usage this period shows a live meter for every quota:
Members used / limit
Projects used / limit
Custom domains used / limit
AI assistant messages used / limit (daily)
Writing agent credits used / limit (monthly)
The bars turn amber at 75%, red at 90%, and the row swaps to a "Limit reached — upgrade for more" CTA when full.
Resets are precise
We use the database now() (UTC) for every period window — there's no batched "we'll reset overnight" job. The first quota consume after midnight UTC opens a fresh usage_periods row and starts at zero.
Plan changes mid-period
Upgrading mid-month does not reset your existing usage — the new (higher) cap just applies to the same counter. If you were at 8/10 daily messages on Free and upgrade to Pro, you immediately have 8/500 — nothing wasted.
Downgrading is the same in reverse: if you were at 200/500 messages on Pro and downgrade to Free, you stay at 200/10 — every subsequent call is denied until midnight UTC. Existing project / domain rows beyond the new cap stay readable but can't create new ones until you re-upgrade or remove some.
Relationship to plan-gate UI
Every gate the platform enforces — UI button disabled, settings tab locked, server-side 402/429 — reads from the same resolver. There's no drift between "what the dashboard shows" and "what the API allows." See Plans for which features each tier unlocks.