We cut our Claude bill roughly in half. Here's the boring list.
In August our Anthropic invoice was the second-biggest line on the company card, right after salaries. Nobody had done anything wrong. We had just stopped paying attention while EQO and Uniwork both got busier, and three of us had moved most of our day into Claude Code.
So I spent a week reading usage objects instead of writing features. What follows is what actually moved the number. None of it is clever. Most of it is the kind of thing you know already and haven't done yet, which was exactly our situation.
1. Turn on prompt caching, then check it's working
This was the big one. EQO's agent sends the same long system prompt and the same tool definitions on every turn. Before caching, we were paying full input price for those tokens every single time.
Cache reads on the Claude API cost about a tenth of the normal input price. On Opus 5.5 it's even lower, $0.20 per million tokens against $4.00 uncached. Writing to the cache costs a bit more than a normal request (1.25x for the default 5-minute cache, 2x for the 1-hour one), so you need at least two hits for it to pay off. In an agent loop you get dozens.
The part that bit us: caching is a prefix match. We had the current date and the user's timezone at the top of the system prompt. Every request had a different first line, so the cache never hit. We moved anything that changes to the end, after the cache breakpoint. Our cache_read_input_tokens went from basically zero to most of our input overnight.
If you take one thing from this post: log cache_read_input_tokens for a day. If it's zero, something in your prefix is changing. Find it.
2. Our CLAUDE.md was 900 lines long
Claude Code reads your CLAUDE.md into every session. Ours had grown into a wiki. Old migration notes, a section about a library we stopped using in March, three different paragraphs saying "write tests".
We cut it to about 120 lines. What stayed: how to run things, the few conventions that aren't obvious from the code, and the stuff the model kept getting wrong. Everything else either lives in the repo where it belongs or got deleted.
It's not only a cost thing. The shorter file made the agent better, because the instructions that mattered weren't buried.
3. Stop letting one session run all day
A long Claude Code session drags its entire history along with it. By the afternoon you're paying to re-send the morning.
Habits that helped:
/clearwhen you switch to an unrelated task. A new bug doesn't need the context of the old feature./compactwhen you want to keep going but the history is mostly noise.- Hand big searches to a subagent. It reads forty files, and only its short answer comes back into your main session.
4. Not every call needs the best model
We were sending everything to the top model out of habit. Classifying an incoming email as "invoice / not invoice" does not need Opus.
Now our rough rule is:
| Job | Model |
|---|---|
| Agent planning, hard coding, anything a customer sees directly | Opus 5.5 |
| Everyday coding, summarising, drafting | Sonnet 5.5 ($2 in / $10 out per million) |
| Classification, extraction, routing | Haiku 5.5 ($0.10 / $0.50) |
Haiku 5.5 is cheap enough that we stopped arguing about whether a small task was "worth an LLM call".
One caveat. Before you build a fancy router, try the big model at a lower effort setting. On the newest models, low effort is often good enough, and you keep one cache instead of three (caches don't carry across models).
5. Batch anything nobody is waiting for
Our nightly jobs (re-tagging documents, generating weekly summaries for Uniwork workspaces, running evals) were all going through the normal API. The Message Batches API is 50% off, and the discount stacks with caching. Results come back within hours instead of seconds, which for a 2am job is fine.
6. Measure per finished task, not per request
This one is more of a warning. When we first dropped a step down to a cheaper model, cost per request went down and cost per finished task went up, because the cheaper model needed two or three extra turns to get there. Track what it costs to get the job done. That's the number that shows up on the invoice.
Where we landed
September's bill was a little under half of August's, with more usage. Caching did most of it. The CLAUDE.md cleanup and model routing did most of the rest. Batching was small for us but it took twenty minutes to set up.
None of this needed new tools. It needed someone to look.
If you want a second pair of eyes on your own setup, write to us at naveen@estreetz.com. Happy to look at a usage export and tell you where the money is going.
Written by Naveen at eStreetz. Questions or disagreements: naveen@estreetz.com
eStreetz