← FinOpsAid blog

Where is the money actually going? A section-by-section guide to the Cost Explorer
Gross vs net, billed vs modeled, product vs SKU vs model, and why per-repository spend only shows CI. Every card on the FinOpsAid Cost Explorer, explained.
Cost Explorer is where you go after Overview tells you something moved. It is the only page in FinOpsAid that shows the gross → discount → net chain, and it is the page where the difference between a billed number and an attributed number is most likely to bite you.
Read the grammar behind every number first if you haven't — the badge and direction conventions below are defined there.
The page in nine zones
Teal = billed and invoice-grade. Amber = modeled. Zone 6 reconciles to your GitHub bill. Zones 7 and 8 are our attribution model applied on top of it, and both say so on the page.
Zone 1 — The toolbar, and what each control changes
Four controls, and they compose rather than compete.
- Period (page header, top right) sets the date window for the whole page. Every card below re-fetches against it.
- Granularity — Daily or Monthly — changes the bucket size inside that window, and also relabels two KPI tiles ("Average Daily Spend" becomes "Average Monthly Spend", "Highest Day" becomes "Highest Month").
- Group by — Product, SKU, or Model — drives the Cost drivers card at the bottom. Nothing else.
- Compare to — Previous period or No compare — shows or hides the Compare periods card. "Previous period" means the equal-length window immediately before the one you selected, not the same window last year.
The Save view and Share buttons at the far right are UI placeholders in the current build; they don't persist anything yet.
Zone 2 — Six KPI tiles
| Tile |
What it counts |
Higher means |
| Total Spend |
Billed spend summed across the selected period. The footnote repeats the period so the number is never orphaned. |
Worse |
| Average Daily / Monthly Spend |
Total ÷ number of buckets. The delta is week-over-week, which is a different comparison from the tile beside it. |
Worse |
| Highest Day / Month |
The single most expensive bucket in the window, with its date underneath. |
Worse — and a big gap between average and highest is a spikiness signal worth chasing on Alerts. |
| Repositories |
Count of repositories in scope, with the active count as a footnote. |
Neutral. |
| Cost / Dev (Active) |
AI cost divided by active developers, not by headcount. Footnote gives the denominator. |
Worse, but read it as unit economics — rising cost per dev with flat total spend means fewer people are using the tool. |
| Forecast (month) |
Projected month-end spend, with a month-over-month delta. |
Worse |
The denominator on Cost / Dev is the thing to check. Dividing by active developers rather than by everyone with a seat gives you the true unit cost of a person who actually uses the tool — which is the number that belongs in a business case, and a different number from the one you get by dividing the bill by headcount. There's a longer treatment in cost per active developer.
Zone 3 — Spend over time
The same three-tab metric switcher as Overview — Billed / AI credits / Both — plus two extras that only appear on the Billed tab:
- A chart-type selector: Area (trend) or Bars.
- On Area, the last four points are drawn dashed. That's a forecast, not data. The legend under the chart spells it out: solid = Actual, dashed = Forecast.
- On Bars + Monthly granularity, the bars are coloured by month-over-month difference, and the legend changes to "▲ Costlier than previous month / ▼ Cheaper than previous month". This is the fastest way to see which month broke the pattern.
Zones 4 and 5 — Product and model breakdowns
Spend by product appears twice, deliberately: a donut for share-of-total and a ranked horizontal bar list for exact amounts with percentages. Both are net billed cost — after discount. The donut caps at the top five products; the ranked list at six.
AI credits over time is the credit-specific version of the trend card: billed AI-credit dollars on one axis, credits used on the other. AI credits by model ranks billed dollars per model beside it. That pairing answers "did spend rise because we used more, or because we used something more expensive?" — usage on the left, mix on the right.
Zone 6 — SKU detail, the one table that reconciles
This is the invoice-grade table. Sorted by net descending, with a totals row and a CSV export. If a number elsewhere on the page is disputed, this is where you settle it.
Zone 7 — Spend by repository, and its one big limitation
The card subtitle states the limitation plainly, and it's worth restating: the per-repo figure is modeled GitHub Actions cost only. GitHub does not attribute Copilot spend to repositories, so no amount of engineering makes a per-repo Copilot dollar figure appear. A repository with heavy Copilot use and no CI shows $0 here, correctly.
Worth knowing what did change: repository-level Copilot usage metrics went generally available in July 2026, covering coding-agent and code-review activity per repo. That's a real attribution signal and we expect to surface it — but it is activity, not dollars, and turning it into a per-repo cost would mean inventing an allocation rule. When that arrives it will be labelled modeled, like everything else we allocate.
Columns: Runs, Failed (rendered in the warning colour when non-zero), Minutes, Actions Cost, Health, and a small sparkline. Only the top five by cost are shown; "Show more" goes to the full Repositories page. The search box filters before the top-five cut, so searching a repo name will surface it even if it isn't in the top five overall.
Minutes is the honest column. It's the billable signal. Actions Cost is that signal multiplied by a rate — useful for ranking, not for reconciliation.
Zone 8 — Cost attribution, and why department may be empty
This section has its own heading, an amber EST chip, and a one-line disclaimer: Copilot cost is not attributed to teams/departments by GitHub — these splits are our model. Everything under it is modeled.
Chargeback by department frequently reads "No department map loaded — department/location come from HRIS/SCIM, not GitHub." That is not a bug. GitHub has no concept of a department. Until an HRIS or SCIM feed supplies the mapping, there is nothing to split by, and inventing one would be worse than showing nothing. Clicking a department drills into its members.
By team does the same split by GitHub team. Same overlap caveat as everywhere else: a developer on three teams contributes to three rows.
Zone 9 — Drivers, comparison, anomalies
Cost drivers is a pie of the top six values for whichever dimension you chose in Group by. Switch Group by to Model and it answers "which model is the spend"; switch to SKU and it answers "which line item".
Compare periods appears only when Compare to is set to Previous period. It lists total spend plus the top four drivers, each with the current figure and a delta against the equal-length prior window. Standard cost semantics apply: a rising delta renders red.
Anomaly detection shows the newest spike in each of the three monitored series — spend, credits, and Actions minutes — with the percentage above the trailing baseline. It's a preview; the full ranked feed is on Alerts. The "Investigate" button is a placeholder in the current build.
What people get wrong on this page
- Comparing Gross to the invoice. Net is the billed figure. Gross is list price.
- Expecting per-repo Copilot cost. It doesn't exist at source. Per-repo means CI.
- Reading two deltas as the same comparison. Average Spend deltas week-over-week; Forecast deltas month-over-month; Compare periods deltas against the prior equal-length window. Three different baselines on one page.
- Treating the department split as chargeback-ready. It's marked EST for a reason, and it's empty without an HRIS feed.
- Forgetting Group by only drives the drivers pie. Changing it doesn't re-cut the rest of the page.
The 60-second read
- Set the Period, then check Total Spend against Highest Day — a large ratio means spikiness, not growth.
- Spend over time on Bars + Monthly to find the month that broke the pattern.
- SKU detail totals row against the invoice, if reconciliation is the job.
- Cost drivers on Model if AI spend is the question; on SKU if the bill is.
- Anomaly card last — it tells you where to look next.
Frequently asked questions
What is the difference between gross, discount and net in the SKU table?
Gross is list price before any agreement. Discount is the reduction your GitHub agreement applies, shown with a minus sign. Net is what you were actually billed, and it is the only column that reconciles to the invoice. Every other dollar figure on the page derives from net.
Why does Cost Explorer show no Copilot cost per repository?
GitHub does not attribute Copilot spend to repositories, so no per-repo Copilot figure exists at source. The per-repository column shows modeled GitHub Actions cost only. A repository with heavy Copilot use and no CI correctly shows zero there.
Why is the chargeback by department card empty?
Department and location come from an HRIS or SCIM feed, not from GitHub — GitHub has no concept of a department. Until that mapping is supplied there is nothing to split by, so the card says so rather than inventing an allocation.
Want to explore your own spend? Connect your GitHub org — read-only and free during beta — or try the demo first. Next: how to read the Repositories page.