What your GitHub Actions bill actually charges you for

A GitHub Actions bill is a sum of individually priced line items, each identified by a billing SKU such as a runner minute, a storage gigabyte-month, or a per-seat license, and every total the tool on this page shows you is read directly from those line items in your own usage report rather than recomputed from a rate table anywhere on the page.

This page explains what each column in that export means, what GitHub actually charges per runner-minute today, and how to read a github actions cost by workflow breakdown once you upload your own usage report to the tool below.

Reading your usage report: gross, discount, and net

A GitHub enhanced-billing usage report is a CSV with a required and an optional set of columns. Every row needs a date, a SKU, a gross amount and a net amount to be recognized as a usage report at all; everything else is optional context that degrades to a blank value rather than causing an error.

Gross cost is the pre-discount list price of a billing line — quantity multiplied by the list rate GitHub sets for that SKU — while net cost is what GitHub actually charged after subtracting any discount, such as a free-tier credit or a negotiated rate, and the relationship between the two is the identity gross minus discount equals net, which every correct usage report export satisfies.

Required — a CSV missing any of these is rejected

  • Date
  • SKU
  • Gross amount
  • Net amount

Optional — absent columns degrade to blank or zero

  • Product
  • Quantity
  • Unit type
  • Discount amount
  • Organization
  • Repository
  • Cost center
  • Workflow path
  • Workflow name
Date
The calendar day the usage occurred.
SKU
The billing line-item identifier — which product, runner, or resource was used, such as "Actions Linux 2-core."
Gross amount
What that line item would cost before any discount is applied — quantity multiplied by GitHub's list rate.
Net amount
What GitHub actually charged for that line item after any discount — this is the number that lands on the invoice.
Product
The top-level GitHub product the charge belongs to, such as Actions, Packages, or Codespaces.
Quantity
How many units of the SKU were consumed, such as minutes or GB-hours.
Unit type
The unit the quantity is measured in — minutes, GigabyteHours, user-months, and so on.
Discount amount
The dollar amount subtracted from gross to reach net — free-tier credit, included-usage allowance, or a negotiated discount.
Organization
The GitHub organization the usage is billed under.
Repository
The repository the usage is attributed to, when GitHub's export can attribute it.
Cost center
The internal cost-center label an organization assigned to this billing line, if cost centers are configured.
Workflow path
The file path of the GitHub Actions workflow that generated the charge, such as .github/workflows/ci.yml, when attributable.
Workflow name
The human-readable name of that workflow, when attributable.

What GitHub actually charges per runner-minute

GitHub retired the classic Linux-times-one, Windows-times-two, macOS-times-ten minute-multiplier model that used to describe runner pricing, and now publishes flat, OS-and-core-count-specific per-minute USD rates for each runner SKU instead, with no multiplier arithmetic layered on top of those published rates.

The table below lists the per-minute rate for every runner SKU the fixtures and dummy report bundled with this tool exercise. The rate divided by Linux 2-core baseline column is a ratio this page derives for readability, not a multiplier GitHub itself publishes.

RunnerOSPer-minute rateRate ÷ Linux 2-core baseline
Linux 2-coreLinux$0.006/min1.00×
Windows 2-coreWindows$0.010/min1.67×
macOS 3-core or 4-coremacOS$0.062/min10.33×
Linux 4-coreLinux$0.012/min2.00×
Linux 8-coreLinux$0.022/min3.67×
Windows 4-coreWindows$0.022/min3.67×
macOS 12-coremacOS$0.077/min12.83×

Source: Actions runner pricing, docs.github.com.

Not every billing SKU in a usage report is a runner minute. The table below lists every SKU string the fixtures and dummy report bundled with this tool exercise, and whether it is priced per runner-minute at all.

SKUCoverage
Actions Linux 2-coreStandard Linux 2-core runner minutes, priced in the table above.
Actions Linux 4-corex64 larger-runner Linux 4-core minutes, priced in the table above.
Actions Linux 8-corex64 larger-runner Linux 8-core minutes, priced in the table above.
Actions Windows 2-coreStandard Windows 2-core runner minutes, priced in the table above.
Actions Windows 4-corex64 larger-runner Windows 4-core minutes, priced in the table above.
Actions macOS 3-core (M1)Standard macOS 3-or-4-core runner minutes, priced in the table above.
Actions StorageBilled per GB-month, not per runner-minute, so it is not a row in the runner rate table.
Packages StorageBilled per GB-month, not per runner-minute, so it is not a row in the runner rate table.
Codespaces Compute 4-coreA real compute SKU, but billed per hour rather than per minute, so it is not a row in the runner rate table.
ghec_licensesA per-user-per-month license charge, not compute at all, and GitHub does not publish a public flat rate for it.

