Mission Control: provider spend, budgets, and burn rate
Session logs are a good lens on agent work. They are a weak lens on the bill.
Mission Control already estimated cost from agent sessions when logs and pricing tables were available. That still misses traffic that never hits a local collector, lags real invoices, and cannot tell you whether the month is on track. The latest work closes that gap with provider billing connectors, a homepage Direct API Spend card, a clearer split on Consumption, and budgets with burn-rate forecasting.
The code is in BenBish/mission-control. For the product shape after the OpenClaw pivot, see the Mission Control write-up. For Grok as a first-class agentic source, see Adding Grok support.
Why agent-only cost was incomplete
Agent Usage comes from collectors: JSONL scanners and related session paths. That is the right unit when you ask “what did this Claude Code or Codex session spend?”
It is the wrong unit when you ask “what did OpenRouter / Anthropic / OpenAI / xAI charge this account?” Those answers live in provider usage and cost APIs. They cover keys and traffic that never show up as a local session file. They also finalize late, disagree with model-id labels, and should not be naively added to session-derived dollars.
So Mission Control keeps two tracks:
- Agent Usage - session-scoped tokens and estimated cost from collectors (respects the source filter).
- Direct API Spend - account-wide provider-billed usage (independent of the source filter). Never summed with Agent Usage.
Provider API connectors
A pluggable connector layer syncs account-level usage and cost from:
| Provider | Role |
|---|---|
| OpenRouter | Activity / usage for routed models |
| Anthropic | Admin usage and cost reports |
| OpenAI | Organization usage and costs |
| xAI | Key check plus optional usage export endpoint |
Each connector has its own credentials (env-based), last-sync status, and failure surface. Sync is incremental. Auth errors and rate limits show up as connector status instead of crashing the API. Docs call out real caveats: OpenAI cost line_item labels may not match completion model ids exactly, and OpenRouter BYOK spend can also appear under a direct Anthropic or OpenAI connector if both are configured.
That is the foundation. Everything below is UI and insight on top of those normalized rows.
Direct API Spend on the homepage
Provider spend used to sit near the bottom of Consumption. Cost is a primary operator concern, so it now has a dashboard card next to Tokens Today and Failures.

The card shows:
- Today as the primary figure
- Trailing 30-day total and last successful sync as context
- Explicit account-wide labeling (source filter does not shrink this number)
- Honest empty / stale / error states so missing sync never masquerades as true
$0
Clicking through deep-links into the provider billing view on Consumption with a sensible range selected.
Consumption: two tabs, one rule
Consumption now separates Agent Usage and Direct API Spend as first-class views rather than one mixed chart. The page description states the rule in plain language: separate datasets, not summed together.
That matches how you operate. Filter Claude Code on the dashboard when you care about agent traffic lights. Open Direct API Spend when you care about the invoice.
Budgets, burn rate, and alerts
Once provider billing is visible, the next question is whether the month is on track. Consumption’s Direct API Spend view adds:
- Configurable monthly provider-spend budget (Settings budgets tab, also deep-linked from the empty state)
- MTD spent, budget remaining, progress percentage
- Burn rate (MTD spend divided by days elapsed) and month-end forecast
- Daily spend trend with prior-period comparison
- Spend anomalies when a day exceeds a documented baseline
- Stale or failed connector sync banners, including forecast reliability when data is incomplete

Forecast honesty matters. If sync history is thin or connectors are stale, the UI marks the forecast unreliable instead of pretending precision. Partial-month math includes today as a full day for safety. Timezone for the budget window is configurable rather than hard-coded to the browser alone.
Operator takeaways
Do not double-count. Session-estimated Agent Usage and provider-billed Direct API Spend can overlap (same Claude call, two lenses). The product refuses to add them into one vanity total.
Sync health is part of cost UX. A green $0 with a failed connector is a lie. Status chips, last-sync timestamps, and unreliable-forecast banners are intentional.
Budgets need connector coverage. A monthly budget on Direct API Spend only means as much as the keys you configured. Unconfigured providers are visible as not configured, not as free.
Agent filters stay for agents. Source chips still scope sessions, activities, and Agent Usage. Direct API Spend stays account-wide so a Claude Code filter cannot hide OpenRouter invoice lines.
Status
Provider connectors, homepage Direct API Spend, Consumption tab split, and budgets / burn-rate / anomaly surfaces are on Mission Control main. They sit next to the existing multi-source collectors (Claude Code, Codex, Grok, Hermes, ComfyUI, and the rest) without replacing them.
If you already run a hub, wire the provider env keys documented in the repo deploy guide, set a monthly budget if you want one, and watch the Direct API Spend card instead of digging for a buried table.
Takeaway
Mission Control started as multi-source session observability. Provider connectors push it into account-level billing observability without pretending those two data sources are the same number. Homepage spend, separate Consumption tabs, and budget forecasts are the boring operator layer on top: see the burn, see the sync health, and leave the agent session story intact.