Run and operate
Costs, limits, and troubleshooting
What a run spends and on whose account, the four caps that bound one run, where a run reports its own cost, what each plan reaches, and the handful of things that go wrong first.

Who pays for what
A run spends two things, and Repo Fleet is on neither meter.
- GitHub Actions minutes come off your own GitHub plan, exactly as your tests do. A public repository runs free; a private one draws the plan's included minutes, then pays per minute.
- Model tokens bill the key you added as a secret, priced per million by the model the run uses.
- Repo Fleet runs no model, meters no task, and keeps no copy of your code.
What one run reports it spent
- The result the action writes at the end of a run names its cost in dollars, its turns, and its duration.
execution_fileis the step output holding that execution log, for a later step to read, upload, or comment.display_report: trueon the step writes the report, cost included, to the job summary, so the run's own page carries the number.- The Console totals what every run has spent on the key; GitHub's billing page does the same for minutes.
The four caps that bound one run
--max-budget-usdinclaude_argsstops Claude Code once the run's API spend reaches that number. It is the only cap counted in the thing Anthropic bills.--max-turnscaps how many times Claude calls the model, so a run going in circles ends before it reaches the budget.timeout-minutesis GitHub's hard stop on the job, and it caps the minutes the job can bill. Left out, GitHub allows a job six hours.- A
concurrencygroup keeps runs to one at a time, so the worst hour costs one run rather than a queue of them. - A cap stops a run, never a spend already made. A run that fails still spent what it spent.
- Claude Code in GitHub Actions sets all four in one file, running on a schedule is where they matter most, and timeouts and concurrency covers the two GitHub keys on their own.
Keeping a run cheap
- Narrow the trigger. A label, or a path filter, runs the agent on what you meant rather than on every push.
- Read the first few runs before you widen anything.
- Cap it outside the file too. A spend limit on the Console workspace and a budget on GitHub Actions catch what the file cannot.
What each plan reaches
- Free takes every public repository on every account you link, and one private repository in total.
- Pro takes every repository, public and private.
- A repository past the limit says so where you meet it. Pricing has the rest.
When something goes wrong
| What you see | Usually |
|---|---|
| The workflow never runs | Nothing triggers it, or a schedule was edited on a branch rather than the default one. |
| The Claude step fails at once | ANTHROPIC_API_KEY is missing, empty, or spelt differently in the file. |
| The push at the end is refused | The token has no contents: write, or the branch is protected. |
| No pull request appears | The token has no pull-requests: write. |
| A run queues and stays there | Another run holds the same concurrency group. |
| The run stops mid-task | It reached --max-turns, --max-budget-usd, or the job's timeout-minutes. |
| Runs lists nothing | Nothing has run in the last seven days, or the app cannot see that repository. |
Where to look
- The log on github.com is the whole truth: every command, its output, and the step that stopped.
- The editor's findings catch what GitHub would refuse, before a run spends anything.
- Still stuck? Contact us with the repository and the run.