GitHub Actions vs Self-Hosted — The Real Cost Comparison (12-Month Data)
On per-minute price, self-hosted wins by 80%. On DIY total cost, GitHub Actions wins by 35%. Move the indirect costs from people to a platform and the math flips one more time. Twelve months of measured numbers.
We ran GitHub Actions and self-hosted runners side by side on the same workload for 12 months, because we wanted the answer in numbers rather than opinions. The math flipped twice. On per-minute price alone, self-hosted is 80% cheaper. Add the indirect costs and GitHub Actions comes out 35% cheaper. Then we moved the indirect costs off people and onto a platform, and self-hosted won again. This post walks through those three calculations in order.
The 12-month data (DIY self-hosted)
First, the raw numbers. "Self-hosted" here means runners we installed on EC2 and operated by hand.
| GitHub Actions | Self-hosted
─────────────────────────────────┼────────────────┼──────────────
Monthly build minutes | 78,000 | 78,000
| (same workload split)
─────────────────────────────────┼────────────────┼──────────────
Direct cost |
- GitHub Actions billing | $4,200 / mo | $0
- EC2 (4 × c5.2xlarge) | $0 | $560 / mo
- Network · storage | $0 | $90 / mo
- Monitoring (Datadog) | $0 | $200 / mo
─────────────────────────────────┼────────────────┼──────────────
Indirect cost |
- Ops headcount (avg) | 0.05 FTE | 0.4 FTE
- Labor equivalent | $400 / mo | $3,200 / mo
- Security patches / OS update | $0 | $400 / mo
- Build queue wait (eng time) | $1,800 / mo | $5,200 / mo *
─────────────────────────────────┼────────────────┼──────────────
Monthly total | $6,400 / mo | $9,650 / mo
Annual total | $76,800 | $115,800The $5,200 queue-wait figure exists because four fixed workers form a queue at peak hours. GitHub Actions scales elastically, so its queue is close to zero.
Which is cheaper on per-minute price?
Per minute, self-hosted costs $0.011 against $0.054 for GitHub Actions, an 80% gap in favor of self-hosted.
GitHub Actions: $4,200 / 78,000 min = $0.054 / min
Self-hosted: $850 / 78,000 min = $0.011 / minMost self-hosted decisions start from this number. Most of them go wrong at exactly this point.
Why does total cost flip the result?
Because of indirect costs. Annually, GitHub Actions came to $76,800 against $115,800 for DIY self-hosted, a 35% win for GitHub Actions. What decided it wasn't servers but people: the 0.4 FTE tending runners, OS patching, and engineers waiting on the queue ($5,200 a month of their time).
This is where most cost comparisons stop, with "so just use SaaS." But look at the table again. Self-hosted doesn't lose a single infrastructure line. Direct cost is $850 a month, a fifth of the GitHub Actions bill. Every losing line item is human work.
Self-hosting isn't expensive. DIY is.
The $8,800 a month of indirect cost is not intrinsic to self-hosting. It's the cost of provisioning, scaling, upgrading, and monitoring runners by hand.
So early this year we moved our dev CI onto our own product, CollabOps CI/CD. Same workload, same four nodes. Monthly average after three months:
| CollabOps CI/CD (self-hosted)
─────────────────────────────────┼──────────────────────────────
Infrastructure (same 4 nodes) | $650 / mo
Monitoring | $0 (built into the platform; Datadog cancelled)
Ops headcount | 0.1 FTE ≈ $800 / mo
Security patches / OS updates | $100 / mo (node OS only)
Build queue wait (eng time) | $1,900 / mo
─────────────────────────────────┼──────────────────────────────
Monthly total | $3,450 / mo
Annual total | $41,400 (46% below GitHub Actions)What changed, line by line:
- Ops headcount went from 0.4 to 0.1 FTE. Runner provisioning, scaling, and upgrades moved from human work to product work. The remaining 0.1 is care for the nodes themselves.
- Queue wait dropped from $5,200 to $1,900. Same hardware, but the job scheduler manages priority and concurrency, so peak queues shrank. Not gone, but down to roughly GitHub Actions territory ($1,800).
- Monitoring: pipeline metrics ship with the platform, so we cancelled Datadog.
Two things need adding, honestly. First, license cost. Ours is $0 because it's our product; a customer pays it. The gap to GitHub Actions is $35,400 a year, so as long as the license fits inside that, the math holds. Second, we build this product, so our 0.1 FTE estimate may be friendlier than yours would be. Double it and the annual total is $51,000, still 33% below GitHub Actions.
So when should you self-host?
If you're going to run DIY runners, only when two or more of these four apply:
- Build minutes above 200,000 a month (the bill dwarfs the indirect costs)
- Compliance mandates self-hosted (no alternative)
- Ops headcount already exists (labor is near-marginal)
- Builds longer than 10 minutes each (short builds are fine on SaaS runners)
With a managed self-hosted platform, the threshold moves much further forward, because most of the indirect column transfers to the platform. On our data, 78,000 minutes a month was already a 46% saving.
What if you're air-gapped or compliance-bound?
Then SaaS CI was never on the menu, and the real comparison is not "SaaS vs self-hosted" but "DIY vs managed." The third table above is that comparison.
→ Building CI/CD inside an air-gapped datacenter
How we run it today
- Dev PR and feature builds: CollabOps CI/CD (the four nodes above)
- Release artifacts: CollabOps CI/CD (signing + audit log)
- Customer deploy artifacts: CollabOps CI/CD inside the customer's environment (FIPS)
- GitHub Actions: a handful of public repositories, nothing else
The math starts at per-minute price, flips on total cost, and flips back when you change who carries the indirect costs. If you're evaluating self-hosted right now, don't stop at the second calculation. The expensive part was never the servers. It's the human hours spent tending runners, and that's a cost a platform can carry for you.
Related posts
When a Product Manager Ships Code, Who Owns the Outage?
In organizations where product managers write code with AI and several agents work at once, who checks what before a change reaches production? A role design for verification, approval, and recovery that is independent of the author, grounded in NIST SSDF, SLSA provenance, and the Google SRE postmortem culture.
John Baek
An Eclipse Plugin for the Agent Era — Task Context Was Already the Problem 20 Years Ago
The problem Mylyn set out to solve in the mid-2000s is the agent context problem. What changed is that the thing reading that context is no longer only a person.
Yeongsang Kim
A VS Code Extension for the Agent Era — What Developers Look At Now
Once writing code got cheap, a developer's time moved to judging and approving. Here is why those jobs cannot live outside the editor, and the choices behind the CollabOps VS Code extension.
Seungbaek Lee