Stop eating your clients' AI costs.
Tallyhook reads the session logs Claude Code and Codex already write, tags every session with the client it was for, and gives you an invoice line. One command per laptop. Nothing else changes.
$49 a month flat. No card to start. Only metadata leaves the laptop, never code or transcripts.
northwind/storefront
See cost per client, not per seat.
Every session lands under the client whose repo it ran in. Developer, model, tokens and list price, for any date range.
Bill it back, with markup.
Export invoice lines as CSV, per client, per month, with the markup you set. Drops into Xero, QuickBooks or a spreadsheet.
Catch the $480 session today.
A loop that ran 23 hours shows up as one row with a price on it, the same day, not on next month's statement.
Your vendor dashboards count by user and by model. Never by client.
On a subscription seat there is not even a dollar figure. So the cost gets absorbed, or guessed, or billed as a flat fee that is wrong in both directions.
- Claude Team analytics
- Per user, per model, one to two days late. No repo, no project, no dollars.
- Cursor
- Audit log on the Enterprise plan only. Nothing per repo for a five-person shop.
- Codex CLI
- Token counts sit in ~/.codex with no roll-up at all.
- One Max seat, 3 weeks
- $2,803 of list-price usage across 376 sessions. The dashboard could not say what any of it was for.
Three steps. After that it runs on its own.
- 01
Run one command on each laptop
It registers a Claude Code hook and reads the session logs Claude Code and Codex already keep. History uploads on the spot, so you see real numbers before you finish reading this page.
Terminal$# output tallyhook: installed to ~/.tallyhook/tallyhook.js ✓ Claude Code hooks registered (SessionEnd, Stop) ✓ uploaded 312 sessions as maya@agency.dev
- 02
Pick a client for each repo, once
Sessions arrive tagged with their git remote. Choose the client from a dropdown and every past and future session from that repo follows.
Repos without a clientgithub.com/northwind/storefront→ Northwindgithub.com/acme/patient-portal→ Acme Healthgithub.com/bluebird/iosPick a clientChoosing a client saves instantly and re-tags every earlier session from that repo.
- 03
Export the invoice line
Cost by client, developer and model for any month, with your markup applied. A CSV that drops into whatever you invoice from.
northwind-invoice-2026-09.csvLine Sessions List Billable maya@agency.dev 38 $412.30 $494.76 tomas@agency.dev 21 $188.12 $225.74 Claude Sonnet 5 1,204 $551.02 $661.22 AI agent usage, September 59 $600.42 $720.50
# output tallyhook: installed to ~/.tallyhook/tallyhook.js ✓ Claude Code hooks registered (SessionEnd, Stop) ✓ uploaded 312 sessions as maya@agency.dev
Session metadata leaves the laptop. The work never does.
- Tokens by model, cache reads and writes split
- Start and end time, tool and version
- Git remote and branch
- Developer identity from git config
- Turn count and tool-call counts
- Paths of files edited
- First 160 characters of the first prompt (optional)
- Transcripts and every later prompt
- Code, diffs, file contents
- Tool output and command results
- Environment variables and secrets
The collector is one dependency-free file, about 300 lines. Read it before you run it: tallyhook.js.
Flat per workspace. Pays for itself on the first invoice.
Unlimited clients, repos and sessions on both plans. Fourteen days free, no card until you decide.
| Team | Agency | |
|---|---|---|
| Per month | $49 | $149 |
| Developers | up to 5 | up to 20 |
| Collectors | Claude Code, Codex | Claude Code, Codex |
| Exports | Invoice and session CSV | Invoice and session CSV |
| Price overrides | Yes | Yes |
| Start free | Start free |
Costs are list-price equivalents from each vendor's public API pricing. On a subscription (Claude Max, Team, ChatGPT Pro) that is the value of what your team used, not a bill you received. The app says so wherever a number appears.
Questions
Is this just ccusage with a login?+
ccusage was the reference for token counting and it is excellent for one machine. Tallyhook is the team layer: every developer's sessions in one place, mapped to clients, with invoice output. If you are solo, ccusage is enough.
How accurate is the cost?+
Tokens come from the vendor's own session logs, deduplicated per message. Prices are the public API rates per model, including cache reads and one-hour cache writes at twice input. You can override any model's price for negotiated rates.
Does the hook slow Claude Code down?+
The Stop hook runs at most once every ten minutes, times out after eight seconds and always exits cleanly, so an unreachable API never blocks a turn.
What about Cursor?+
Cursor keeps no local session log the collector can read, so it needs a small proxy. It is next on the list; tell us if you would use it.
Can I turn off the prompt snippet?+
Yes. Set privacy to true in ~/.tallyhook/config.json and only counts and identifiers are sent.