How Much Are Your Failed GitHub Actions Runs Actually Costing You?
You merged a PR. CI kicked off. Three of the five jobs passed. Two failed because of a flaky integration test. You re-ran the whole workflow. This time it passed.
Everyone moved on. Nobody asked: how much did that failure just cost?
The Hidden Tax on Every Failed Run
GitHub Actions bills by the minute, rounded up, per job. When a workflow fails and you re-run it, you pay for every minute of every job - including the ones that already passed the first time.
Here is what that looks like with real numbers.
Example: A Typical CI Pipeline
Say your pipeline has 5 jobs:
| Job | Runner | Duration | Cost/min |
|---|---|---|---|
| Lint | ubuntu-latest | 1 min | $0.008 |
| Unit Tests | ubuntu-latest | 4 min | $0.008 |
| Integration Tests | ubuntu-latest | 6 min | $0.008 |
| Build | ubuntu-latest | 3 min | $0.008 |
| E2E Tests | ubuntu-latest (4x parallel) | 8 min each | $0.008 |
Total compute per successful run: 1 + 4 + 6 + 3 + (8 × 4) = 46 minutes = $0.37
That does not sound like much. But multiply it out.
The Failure Multiplier
If your pipeline has a 75% success rate (which is more common than you think - the industry average hovers around 70-80%), then for every 4 runs, one fails and gets re-run.
Over a month with 500 pipeline runs:
- Successful runs: 375 × 46 min = 17,250 minutes
- Failed runs (wasted): 125 × 46 min = 5,750 minutes
- Re-runs of failed: 125 × 46 min = 5,750 minutes
Total compute: 28,750 minutes = $230/month
Of that, $46/month is pure waste - compute that ran, failed, and produced nothing. And that is on the cheapest Linux runners.
It Gets Worse with Larger Runners
Many teams use ubuntu-latest-4x or ubuntu-latest-8x for faster builds:
| Runner | Cost/min | Waste at 125 failures/mo |
|---|---|---|
| ubuntu-latest | $0.008 | $46 |
| ubuntu-latest-4x | $0.032 | $184 |
| ubuntu-latest-8x | $0.064 | $368 |
| macos-latest | $0.08 | $460 |
A team running macOS builds with a 75% success rate wastes nearly $500/month on failed runs alone.
The Cost You Are Not Counting: Developer Time
Here is the part most CI cost analyses miss: compute is the cheap part.
When a pipeline fails, a developer has to:
- Notice the failure (or wait for someone to tell them)
- Open the logs, find the failing job, read the output
- Figure out if it is their code, a flaky test, or an infrastructure issue
- Fix it or re-run
- Wait for the full pipeline to run again
- Context-switch back to what they were doing before
That cycle takes 20-45 minutes per failure. At a fully-loaded engineering cost of $75-150/hour, each failure costs $25-75 in developer time - even if the compute cost was $0.37.
Let us redo the math from the example above:
- 125 failures per month × 30 minutes average developer time = 62.5 hours/month
- At $100/hour: $6,250/month in developer time
- The compute waste was $46/month
The compute cost is a rounding error. The developer time cost is 135x larger.
And that is just the direct cost. Failed CI also creates:
- Delayed deploys - features sit in a queue behind broken builds
- Compounding re-work - the longer a failure goes unfixed, the more commits pile on top and the harder the fix becomes
- Team friction - "CI is broken again" becomes a cultural tax that slows everyone down
This is why RunWatch tracks risk scores and failure patterns alongside compute costs. Knowing which branches, jobs, and contributors cause the most re-work is how you reclaim those 62 hours per month - not by shaving pennies off runner costs.
Why Most Teams Don't Notice
Three reasons:
- GitHub bills at the account level, not per-pipeline. You see a total, not a breakdown.
- Free tier minutes mask the problem. GitHub gives 2,000 free minutes/month on public repos and varying amounts on paid plans. You don't feel the cost until you exceed them.
- Nobody owns CI efficiency. Developers own features. DevOps owns infrastructure. CI costs fall into a gap.
What You Can Do About It
Step 1: Measure the Actual Waste
You cannot optimize what you cannot measure. Start by answering these questions for your top 5 pipelines:
- What is the success rate over the last 30 days?
- What is the average compute time per run (not wall-clock - total across all jobs)?
- How many re-runs happen per week?
- Which jobs fail most often?
Step 2: Fix the Biggest Offenders
Once you have the data, the fixes are usually straightforward:
- Flaky tests: Quarantine them. Run them in a separate non-blocking job.
- Long setup steps: Cache dependencies aggressively. Use
actions/cachefor node_modules, pip packages, Docker layers. - Unnecessary re-runs: Use
concurrencygroups to cancel redundant runs when new commits are pushed. - Broad triggers: Don't run E2E tests on documentation changes. Use path filters.
Step 3: Track It Over Time
A one-time audit helps, but CI efficiency drifts. New tests get added. Build times creep up. What was a 3-minute pipeline becomes 12 minutes over six months and nobody notices because it happened gradually.
You need continuous visibility - a dashboard that shows compute cost, waste, and trends per pipeline, per branch, per week.
Automating This
We built RunWatch to solve exactly this problem. It is a lightweight GitHub Action that you add as the last step in your workflow. It captures compute time, job durations, and success/failure status, then sends it to a dashboard where you can see:
- Parallel-aware compute cost (what you are actually billed for)
- Wasted minutes from failures and cancellations
- Efficiency trends over time
- Which branches and pipelines are the most expensive
The free tier covers 100 runs/month - enough to monitor your most critical pipeline and see where the waste is hiding.
Try it free - no credit card required.