Storage and Codespaces usage are priced on entirely different units — per gigabyte-month or per hour, not per minute — so they are listed separately below rather than folded into the runner-minute table above.

ItemUnitRate
Actions cache storageper GB-month$0.07
Shared storage (artifacts, GitHub Packages)per GB-month$0.25
Codespaces compute, 2-coreper hour$0.18
Codespaces compute, 4-coreper hour$0.36
Codespaces storageper GB-month$0.07

Where your GitHub Actions cost by workflow comes from

Every usage row that GitHub can attribute to a workflow carries a workflow path and a workflow name. Grouping the gross cost the report itself contains by that workflow path, then sorting by gross cost, produces a github actions cost by workflow breakdown: the workflows spending the most CI budget, ranked, without recomputing any figure GitHub did not already provide in the export.

This is the most useful cut for most teams, because a workflow — not a repository or a day — is usually the unit a team actually changes when it wants to reduce CI spend. A workflow file is something an engineer edits directly, so a per-workflow ranking points straight at the change that would lower the bill, in a way a per-day total or an org-wide figure cannot.

The breakdown also lists which repositories each workflow ran in and its total billable minutes alongside its gross cost, so a workflow that looks expensive because it runs constantly reads differently from one that is expensive because a single run is slow.

Breaking cost down by repository

A per-repository view matters more than a per-workflow view when an organization spans multiple repositories and needs to charge cost back to a team or a cost center, rather than to a single CI pipeline. The repository breakdown sums the same gross-cost figures the workflow breakdown does, grouped by repository instead of by workflow.

This view answers a different question than the workflow breakdown: not which pipeline to optimize, but which team or product line is actually driving the bill, which is the number a cost-center chargeback conversation usually needs first.

Projecting your run rate

The projected monthly run rate takes the net cost of the days already covered by an uploaded usage report and extrapolates it to a thirty-day month by dividing net cost by days covered and multiplying by thirty, which answers what the current month is on pace to cost rather than promising a final, guaranteed bill.

A short report window makes the projection noisier: a report that only covers three days will extrapolate a single unusually busy or unusually quiet day across the rest of the month, so the projection gets more reliable the more days of usage it is given to work from.

Frequently asked questions

What is the difference between gross cost and net cost?

Gross cost is what a line item would cost before any discount — quantity multiplied by GitHub's list rate. Net cost is what GitHub actually charged after any discount, such as a free-tier credit or a negotiated rate. Net equals gross minus discount, and that identity is what a correct usage report export satisfies.

Does GitHub still charge Actions minutes with an OS multiplier?

No. GitHub retired the classic Linux-times-one, Windows-times-two, macOS-times-ten minute-multiplier model. GitHub now publishes flat, OS-and-core-count-specific per-minute rates for each runner SKU, with no multiplier arithmetic layered on top. Any multiplier shown on this page is a derived ratio to the cheapest standard Linux 2-core rate, for readability, not a rate GitHub itself publishes.

How is the projected monthly run rate calculated?

The projected monthly run rate takes the net cost of the days already covered by the report and extrapolates it to a 30-day month: net cost divided by days covered, multiplied by 30. It answers what the current month is on pace to cost, not a guarantee of the final bill.

Where does the per-workflow cost breakdown come from?

Every usage row in a GitHub Actions billing export can carry a workflow path and workflow name when GitHub's export can attribute it. Grouping the report's own gross cost by that workflow path produces a per-workflow breakdown, sorted by gross cost, without recomputing any figure GitHub did not already provide.

Does Tolly upload my usage report anywhere?

No. The CSV you drop in is parsed entirely in your browser by JavaScript running on your device. It is never uploaded, never transmitted to a server, and never seen by Tolly. Closing the tab removes it completely, because it was never sent anywhere.

When is a per-repository view more useful than a per-workflow view?

