8.4 Usage Limits, Billing Multipliers & Usage Metrics

Key Takeaways

  • Job execution limits differ by runner type: 6 hours on GitHub-hosted runners, 5 days on self-hosted runners, plus a 24-hour queue limit before a self-hosted job is cancelled.
  • A whole workflow run - including wait timers and approval queues - is cancelled at 35 days, and a run may wait no more than 30 days on an environment approval gate.
  • Included-minute consumption is weighted by operating system: Linux counts 1x, Windows 2x, and macOS 10x, with each job's duration rounded up to the next whole minute.
  • Standard-runner job concurrency is set by plan: 20 on Free, 40 on Pro, 60 on Team, and 500 on Enterprise, with tighter macOS sub-limits and a separate 1,000-job ceiling for larger runners.
  • Actions consumption is audited through the billing CSV export or the billing REST API, and capped in advance with a spending limit that defaults to $0 for private repositories.
Last updated: August 2026

Usage Limits, Billing Multipliers & Usage Metrics

Operating GitHub Actions at enterprise scale requires a clear understanding of system execution boundaries, concurrency limits, and compute consumption economics.

GitHub-hosted runners consume billable minutes that are weighted according to runner operating systems and compute architectures. Mastering usage limits, OS billing multipliers, spending guardrails, and programmatic billing metrics is a foundational requirement for the GitHub Actions Certification (GH-200) exam.


1. System Execution Boundaries & Hard Limits

GitHub Actions enforces predefined architectural limits to ensure platform stability and prevent runaway compute consumption.

Hard Quotas & Limits Cheatsheet

Limit CategoryThreshold / BoundaryOperational Impact & Behavior
Job execution (GitHub-hosted)6 hours (360 minutes)A job on a GitHub-hosted runner is terminated once it exceeds 6 hours. Configurable downwards with timeout-minutes. ubuntu-slim single-CPU runners cap at 15 minutes instead.
Job execution (self-hosted)5 daysA job on a self-hosted runner may run far longer than a hosted one - the 6-hour ceiling does not apply.
Job queue time (self-hosted)24 hoursA job waiting for a self-hosted runner is cancelled automatically after 24 hours if no runner picks it up.
Workflow run time35 daysA run - including all jobs, wait timers, approval queues, and retries - is cancelled after 35 days.
Gate approval time30 daysA run may wait at most 30 days on an environment approval before it is terminated.
Matrix generations256 jobs / runA strategy.matrix cannot generate more than 256 jobs per workflow run, on hosted or self-hosted runners.
Workflow file size500 KB per fileA workflow file larger than 500 KB will not start runs. Move shared logic into a reusable workflow or composite action.
Workflow re-runs50 re-runsA run can be re-run at most 50 times, counting both full re-runs and partial job re-runs.
API rate limits1,000 requests/hr per repository<br>15,000 requests/hr (Enterprise Cloud)Calls authenticated with GITHUB_TOKEN share a per-repository hourly budget.
Artifact & log retentionDefault 90 daysConfigurable 1-90 days in public repositories and 1-400 days in private and internal repositories.

2. Concurrency Limits by Account Tier

GitHub-hosted runner execution is subject to concurrent job capacity limits determined by the account plan:

Account Plan Concurrency Limits:

 ┌─────────────────────────────────────────────────────────────┐
 │ Free:        20 total concurrent jobs   (max  5 macOS)      │
 ├─────────────────────────────────────────────────────────────┤
 │ Pro:         40 total concurrent jobs   (max  5 macOS)      │
 ├─────────────────────────────────────────────────────────────┤
 │ Team:        60 total concurrent jobs   (max  5 macOS)      │
 ├─────────────────────────────────────────────────────────────┤
 │ Enterprise: 500 total concurrent jobs   (max 50 macOS)      │
 ├─────────────────────────────────────────────────────────────┤
 │ Larger runners (Team/Enterprise): 1,000 concurrent jobs     │
 │                                    (max 100 GPU jobs)       │
 └─────────────────────────────────────────────────────────────┘

[!NOTE] macOS is the tightest constraint. The macOS sub-limit sits inside the overall figure: a Team account can run 60 concurrent jobs but no more than 5 of them on macOS. A large iOS build matrix therefore serializes long before the account-wide ceiling is reached. GitHub Support can raise job concurrency limits on request.

Queuing Behavior

When an organization triggers more jobs than its plan concurrency threshold allows, excess jobs are placed into a queued state. As active jobs finish and release runner slots, queued jobs transition to in_progress according to priority and queue time.

[!NOTE] Public vs. Private Repositories: GitHub Actions is completely free for standard GitHub-hosted runners in public repositories. Monthly included minutes and per-minute billing apply strictly to private and internal repositories.


3. OS Billing Multipliers & Calculation Mechanics

Execution time on GitHub-hosted runners is billed in whole minutes. If a job executes for 1 minute and 12 seconds, GitHub rounds up the execution duration to 2 whole minutes before applying the operating system multiplier.

