GitHub Actions pricing, explained with the real numbers
GitHub Actions is free for public repositories and metered by the minute for private ones, with a different rate for every runner type. This page puts all the rates in one place. It explains how included minutes really get used. And it shows why the macOS line is the one that ends up on the invoice.
The per-minute rates
These are GitHub's published rates for hosted runners on private repositories. They are per minute of wall-clock time. Every job is rounded up to the next minute:
Linux 2-core (x64) $0.006 Linux 2-core (arm64) $0.005 Windows 2-core $0.010 macOS 3-core / 4-core $0.062 macOS 12-core $0.077 macOS 5-core (M2 Pro) $0.102
Two things stand out. A standard macOS minute costs about ten times a Linux minute, and the largest macOS runner costs about seventeen times. Everything else on the invoice is small next to that column.
How included minutes really work
Paid plans include a block of minutes each month, roughly 2,000 on Free, 3,000 on Team and 50,000 on Enterprise. The catch is that the allowance is counted in Linux-equivalent minutes. A macOS minute consumes ten included minutes and a Windows minute consumes two. A single ten-minute iOS build therefore uses a hundred minutes of a 3,000-minute allowance.
In practice, an iOS team on the Team plan uses up its allowance in the first week or two. It pays the metered rate for the rest of the month. The included minutes are not a discount on macOS work so much as a short grace period.
What a real month looks like
Take a small team that runs a 12-minute test suite on every pull request, about 20 pushes a working day. That is roughly 5,000 macOS minutes a month:
5,000 min x $0.062 = $310/mo (standard runner) 5,000 min x $0.102 = $510/mo (largest runner) flat dedicated M4 $119/mo (unlimited)
The flat machine wins from about 1,920 minutes a month upward at the standard rate, and the gap widens with every build after that. Put your own numbers into the calculator.
Costs that are not minutes
- Storage. Artifacts and caches beyond the included allowance bill per gigabyte per month. Large Xcode archives add up if retention is left at the default.
- Re-downloads. Hosted runners start clean, so every job re-fetches dependencies and rebuilds caches. That time is billed at the macOS rate too.
- Queue time is free, but not cheap. Waiting for a macOS runner does not bill minutes, but it delays every merge.
The one decision that matters
For teams that build daily, the question is not which macOS runner size to pick, it is whether to pay per minute at all. Below the break-even, metered billing is fine and simple. Above it, a dedicated Mac at a flat price is cheaper every month and gets faster as caches warm. The macOS minutes guide goes deeper on that math.
Frequently asked questions
How much does GitHub Actions cost per minute?
+
For private repositories: Linux 2-core $0.006, Windows 2-core $0.010, macOS 3- or 4-core $0.062, macOS 12-core $0.077. The 5-core M2 Pro macOS runner is $0.102 per minute. Public repositories are free on standard runners.
How are included minutes counted for macOS?
+
Included minutes are measured in Linux-equivalent minutes. Each macOS minute uses ten included minutes and each Windows minute uses two, so a 3,000-minute allowance covers only about 300 macOS minutes.
Is GitHub Actions free for public repositories?
+
Yes, standard hosted runners are free for public repositories. Larger runners and private repositories are billed per minute.
When does a dedicated Mac become cheaper than GitHub-hosted macOS?
+
At the standard $0.062 rate, a flat $119 per month dedicated runner breaks even near 1,920 macOS minutes a month. Most teams building daily pass that point within the first two weeks.