Per-SKU cost, not a raw minutes count
CostMon reads GitHub's billing usage API daily, broken down by product and SKU. Because SKUs encode runner OS and size, what those minutes cost is visible instead of a bare tally of minutes used.
GitHub cost monitoring
CostMon reads GitHub's own billing usage API daily, broken down by product and runner SKU, so a CI matrix burning minutes on the pricier macOS and Windows runners, or a Copilot AI-credit spike, shows up in days instead of reconciling into next month's invoice.
A GitHub-hosted runner minute is not one price: each runner OS and size carries its own per-minute list price, and macOS runs about 10x the Linux rate while Windows runs about 1.7x (as of 2026-07-29). Included minutes are consumed in proportion to that list price, so a CI matrix that looks fine in wall-clock minutes can eat a plan's entire allowance far sooner than the raw number suggests, and nobody notices until it tips into metered overage. Larger runners bill per-minute regardless of any included-minutes allowance, and since GitHub Copilot moved to seats plus metered AI-credit consumption, a team leaning harder on agentic Copilot features can push spend well past the flat per-seat price it budgeted for. None of this is visible in a wall-clock minutes count, only in the per-SKU usage GitHub's billing API reports.
Cost anatomy
Why CostMon
CostMon reads GitHub's billing usage API daily, broken down by product and SKU. Because SKUs encode runner OS and size, what those minutes cost is visible instead of a bare tally of minutes used.
A daily, per-SKU view surfaces a CI matrix leaning on the pricier macOS and Windows runners while it's still a small number, not after the plan's allowance is already gone.
GitHub Actions and Copilot spend lands in the same normalized daily table as AWS, GCP, and every other connected provider, so finance sees one honest total instead of a separate GitHub billing page.
CostMon connects with a token scoped to read-only billing/administration access only. It never touches your repositories, code, or Actions workflows themselves.
Getting started
Add a fine-grained personal access token with Administration: read for an organization, or a classic token with admin:enterprise for enterprise-wide billing. CostMon never touches your repositories, code, or workflow contents.
GitHub's billing usage API is queried month by month and aggregated by date, product, and SKU, then reconciled into the same normalized model as every other provider you connect.
Open a daily, per-SKU view of Actions and Copilot spend and catch a macOS-heavy matrix or a Copilot credit spike weeks before it lands on a bill.
FAQ
Through a fine-grained personal access token scoped to Administration: read for an organization, or a classic token with admin:enterprise for enterprise-wide billing. CostMon only reads billing usage, never your code, issues, or workflow contents.
Yes. GitHub's billing API reports usage per date, product, and SKU, and SKUs encode runner OS and size, so you can see Linux, Windows, and macOS minutes broken out rather than one blended Actions total.
Yes. Copilot usage is one of the products GitHub's billing usage API reports, so seat and AI-credit consumption sync in alongside Actions spend in the same daily, normalized view.
GitHub's billing API returns usage at the organization or enterprise level; CostMon stores it at the date, product, and SKU grain it's aggregated to, not per repository or per workflow.
A flat monthly rate per plan. CostMon never takes a percentage of your GitHub spend or the savings it helps you find. Free includes 2 connectors; Professional and Enterprise include unlimited connectors.
Connectors
AWS, GCP, and Azure for cloud; Anthropic, OpenAI, Amazon Bedrock, Vertex AI / Gemini, and Helicone for AI and LLM spend; Snowflake and Databricks for the data cloud; Datadog, GitHub, and Vercel for the rest of the stack. Add CSV import for any tool without a native connector. That's 14 connectors, all normalized into the same unified view.
Connect your first provider and CostMon normalizes it alongside everything else you run. Your team gets one number everyone can check.