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

PlanIncluded Minutes per Month (Private Repositories)
GitHub Free2,000
GitHub Pro3,000
GitHub Team3,000
GitHub Enterprise Cloud50,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 TypeMultiplierMeaning
Linux1One job minute uses one included minute
Windows2One job minute uses two included minutes
macOS10One 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 minutes

Larger 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: 7

Where Minutes Go

Monthly bundle: 2,000 minutes
+------------------------------------------------------+
| tests (Linux)      ########## 900                    |
| builds (Windows)   ####### 600                       |
| mac tests          ###### 500                        |
+------------------------------------------------------+
Total used: 2,000 --> extra jobs start costing money

Technical Limits

LimitValue
Job run time on GitHub-hosted runners6 hours
Workflow run time35 days
Matrix jobs from one matrix256
Concurrent jobs, GitHub Free20

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: true

Filter 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: 15

Choose 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.