GitHub Actions pricing, explained
GitHub Actions pricing has two halves: what GitHub includes for free, and what each additional minute costs once the allowance runs out. The free half depends on your plan and repository visibility. The paid half depends on the runner's operating system and size, plus billing rules, like rounding every job up to a whole minute, that decide what a run really bills. This page carries GitHub's own numbers, then the two levers that lower the bill.
Try StarSling runnersHow StarSling worksTopics covered: This guide covers GitHub's included-minutes free tier, the per-minute rates by runner OS and size, the billing rules that inflate a bill, and how to pay less per minute without leaving GitHub Actions.
GitHub Actions cost calculator
Pick a runner, enter your minutes, and the estimate updates as you type: what the workload bills on GitHub-hosted runners at the published rates below, next to the same workload on StarSling's published rate card. Your plan's included minutes are deducted first on standard runners; larger runners are always billed.
Rates checked 2026-09-28 · GitHub's published ratesIs GitHub Actions free?
GitHub Actions is free for public repositories on standard GitHub-hosted runners. Private repositories get an included-minutes allowance by plan (2,000 per month on Free, 3,000 on Pro and Team, 50,000 on Enterprise Cloud), then pay per minute: $0.006 for standard Linux, $0.010 for Windows, $0.062 for macOS, and $0.002 for a 1-core Linux runner. Larger runners are always billed, and every job is rounded up to a whole minute. GitHub cut hosted-runner prices by up to 39% on January 1, 2026, and postponed its planned $0.002-per-minute charge for self-hosted runners, so self-hosted runners still bill no GitHub minutes.
Monthly estimate
GitHub-hosted
$192.00
20,000 min on StarSling = 32,000 min on GitHub-hosted · 2,000 included
StarSling
$80.00
20,000 billed min
Save $112.00
per month · 58% less
Estimates use GitHub's published list rates and treat every minute as billed after rounding; storage and re-runs are extra on any provider.
Real results
TL;DR
- Public repositories run free on standard GitHub-hosted runners. Private repositories get an included-minutes allowance by plan, then bill per minute.
- The per-minute rate depends on the runner: Linux is the cheapest, Windows bills more, macOS bills roughly ten times the Linux rate, and larger runners are always billed, even on public repositories.
- GitHub rounds every job up to the next whole minute, so many short jobs, matrix legs, and re-runs bill more than the compute they use.
- The bill has two levers: bill fewer minutes (caching, path filters, cancelling superseded runs, timeouts), and pay less per minute (a drop-in runner label change).
- Want the audit done for you? Run the free /ci-speedup skill to find where your workflows waste billed minutes, then use this page to check its math.
What GitHub includes for free
Included minutes apply to private repositories running on standard GitHub-hosted runners; usage on standard runners in public repositories is free. The allowance resets monthly.
| Plan | Included minutes / month | Artifact storage | Who it covers |
|---|---|---|---|
| Free | 2,000 | 500 MB | Personal accounts and organizations on the free plan |
| Pro | 3,000 | 1 GB | Individual accounts on GitHub Pro |
| Team | 3,000 | 2 GB | Organizations on the Team plan |
| Enterprise Cloud | 50,000 | 50 GB | Organizations on GitHub Enterprise Cloud |
GitHub Actions runner pricing by size
Once the included minutes are spent, each additional minute bills at a rate set by the runner's operating system and size. These are GitHub's published rates, checked 2026-09-28.
| Runner | Rate | What it means for the bill |
|---|---|---|
| Linux 1-vCPU (slim) | $0.002/min | The cheapest GitHub-hosted runner, for light jobs like linting and labeling. |
| Linux 2-vCPU (standard) | $0.006/min | The baseline. ubuntu-latest jobs on private repositories draw included minutes first, then bill at this rate. |
| Linux 2-vCPU (arm64) | $0.005/min | About 17% below the x64 rate for jobs that build and run on ARM. |
| Windows 2-vCPU (standard) | $0.010/min | The same job bills two-thirds more on Windows than on Linux, so keep Windows jobs to what genuinely needs Windows. |
| macOS (3- or 4-vCPU) | $0.062/min | Roughly ten times the Linux rate. A macOS matrix leg is the most expensive line in most bills. |
| Larger runners (Linux x64, up to 96 vCPU) | $0.006 to $0.252/min | Always billed, on public and private repositories alike; included minutes never apply to larger runners. |
| Larger runners (Linux arm64, up to 64 vCPU) | $0.005 to $0.098/min | Always billed; 33 to 40% cheaper than x64 larger runners at the same core count. |
| Larger macOS (12-core Intel, 5-core M2 Pro) | $0.077 to $0.102/min | Always billed; the most expensive macOS minutes GitHub offers. |
| Self-hosted runners | $0/min from GitHub | GitHub bills no Actions minutes; a planned $0.002/min charge for private repositories was postponed. You pay for and operate the machines, patching, and scaling yourself. |
GitHub's 2026 pricing changes
Two changes arrived around January 2026, and they point in opposite directions:
- Hosted runners got cheaper. On January 1, 2026, GitHub cut the price of GitHub-hosted runners by up to 39%, depending on the machine type. The rates above are the post-cut prices.
- The self-hosted runner charge was postponed. GitHub announced a $0.002-per-minute platform charge for self-hosted runners in private repositories, due March 1, 2026, then postponed it: "We're postponing the announced billing change for self-hosted GitHub Actions to take time to re-evaluate our approach." Self-hosted runners still bill no GitHub Actions minutes.
- Free allowances stayed the same. The included minutes in the table above still apply, and standard runners on public repositories stay free.
Sources: GitHub's published pricing
The allowances, rates, and billing rules on this page are GitHub's numbers, not ours, checked 2026-09-28. GitHub publishes each of them:
- GitHub · Actions runner pricing reference (per-minute rates by OS and size; minutes rounded up per job) (opens in new tab)
- GitHub · Actions billing concepts (included minutes by plan, what is free, storage accrual) (opens in new tab)
- GitHub · Changelog: 2026 GitHub Actions pricing changes (hosted-runner price cut; self-hosted charge postponed) (opens in new tab)
- StarSling · published runner pricing (opens in new tab)
The billing gotchas
Most surprise GitHub Actions bills are not mysterious. They come from a short list of documented billing rules that quietly multiply billed minutes:
- Every job is rounded up to the next whole minute. A 61-second job bills 2 minutes, and a matrix of twenty short jobs pays that rounding tax twenty times per run.
- Re-runs bill like first runs. A flaky suite that needs two attempts doubles that workflow's spend.
- Larger runners are never free and included minutes never apply to them, even on public repositories.
- Windows and macOS bill at higher rates than Linux, so a job that can run on Ubuntu should.
- Storage accrues hourly across the month. Deleting artifacts stops future accrual but does not remove charges already accrued.
- Superseded runs keep billing until they finish or are cancelled. Without a concurrency group, pushing a new commit leaves the old run burning billed minutes for a result nobody will read.
Have your agent check your GitHub Actions costs
Paste this prompt into your coding agent. It uses the gh CLI you are already signed in to, pulls your GitHub bill, measures the minutes you run on every runner provider, and hands back a table of your workflows ranked by runner minutes with their monthly cost, with drill-downs into the biggest ones.
Show me where my CI minutes and money go, across every runner provider I use, as a table ranked from most to least. Use the authenticated gh CLI. Read only: change nothing until I approve.
1. GitHub's bill. Get the owner from gh repo view --json owner (ask me only outside a repo or for an enterprise; query no other account). Select exactly one prefix: organizations/ORG, enterprises/ENTERPRISE, or users/USERNAME; then run gh api "/<selected-prefix>/settings/billing/usage?year=YYYY&month=M" for the last full month. From usageItems keep the Actions minutes and storage: netAmount (billed after included usage), quantity, unitType, by repositoryName and sku. On 403 or 404, re-run with gh api -i and give me the gh auth refresh -h github.com -s <scope> named in X-Accepted-OAuth-Scopes (fine-grained tokens need Administration (read) for an org or Plan (read) for a user; enterprises need a classic token).
2. Minutes on every runner, for the same month as the bill (created=YYYY-MM-01..YYYY-MM-DD on every runs call), in this order, within about 500 API calls in total. (a) Find the runners first: list the owner's repos (gh repo list OWNER --limit 1000 --json name,pushedAt), keep those with runs that month, and read their workflow files' runs-on labels. Map each label to a provider: GitHub-hosted (ubuntu-*, windows-*, macos-*, and larger runners matched to the bill's SKUs), StarSling (starsling-*), Blacksmith (blacksmith-*), Depot (depot-*), Namespace (namespace-profile-*), WarpBuild (warp-*), RunsOn (contains runs-on= or starts runs-on/), BuildJet (buildjet-*), otherwise self-hosted. (b) Sample next, up to about 250 calls, choosing sample sizes before the first call so the total fits: every workflow that ran gets at least one completed run from that month, then the busiest get up to about 10, each with its jobs (gh api "/repos/OWNER/REPO/actions/runs/RUN_ID/jobs?filter=all&per_page=100" --paginate). Bill each job as completed_at minus started_at, rounded up to the minute, confirm its provider from the job's labels, and record average billed minutes per run. (c) Count last, up to about 150 calls: one call per workflow (gh api "/repos/OWNER/REPO/actions/workflows/WORKFLOW_FILE/runs?created=RANGE&per_page=1" --jq .total_count). GitHub caps this count at 2,500; when it reads 2,500, do not split the range, estimate the month from the sample's runs per day instead. A workflow's monthly minutes are its run count times its average billed minutes per run, per runner. For GitHub-hosted runners the bill already has each repository's exact total: use these minutes only to split that total across the repository's workflows. If the budget runs out, still show every provider found, with what is known, marked as an estimate.
3. Prices. GitHub-hosted: the bill's netAmount is exact. StarSling: read https://starsling.dev/pricing.md, which maps each label to its price. Every other provider: estimate a range from GitHub's list rate for the same machine size, from half that rate to the full rate, using https://docs.github.com/api/article/body?pathname=/en/billing/reference/actions-runner-pricing, and label it an estimate. Self-hosted: minutes only, no price.
4. The answer. Start with a short summary: total CI spend and total runner minutes for the month, then one line per provider found (minutes and dollars, each marked exact or estimate; list only providers that ran jobs), then the share of the total that is exact. Anywhere in the answer, mention only providers that ran jobs, never ones that did not or that appear only in workflow files. Next, one table of the top 5 workflows ranked by runner minutes per month, highest first: repository, workflow, provider and runner, minutes per month, and dollars per month, with each figure marked exact or estimate. Put every other workflow in one row below them, with its count and totals. Exact: GitHub-hosted totals per repository and storage, both from the bill. Estimate: GitHub-hosted totals split across workflows, and all minutes and dollars on every other provider, because GitHub records those jobs but does not bill them (run counts are exact, run lengths are sampled). Add storage (artifacts and caches) from the bill as its own rows. Then the same totals by repository, and a line saying what share of the total is exact. Keep included minutes in mind: GitHub charges only for minutes above the plan's allowance, so one fix can remove more than its own row.
5. Then offer these drill-downs and wait for me to pick: (a) exact prices for my other providers, which you read from each vendor's live pricing page, (b) the jobs inside the workflows with the most minutes, (c) runs repeated on a commit that already passed, and the skip condition that let them through, (d) storage: the largest artifacts and which have no expiry, (e) the smallest set of workflow changes that removes the most spend, with dollars saved each, (f) what each row would cost on StarSling. Wait for my approval before editing anything.Prefer the browser? Open your organizations or your enterprises, choose the account, and open Billing & Licensing; personal accounts use github.com/settings/billing. On the Metered usage page, click Get usage report for the detailed usage report: up to 31 days of spend by repository, workflow file, SKU, and billed amount. Minutes by workflow, job, repository, and runner OS are in your organization's Insights tab under Actions Usage Metrics, at github.com/orgs/<ORG>/actions/metrics/usage, with a CSV download.
The top of the breakdown usually points at one of these causes:
- macOS or Windows SKUs near the top. macOS bills roughly ten times the Linux rate and Windows two-thirds more (rates above). Keep those jobs to builds that need that operating system, and path-filter the workflows so they run when their code changes.
- Larger-runner SKUs. Larger runners bill every minute, and included minutes never apply to them. Right-size each job to the smallest runner that keeps its wall-clock.
- A matrix workflow with a high total. Each leg bills as its own job and rounds up to the next whole minute, so twenty 30-second legs bill 20 minutes. Build only affected projects so a small change runs a small matrix.
- The same workflow billed many times per pull request. Superseded runs keep billing until cancelled, and re-runs bill like first runs. A concurrency group that cancels superseded runs stops paying for commits you have already pushed past.
- One job with a very long run time. GitHub lets a hung job run, and bill, for up to 6 hours; bound job timeouts cap it.
To have an agent run this audit on your repository, run the free /ci-speedup skill to find where your workflows waste billed minutes. For the Linux minutes that remain, StarSling runners are priced 21 to 33% below the GitHub-hosted equivalent at every size, and the switch is a one-line runner label change.
Paste this into your agent
This prompt turns the rules above into an audit of your own repository: where the billed minutes go, how much is rounding and re-runs, and the smallest changes that cut the bill.
Audit this repository's GitHub Actions spend. Inspect .github/workflows/*.yml and .github/workflows/*.yaml, then report where billed minutes go: which workflows and jobs run most often, which runner operating systems and sizes they bill on, and how much of the spend is rounding (jobs that finish in seconds but bill a whole minute), re-runs, superseded runs, or jobs triggered by changes that cannot affect them. Propose the smallest set of changes that cuts billed minutes without changing product behavior: concurrency groups that cancel superseded runs, caches keyed on lockfiles, path filters, affected-only builds, job timeouts, and right-sized runners. Estimate the minutes each change saves, then open one small PR with the highest-impact fixes and before/after reasoning.Cut the minutes before you cut the rate
The cheapest minute is one you never bill. Before changing runners, apply the workflow fixes that remove billed minutes outright; each one keeps GitHub Actions syntax and applies on any runner:
- Cancel superseded runs: a concurrency group keyed on the ref stops billing for commits you have already pushed past.
- Cache dependencies: a cache keyed on the lockfile stops every run re-downloading and rebuilding the same packages.
- Use path filters: docs-only changes should not bill an expensive test suite.
- Build only affected projects: a one-package change should not bill a full monorepo build.
- Bound job timeouts: GitHub otherwise lets a hung job run, and bill, for up to 6 hours.
StarSling's agents open these same fixes as reviewable AI optimization PRs, and every one of them can also be applied by hand; the best-practices catalog carries the YAML.
Pay less per Linux minute, size for size
The other lever is the rate itself. StarSling's Linux runners are drop-in replacements priced 21 to 33% below the GitHub-hosted equivalent at every size. GitHub reference prices are GitHub's larger-runner list prices for Linux x64, checked 2026-09-28; StarSling rates are the published rate card.
Rates checked 2026-09-28 · GitHub's published rates$0.006/min$0.004/min−33%
$0.012/min$0.008/min−33%
$0.022/min$0.016/min−27%
$0.042/min$0.032/min−24%
$0.082/min$0.064/min−22%
$0.162/min$0.128/min−21%
Queue time is never billed on StarSling and there are no seat fees; new accounts get 2,000 free minutes in the first month. The migration is the one-line change below.
The one-line migration
Keep GitHub Actions syntax, keep existing actions, and change the runner label on Ubuntu/Linux jobs to a supported StarSling instance type. StarSling runners are Linux only, so macOS and Windows jobs stay on GitHub-hosted runners.
runs-on: ubuntu-latestruns-on: starsling-ubuntu-24.04- Keep GitHub Actions syntax and existing actions.
- Change runner labels on Ubuntu/Linux jobs only.
- Lower per-minute rate at every size, and queue time is never billed.
- Checks, branch protections, and PR review flow stay in GitHub Actions.
When StarSling helps most
StarSling tends to cut a GitHub Actions bill most when:
- Your workflows already run on
ubuntu-latestorubuntu-24.04, where the migration is a one-lineruns-onchange. - Paid Linux minutes dominate the bill, so a 21 to 33% lower per-minute rate compounds on every run.
- Billed minutes are inflated by cache misses, superseded runs, broad triggers, or runaway jobs, the waste AI optimization PRs turn into reviewable diffs.
- You want the bill to go down while GitHub Actions syntax, checks, and branch protections stay exactly as they are.
A bill dominated by macOS or Windows minutes will not move much on Linux runners: scope those jobs to what genuinely needs them, then move the Ubuntu jobs.
Key caveats
- GitHub's rates and allowances quoted here are GitHub's published figures, checked 2026-09-28; GitHub's billing docs are the authoritative source.
- StarSling runners are Ubuntu/Linux only; macOS and Windows jobs stay on GitHub-hosted runners.
- StarSling keeps GitHub Actions syntax, checks, and branch protections. It is not a replacement CI platform.
- For new accounts, AI-powered optimization PRs are only available to customers on paid plans and are not enabled by default.
FAQ
How much does GitHub Actions cost?
GitHub Actions is free for public repositories on standard GitHub-hosted runners. Private repositories get included minutes by plan (2,000 per month on Free, 3,000 on Pro and Team, 50,000 on Enterprise Cloud), then bill per minute at a rate set by the runner OS and size, starting at $0.006 per minute for standard Linux runners.
Is GitHub Actions free?
For public repositories on standard GitHub-hosted runners, yes. Private repositories are free only up to the plan's included minutes. Larger runners are never free: they are billed on public and private repositories alike, and included minutes do not apply to them.
Does GitHub charge for self-hosted runners in 2026?
No. GitHub announced a $0.002-per-minute charge for self-hosted runners in private repositories starting March 1, 2026, then postponed it to re-evaluate the approach. Self-hosted runners bill no GitHub Actions minutes; you pay for the machines they run on, plus any artifact storage above your plan's allowance.
What do GitHub Actions minutes cost after the free tier?
Standard runners bill $0.006 per minute for Linux, $0.010 for Windows, and $0.062 for macOS. Larger Linux x64 runners run from $0.006 up to $0.252 per minute at 96 vCPU. Every job is rounded up to the next whole minute.
Do included minutes cover larger runners?
No. Included minutes apply only to standard GitHub-hosted runners in private repositories. Larger runners are always billed, even for public repositories.
Why is my GitHub Actions bill higher than expected?
The usual causes are billing rules rather than raw compute: every job rounds up to a whole minute, re-runs bill like first runs, superseded runs keep billing until cancelled, Windows and macOS bill at higher rates than Linux, and artifact storage accrues hourly across the month.
How do I check my GitHub Actions usage?
Paste the usage prompt from this page into your coding agent: it pulls your GitHub bill with the gh CLI, measures the minutes you run on every runner provider, and returns a table of your workflows ranked by runner minutes with their monthly cost, with drill-downs into the biggest ones. In the browser, open Billing & Licensing for your organization or enterprise (personal accounts use github.com/settings/billing), then click Get usage report on the Metered usage page for the detailed usage report, which covers up to 31 days by repository, workflow file, SKU, and billed amount.
How do I reduce GitHub Actions cost?
Work both levers. Cut billed minutes with concurrency groups that cancel superseded runs, dependency caches, path filters, affected-only builds, and job timeouts. Then cut the per-minute rate: for supported Ubuntu jobs, a drop-in runner label change moves the job to cheaper hardware without touching workflow syntax.
How much do StarSling runners cost?
StarSling Linux runners are usage-based from $0.004 per minute (2 vCPU) to $0.128 per minute (64 vCPU), 21 to 33% below the equivalent GitHub-hosted list price at every size. Queue time is never billed, there are no seat fees, and new accounts get 2,000 free minutes in the first month.
Is StarSling a replacement for GitHub Actions?
No. StarSling is a drop-in runner replacement for supported Ubuntu/Linux GitHub Actions jobs, plus agents that open reviewable optimization PRs. Workflow syntax, checks, branch protections, and PR review stay in GitHub Actions.
Pay less for every GitHub Actions minute
Keep GitHub Actions workflows. Move supported Ubuntu jobs to faster runners, then let optimization PRs improve the workflow over time.
Last reviewed October 6, 2026