What goes in a model usage and cost dashboard?
A model usage and cost dashboard answers the model-portfolio questions: which models handle the traffic, what each one really costs per token, and whether the mix is drifting toward expensive defaults. It's the page that turns 'should we switch models?' from a debate into a query.
Which cards belong on this dashboard?
- Requests by model (stacked bar over time)
- Prompt vs. completion tokens by model (stacked bar)
- Cost per 1M tokens by model (bar)
- Model mix share over time (area)
- Cache hit rate by model or app (line)
- Traffic still on deprecated or replaced models (table)
- Reasoning-token share where models report it (line)
- Cost per request by model (table)
What data does this dashboard need?
- Daily rollups per model: requests, prompt/completion (and reasoning) tokens, cost
- Model metadata: provider, family, deprecation status, list price
- Cache hit counts or cached-token fields where the gateway records them
- App tags so model mix can be split by workload
How do you build it?
- Sync usage rollups from your LLM gateway, tracing, or eval tool into a database, keeping stable IDs, timestamps, token counts, and costs.
- Build clean models at the grain this dashboard requires — daily per app and model is the workhorse.
- Create one saved question per card and certify the shared models and metric definitions.
- Add dashboard filters for Date range, model, provider, app, environment.
- Exclude test, staging, and playground traffic from headline cards, and show the refresh time.
Example card SQL
WITH totals AS (
SELECT
model,
SUM(requests) AS requests,
SUM(prompt_tokens + completion_tokens) AS total_tokens,
SUM(cost_usd) AS cost_usd
FROM llm_request_rollups
WHERE window_start >= CURRENT_DATE - INTERVAL '30 days'
AND environment = 'production'
GROUP BY model
)
SELECT
model,
requests,
ROUND(100.0 * requests / NULLIF(SUM(requests) OVER (), 0), 1)
AS traffic_share_pct,
ROUND(cost_usd, 2) AS cost_usd,
ROUND(1e6 * cost_usd / NULLIF(total_tokens, 0), 2)
AS cost_per_1m_tokens
FROM totals
ORDER BY cost_usd DESC;