Why this matters
Quota pressure is an expansion signal. Underuse is a churn signal. Both are revenue moments that rarely show up in one place.
What you get
- Accounts near or over quota
- Accounts underusing paid plans
- Suggested action: upsell, enablement, downgrade risk, or no action
- A dashboard CS and revenue ops can review weekly
Walk through it
Which accounts are on the wrong plan?
I’ll rank quota usage by account and plan.
Endpoint: POST /v1/projects/:project_id/analytics/query
Exact shape: /v1/openapi.json?path=%2Fv1%2Fprojects%2F%7Bproject_id%7D%2Fanalytics%2Fquery&method=post
Custom HogQL goes in the OpenAPI-defined `query` field.
Concept fields:
query: "SELECT properties.account_id AS account, properties.plan AS plan, properties.metric AS metric, argMax(toFloat(properties.used), timestamp) AS used, argMax(toFloat(properties.limit), timestamp) AS limit, used / nullIf(limit, 0) AS utilization FROM events WHERE event = 'quota_snapshot' AND timestamp > now() - INTERVAL 14 DAY GROUP BY account, plan, metric ORDER BY utilization DESC LIMIT 50"
The output
The agent returns accounts grouped into expansion, risk, and healthy buckets. It should avoid treating temporary spikes as expansion without recent trend.
Setting it up
Emit a periodic quota_snapshot event from billing or usage metering. Include current plan and metric names.
Variations
- “Only show enterprise accounts.”
- “Find accounts over 80% for three days in a row.”
- “Publish a quota-health board for CS.”