Operating System Multiplier Table

Runner operating systemHardwareMinute multiplier (included minutes)Published per-minute rate (USD)
Linux (Ubuntu)Standard 2-core1x$0.006 / min
Windows ServerStandard 2-core2x$0.010 / min
macOSStandard 3-core or 4-core10x$0.062 / min
macOS larger runner12-coren/a - billed per minute$0.077 / min
macOS larger runner5-core (M2 Pro)n/a - billed per minute$0.102 / min
Self-hosted runnersCustomer-managed compute0x (free)$0.000 / min

[!IMPORTANT] Multipliers and dollar rates are two different systems - do not conflate them. The 1x / 2x / 10x multipliers govern how fast a job burns the included minutes bundled with your plan. Once those are exhausted, GitHub bills the published per-minute rate for that machine size, which is not simply the Linux rate times the multiplier. Larger runners are always billed per minute and never consume included minutes.

Worked Billing Calculation Examples

Example 1: Multi-Platform Matrix Run

Suppose a workflow runs a multi-platform build matrix across Linux, Windows, and macOS standard runners in a private repository. Each job runs for exactly 15 minutes:

  • Linux Job: $15 \text{ min} \times 1 = 15 \text{ billable minutes}$
  • Windows Job: $15 \text{ min} \times 2 = 30 \text{ billable minutes}$
  • macOS Job: $15 \text{ min} \times 10 = 150 \text{ billable minutes}$
  • Total Billable Minutes Deducted: $15 + 30 + 150 = 195 \text{ minutes}$

Example 2: Partial Minute Rounding Impact

Suppose an automated linter job runs on Windows for 45 seconds:

  • Execution time of 45 seconds rounds up to 1 minute.
  • Windows multiplier of 2x is applied: $1 \text{ min} \times 2 = 2 \text{ billable minutes}$.

4. Spending Limits & Cost Controls

To prevent unexpected cloud billing overages, GitHub accounts default to a Spending Limit of $0, which stops workflow execution in private repositories once included monthly minutes are exhausted.

Managing Spending Limits

  • Administrators can configure a custom spending limit (e.g., $500/month) under Billing & Plans → Spending limits.
  • Email Threshold Alerts: GitHub notifies organization owners as consumption approaches and reaches the configured spending limit, so finance owners are warned before jobs stop rather than after.
  • When the spending limit is reached ($100%), all Actions jobs in private repositories are paused or rejected until the limit is raised or the next billing cycle begins.

5. Monitoring Usage & Reporting Tools

Enterprise platform teams have two primary methods for monitoring and analyzing Actions consumption:

1. Granular Usage Report (CSV Export)

Administrators can download a detailed CSV report from Settings → Billing → Get usage report. The CSV includes line-by-line records with fields:

  • Date: Timestamp of execution
  • Product: Actions
  • SKU: Compute - Ubuntu, Compute - Windows, or Compute - macOS
  • Quantity: Number of billable minutes
  • Unit Type: Minutes
  • Price Per Unit: Unit rate applied
  • Total: Total cost incurred
  • Owner & Repository Slug: Specific repository responsible for the cost
  • Workflow Name: Name of the triggering workflow file

2. GitHub REST API Billing Endpoints

Enterprises can programmatically query Actions consumption for real-time FinOps dashboards using the REST API:

GET /orgs/{org}/settings/billing/actions
Host: api.github.com
Authorization: Bearer <ADMIN_TOKEN>
Accept: application/vnd.github+json

Example JSON Response:

{
  "total_minutes_used": 42500,
  "total_paid_minutes_used": 12500,
  "included_minutes": 30000,
  "minutes_used_breakdown": {
    "UBUNTU": 22500,
    "WINDOWS": 10000,
    "MACOS": 10000
  }
}

Enterprise administrators can also query enterprise-level billing via GET /enterprises/{enterprise}/settings/billing/actions to monitor usage across all organizational units.

Loading diagram...
Operating System Multiplier Calculation for 20-Minute Parallel Jobs
Test Your Knowledge

A CI workflow in a private repository executes a matrix build with three jobs running in parallel on standard GitHub-hosted runners: one on Linux, one on Windows, and one on macOS. Each job executes for exactly 20 minutes after included plan minutes have been exhausted. How many total billable minutes are deducted from the organization's account?

A
B
C
D
Test Your Knowledge

A test suite running in a GitHub Actions job encounters an infinite loop and stops emitting output. The workflow YAML does not specify a timeout-minutes value. What is the maximum duration the job will execute on a GitHub-hosted runner before GitHub automatically terminates it?

A
B
C
D
Test Your Knowledge

An enterprise FinOps team is building an automated dashboard to monitor monthly Actions minute consumption and OS breakdowns across all private repositories in an organization. Which GitHub REST API endpoint provides these aggregated metrics?

A
B
C
D