Guide · Agency operations

# Give every campaign a spend ceiling

Agents fan work out across tools you pay for. Put one ceiling on the campaign before anything runs, forecast it, and make the workflow stop itself before a paid call crosses the line.

By Mitchell KellerNov. 10, 20266 min read

Classical statues on a terrace.Classical statues on a terrace.

[Download the blank worksheet](https://www.joinlegion.io/downloads/give-every-campaign-a-ceiling-worksheet.md)[View Markdown](give-every-campaign-a-ceiling.md)

## Key answer

- Give every campaign an ID and a ceiling before an agent touches it.
- Every stage, tool call and subagent draws from that one total. Nothing starts with a fresh allowance.
- Forecast with the unit prices you actually pay, and hold money back for validation.
- A spend alert or a cap written in a prompt does not stop anything. The check has to run before the paid call.

On this page

## The bill shows up after the work

A campaign used to be a list, a sequence and a person. Now it is a list pull, enrichment, validation, model calls for copy, a spam check and a few subagents, and every one of those bills on its own. Nobody sees the total until the invoices land.

I build the budget in before I give an agent room to run. I do not want to hand off a goal and wake up to a bill I never approved. The fix is boring on purpose: one number per campaign, checked by the workflow, before money moves.

How the ceiling works

One campaign ID carries one running total through every stage. Before each paid call the workflow adds the estimated cost to what has already been spent. If the new total would pass the ceiling, the call does not happen and the agent stops and reports what is left. If it fits, the call runs and the actual cost is written to the same ledger.

- Campaign IDone name for the whole job
- Ledgerone running total
- Estimatebefore each paid call
- Allow or stopagainst the ceiling
- Recordthe actual cost

## Six steps on one page

- Pick a ceiling. Write the campaign ID and the number on one line. My own default is $60 for a campaign before anyone approves more, with smaller numbers for smaller jobs. That is my operating example, not a rule. Pick a number that fits your work.
- List the paid stages. For each one write the tool, the unit price you actually pay, and how many units you expect. Use your real credits, plan tiers and deals. Never guess a price.
- Hold money back for validation. Contacts you cannot afford to verify are worth very little. Reserve that money before discovery starts spending.
- Project the total before launch. If the projection is over the ceiling, look for a cheaper source first (free directories, a smaller first batch), then decide whether the full version is worth asking for.
- Enforce the stop in the workflow. The check runs before each paid call and refuses a call that would cross the line. When the money runs out the agent says what is left and what it would do next.
- Record actual spend. Every cost goes on the same ledger with the stage and the tool. If the campaign needs more, the request comes with the reason and what the extra money buys.

## A worked example

A made-up campaign for a made-up client. Every price below is invented to show the arithmetic. Use your own.

Forecast for campaign ACME-OPS-01 (hypothetical numbers)

| Stage | Tool | Unit cost | Count | Estimate

| Company list | List source | $0.005 | 2,000 | $10.00

| Contact lookup | Enrichment tool | $0.03 | 600 | $18.00

| Email validation (held back) | Validator | $0.008 | 900 | $7.20

| Copy drafts | Model calls | $0.01 | 600 | $6.00

| Spam and reading checks | Checker | $0.10 | 20 | $2.00

| Projected total |  |  |  | $43.20

| Ceiling |  |  |  | $60.00

| Headroom |  |  |  | $16.80

The projection fits, so the run is approved at $60. If the contact lookup came back at three times the expected count, the check would stop the agent at the ceiling instead of letting it spend the validation money on more lookups.

## One campaign, one running total

The most common leak is a fresh allowance. A subagent starts, sees no spending of its own, and behaves as if it has the whole budget. Carry the campaign ID into every stage, and have every stage read and write the same total.

Check spending while the work runs, not after. A report at the end tells you what went wrong. A check before each paid step stops it.

## Alerts are not caps

A billing alert tells you after the money is gone. A cap written in the prompt is a request the model can forget. If you need spending to stop, you need code that refuses the call.

Keep this separate from who can use which key. Access control decides who may call a tool at all. The ceiling decides how much a campaign may spend with it. You need both, and the [access guide](/resources/access-by-person-project-and-client) covers the first half.

### When this is the wrong tool

A one-off job in a single tool that already has a hard billing cap does not need a ledger. Exploratory research where you cannot count anything yet needs a small discovery budget first. Forecast the real run once you know the counts.

## Get the blank worksheet

Campaign budget worksheet (blank, Markdown)

The forecast table and stop rule from this guide, empty, ready to fill in for your next campaign: campaign ID, stage, unit cost, count, estimate, validation reserve, ceiling and the person who owns the stop.

[Download the .md](https://www.joinlegion.io/downloads/give-every-campaign-a-ceiling-worksheet.md)

## Source notes

This guide describes how I run budgets across my own agency work. The $60 figure is my own default, not a recommendation for your business. The worked example and every price in it are invented. The Legion course covers the setup we run in more depth for members; nothing here depends on it.

## Run your agency on agents you can check

Get one useful GTM email a week. Then join the community on Skool.

[Get the newsletter](https://waitlist.joinlegion.io/g/legion-waitlist)

## Start here: the agency path

- [Give every campaign a spend ceiling](/resources/give-every-campaign-a-ceiling): budget control. (this guide)
- [Keys by person, project and client](/resources/access-by-person-project-and-client): access control.
- [One client code, one search boundary](/resources/one-client-code-one-search-boundary): client knowledge.
- [Code Mode MCP: one tool surface for many tools](/resources/code-mode-mcp-one-tool-surface): code mode mcp.

[Back to resources](/resources)

## Bring the GTM job you need done. Build the run you can check.

Get one useful GTM email a week. Then join the community on Skool.

Get one useful GTM email a week. Then join the community on Skool.

[Get the newsletter](https://waitlist.joinlegion.io/g/legion-waitlist) [Join the community on Skool](https://www.skool.com/legion/about)