A per-repository breakdown matters most in a multi-repository organization that needs to charge cost back to a team or a cost center, rather than to a single CI pipeline. It answers which team is driving the bill, where a per-workflow breakdown answers which pipeline to optimize.

Which columns are required for a CSV to be recognized as a usage report?

Four columns are required: date, SKU, gross amount, and net amount. A CSV missing any of these four is rejected as not a GitHub enhanced-billing usage report. Every other column — product, quantity, unit type, discount amount, organization, repository, cost center, workflow path, and workflow name — is optional and degrades to a blank value or zero when absent.

Which billing SKUs count as a runner minute, and which don't?

Actions runner minutes across Linux, Windows, and macOS are priced per runner-minute. Storage SKUs (Actions cache storage, Packages storage) are priced per gigabyte-month, Codespaces compute is priced per hour, and GitHub Enterprise Cloud per-seat licenses are priced per user-per-month — none of these are runner-minute SKUs, so none of them appear in the per-minute runner rate table above.

Why doesn't the free-tier credit show up against a specific workflow?

The free-tier credit is a single org-level line on the headline totals, and it is never allocated down to an individual workflow, repository, SKU, or day. Every workflow, repository, and SKU breakdown on this page is stated in gross cost, before that org-level credit is applied.

Does a header column need to match GitHub's export wording exactly?

No. Header matching ignores case, surrounding whitespace, and currency suffixes such as ($), so Gross Amount, gross amount ($), and GROSS AMOUNT all match the same field. Column order in the CSV does not matter either.

How does the tool know which rows count toward billable minutes?

A row counts toward a workflow's billable minutes when its unit type column indicates a minute-denominated row. Storage rows, which are denominated in gigabyte-hours rather than minutes, are excluded from that total even though they still count toward gross and net cost.

Why does a macOS runner minute cost so much more than a Linux runner minute?

A standard macOS runner minute is priced at roughly 10 times the standard Linux 2-core rate, which is the largest gap in the rate table above. GitHub prices this per SKU directly rather than through a multiplier applied to the Linux rate, but the ratio is large enough that a workflow pinned to a macOS runner is usually worth checking for a Linux-compatible alternative.

Why can Tolly say the CSV is processed entirely in my browser?

The parser that reads the CSV is JavaScript that runs on your device after the page loads, and it has no network call in its code path from a file being selected to the results view rendering. Nothing about the file's contents is sent to any server, so the claim is verifiable by inspecting the network requests your browser makes while uploading a file.

How was the runner rate table's multiplier column derived?

It is this row's per-minute rate divided by the cheapest standard Linux 2-core rate, computed directly from the fetched GitHub rates. It is a comparison this page adds for readability, not a figure GitHub publishes as a multiplier, since GitHub's current billing docs use flat per-minute rates with no multiplier baseline of their own.

Analyze your own usage report

Upload the CSV below and Tolly applies everything on this page to your own GitHub Actions bill, entirely inside your browser.

No account. No upload. No cookies.

Find out what your usage report actually says.

Drop in the enhanced billing export and Tolly reads out the billed minutes and amounts it hides — by workflow, repository, runner SKU and day — entirely inside your browser.

Drop your usage report CSV here

The enhanced billing export — Settings → Billing → Usage.

Parsed in this tab. Nothing is uploaded. Close the page and it’s gone.

A month of Actions, itemized

This is the breakdown a real usage report produces.

Net cost$976.65
Run-rate$2,092.82
terraform-plan.yml$263.79
ci.yml$239.47
release.yml$220.91
nightly-e2e.yml$178.17
2025-06-012025-06-14

Daily gross cost, split into compute, storage and other — the spikes are usually nightly jobs.

1

Export the usage report

Organization settings, billing, usage. Pick a month and download the CSV.

2

Drop it in

Read locally, priced from the report's own gross, discount and net columns. No estimates.

3

See where the money went

Cost by workflow, repository, runner SKU and day, with a projected monthly run-rate.

See what every pull request costs, without asking

Tolly is a read-only GitHub app. It attributes every billed minute to the pull request, workflow and team that caused it, then comments on the PRs that make CI more expensive — before they merge.

One email when it opens. Nothing else.

Only your email is sent. Your report stays in this tab. Privacy policy.