GitHub Actions Usage Limits and Billing
GitHub Actions runs on real computers, and those computers cost money. Public repositories run on standard GitHub-hosted runners at no charge. Private repositories receive a monthly allowance of free minutes, and extra usage costs money. Knowing the rules keeps surprises off your invoice.
Billing in Simple Words
Think of a mobile phone plan with a monthly bundle of minutes. Calls inside the bundle cost nothing. Calls beyond it carry a per-minute charge, and international calls cost more. Actions follows the same pattern. Linux minutes are the cheapest, and macOS minutes use up the bundle much faster.
Free Minutes by Plan
| Plan | Included Minutes per Month (Private Repositories) |
|---|---|
| GitHub Free | 2,000 |
| GitHub Pro | 3,000 |
| GitHub Team | 3,000 |
| GitHub Enterprise Cloud | 50,000 |
Plans and prices change. Confirm current numbers on the GitHub billing documentation page before you plan a budget.
Minute Multipliers
Each operating system consumes the monthly bundle at a different rate.
| Runner Type | Multiplier | Meaning |
|---|---|---|
| Linux | 1 | One job minute uses one included minute |
| Windows | 2 | One job minute uses two included minutes |
| macOS | 10 | One job minute uses ten included minutes |
10-minute job on Linux = 10 included minutes
10-minute job on Windows = 20 included minutes
10-minute job on macOS = 100 included minutesLarger runners carry their own per-minute prices and never use the free bundle.
Storage Counts Too
Artifacts and GitHub Packages consume storage space. Each plan includes a storage allowance, and overage carries a fee. Artifacts expire after 90 days by default. Shorter retention saves space.
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
retention-days: 7Where Minutes Go
Monthly bundle: 2,000 minutes
+------------------------------------------------------+
| tests (Linux) ########## 900 |
| builds (Windows) ####### 600 |
| mac tests ###### 500 |
+------------------------------------------------------+
Total used: 2,000 --> extra jobs start costing moneyTechnical Limits
| Limit | Value |
|---|---|
| Job run time on GitHub-hosted runners | 6 hours |
| Workflow run time | 35 days |
| Matrix jobs from one matrix | 256 |
| Concurrent jobs, GitHub Free | 20 |
A job that exceeds its time limit is cancelled. Jobs beyond the concurrency limit wait in a queue.
View Your Usage
Open your account or organization settings and choose Billing and plans. The usage report breaks down minutes by repository, workflow, and operating system. Set a spending limit to cap overage charges. A limit of zero blocks paid usage after the free bundle ends.
Ways to Save Minutes
Cache Dependencies
Reusing downloaded packages cuts install time on every run.
Cancel Outdated Runs
Concurrency groups stop older runs when a newer push arrives.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: trueFilter by Path
Run tests only when relevant files change.
on:
push:
paths:
- "src/**"
- "package.json"Set Timeouts
A stuck job burns minutes until the limit. A timeout stops the waste early.
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15Choose Linux When Possible
Use macOS and Windows runners only for tests that need them. A matrix can run the full set on a schedule and a Linux-only set on every push.
Self-Hosted Runners
Runners on your own machines do not consume GitHub-hosted minutes. You pay for the hardware, power, and maintenance instead. GitHub's pricing for self-hosted usage may change, so read the current billing page.
Monthly Checklist
- Review the usage report for the biggest consumers.
- Delete old artifacts and packages.
- Confirm that spending limits match your budget.
- Check that every workflow sets a timeout.
