← FinOpsAid blog

A usage signal is not a dollar — reconciling GitHub's AI credits to your bill
AI credits became a billing unit in June 2026, and your credit ledger still won't equal the invoice. What changed, what didn't, and how to reconcile the two without pretending either is the other.
Open a GitHub cost dashboard and it tells you that you spent a certain amount on AI last month. Open GitHub's billing page and it shows a different number. Nothing is broken. The two numbers are measuring different things, and the entire discipline of managing GitHub's AI spend comes down to understanding why — and refusing to pretend one is the other.
This got more interesting in June 2026, not less. Before then, credits were purely a usage metric and the advice was simple: never call them dollars. Since GitHub moved Copilot to usage-based billing, AI credits are the billing unit — consumption is priced at published per-model token rates and charged once you pass the allowance your subscription includes.
So the old shorthand needs retiring. Credits are no longer "not money". They are money with conditions attached, and the conditions are exactly where the two numbers still part company.
What GitHub's AI credits actually are now
A credit is a metered unit of AI consumption, priced. Input tokens, output tokens and cached tokens all draw against it at the rate published for whichever model served the request. That makes the credit ledger the closest thing to a real-time view of AI spend the platform has ever offered — it moves fast, it moves before the invoice does, and it tells you where consumption is happening while the month is still live.
What it still isn't is your bill. Three things stand between the two. Your subscription includes an allowance, so the first tranche of consumption changes the ledger and not the invoice. Promotional credits — Business and Enterprise accounts had them running into August 2026 — suppress the charge without suppressing the usage. And code completions and Next Edit suggestions consume no credits at all, so a large share of real Copilot activity never appears in the ledger in the first place.
The result is a ledger that leads the invoice, overstates it while an allowance is unspent, and understates total usage because the free surfaces are invisible to it. Directionally excellent. Not the thing you owe.
Why the signal and the bill disagree
The two numbers are never meant to match. A tool that silently reports the left bar as dollars is confidently wrong; the deliverable is the middle — each adjustment named, so finance can follow the arithmetic. Illustrative proportions.
Once you look for them, the reasons for divergence are everywhere:
- Lag. Usage signals are near-real-time; billed totals are reconciled by GitHub on their own cycle and arrive later. At any given moment the two are looking at different windows.
- Allowances and inclusions. Some usage is covered by an included allowance before anything is billed. Credits count the activity; the invoice only charges the overage.
- Proration and mid-cycle changes. A seat added on the 14th, a plan changed halfway through the month, a downgrade — all distort the naive "credits × rate" math.
- Rounding and aggregation. Signals are granular; bills are rounded and grouped. Small gaps compound.
- Modeled vs. attributed. Some costs GitHub attributes directly; others (per-repo Copilot cost, self-hosted runner cost, per-user dollars) can only ever be modeled. A model is an estimate, and an estimate is not an invoice line.
None of these are errors. They're the normal, expected distance between "how much did we use" and "how much are we billed."
The failure mode: confidently wrong
Here's how it goes wrong in practice. A tool takes the usage credits, multiplies by a published rate, and presents the result as "your AI spend." It looks precise. You carry it into a budget review. Finance pulls up the actual GitHub invoice, and it doesn't match — not by a rounding error, but by a margin large enough to notice.
Now you're not discussing cost control; you're defending your dashboard. And you've lost the more valuable argument, because the first casualty of a number that doesn't reconcile is your credibility on every other number you present. A metric you can't tie back to the invoice is worse than no metric at all: it actively costs you trust.
How to reconcile properly
The fix is not to pick one number and discard the other. It's to hold both, on purpose, and show the relationship:
- Meter the signal. Track credits and usage in near-real-time — that's your early-warning system and your attribution layer.
- Pull the billed totals. Get the authoritative dollars from GitHub's billing API, on GitHub's clock.
- Show the gap. Put the modeled figure and the billed figure side by side and surface the variance rather than hiding it inside a blended "spend" number.
- Label every estimate as an estimate. Anything modeled — per-repo, per-user, per-runner — carries that label and an as-of timestamp. No modeled dollar ever masquerades as a billed one.
Meter the signal, anchor it to the invoice, and never conflate the two. That's the whole discipline in one line.
Why the gap is a feature, not a bug
The instinct is to treat any divergence between model and bill as a defect to eliminate. It isn't. The gap is information. When your modeled AI spend and the billed total drift apart, one of two things is true: either your model has a data problem worth fixing, or there's a real cost driver you didn't understand yet — an allowance you blew through, a workload that grew, a plan detail you'd forgotten. Both are things you want to know. A tool that smooths the gap away to look tidy has thrown out the single most useful reading on the dashboard.
This is the same principle that runs under every other GitHub cost decision — reclaiming idle Copilot seats, attributing spend to teams, the whole FinOps playbook. Meter the signal, reconcile it against the bill, present estimates as estimates.
That reconciliation — credits metered in near-real-time, anchored to the billed invoice, every modeled figure labeled and timestamped — is the layer FinOpsAid refuses to skip. It's why the numbers on a Cost Explorer page are ones you can carry into a budget meeting and defend.
Frequently asked questions
Are GitHub AI credits the same as dollars?
No. Credits are a measure of usage, not a billed total. Consumption inside your included allowance bills nothing, so credits and the invoice legitimately disagree. Any tool that presents a credit count as spend will be confidently wrong in a way that is hard to catch.
Why does the credit ledger disagree with the GitHub invoice?
Because allowances, promotional credits and the credit-free surfaces all sit between them. The gap is explainable rather than an error — it just has to be explained. Treat it as a feature of the data, not a defect, and reconcile the signal against the billed figure rather than substituting one for the other.
How do I reconcile AI credits to what I was actually billed?
Take the billed line as the anchor and treat credits as the explanatory signal beside it. Reconcile in that direction — never derive a dollar figure by multiplying credits by an assumed rate, because the allowance means the effective rate is zero until it is exhausted.
Want to see the gap between your AI usage signal and your actual GitHub bill? Connect your GitHub org — read-only and free during beta — or explore the demo dashboard first.