# Granular LLM cost attribution, and where every tool stops > Every cost tool stops somewhere: agent, session, key, invoice. Below that floor the split was never recorded, so no query recovers it later. URL: https://getculpa.com/granular-llm-cost-attribution Last reviewed: 2026-08-03 Rates effective: 2026-07-02 ## Answer Granular LLM cost attribution means pricing each individual call and rolling it up to the conversation, customer or feature that caused it. Every tool has a floor below which it aggregates, and nothing recovers detail once it has gone. Culpa, a local-first LLM cost, margin, and forecast ledger, prices every call and keeps that floor at the call. ## Why this happens Ask any cost tool what a single conversation cost and you learn where it stops. Grafana's AI observability publishes per-agent cost breakdown in USD, so its floor is an agent. Datadog's LLM Observability reports cost across AI agents, and its Cloud Cost Management forecasts an ingested vendor invoice, so it has two floors and the lower one is still an agent. Langfuse filters by user and session. Respan sets budgets per key, per customer or org-wide. Dynatrace assesses token cost per model. Every one of those is genuinely useful and every one is a ceiling. The part that matters is what happens underneath it: aggregation is a one-way operation. A total is a sum, and the information needed to divide it back up was discarded at write time rather than stored and hidden. So a tool whose floor is the agent can never answer a question about a conversation, no matter how long you wait or how much history accumulates. The floor is decided the day you instrument, and it's the only cost decision that can't be revisited later. ## What this usually looks like - Your cost view stops at a level above the question you keep being asked. - A total is correct and nobody can break it into the parts that caused it. - One expensive conversation sits somewhere inside a monthly figure and can't be pulled out. - You added a dimension to reporting and it only applies from that day forward. - Two teams share an agent, and the agent-level cost helps neither of them. ## Common mistakes - Assuming detail can be recovered from a total later. Why it hurts: Aggregation discards the split rather than hiding it. Nothing remains to query afterwards. Do instead: Record attribution at write time, at the finest level you might ever need. - Choosing a floor from today's questions. Why it hurts: The floor outlives the question. A per-agent floor answers nothing about a customer who shares that agent. Do instead: Set the floor at the call, then aggregate upward at read time where the answer is cheap. - Reading per-user filtering as per-call attribution. Why it hurts: Filtering picks rows from what was stored. If calls were never stored individually, the filter has nothing finer to pick. Do instead: Ask what the smallest stored row is, not what the interface can filter on. - Sampling traces and keeping cost reporting. Why it hurts: A sampled floor makes every total an estimate, and usually an unlabelled one. Do instead: Sample traces if you must and meter cost completely. They're different jobs on the same call. ## Self-check - Ask your cost tool what your single most expensive conversation last week cost. - If it can't answer, find the level it does answer at, and write that down as your floor. - Name a question your business will ask within a year that sits below that floor. - Check whether cost rows are stored per call or already summed on the way in. ## What an agent-level floor hides inside one agent One shared support agent serving three customers in a month, priced on Claude Haiku 4.5 at real rates of $1.00 and $5.00 per million from the price book effective 2026-07-02. A tool whose floor is the agent reports one number for all of it. Customer volumes are modelled. customer A: 60M input and 12M output = $60.00 + $60.00 = $120.00 customer B: 25M input and 4M output = $25.00 + $20.00 = $45.00 customer C: 8M input and 1M output = $8.00 + $5.00 = $13.00 the agent reports $178.00, which is correct and answers nothing customer A costs 9.2 times customer C, and that ratio exists nowhere in the data If those three pay the same subscription then one is funding another, and the agent-level number can't show it. The 9.2x spread wasn't lost in analysis. It was never written down. ## Cost figures Every figure carries its confidence and its source. No figure on this page is provider-reported. - $178.00, modelled monthly cost of one shared agent, hiding a 9.2x spread between the three customers behind it [calculated] Source: Three modelled customers priced on Claude Haiku 4.5 at real rates of $1.00 and $5.00 per million from the price book effective 2026-07-02: $120.00 + $45.00 + $13.00 = $178.00. Customer token volumes are modelled. The point of the figure is that the total is correct and the three components exist nowhere in an agent-level record. ## FAQ Q: What is granular LLM cost attribution? A: Pricing each individual call and tagging it with everything that caused it, so cost per conversation, per customer, per feature and per prompt version are all roll-ups of the same stored rows. The opposite is summing at write time, which fixes the level of detail forever on the day you instrument. Q: Can I add more granularity later? A: Only going forward. Aggregation discards the split rather than hiding it, so nothing remains to query retroactively. This is the one cost decision that can't be revisited, which is why the floor is worth setting deliberately rather than inheriting from a tool. Q: Where do other tools stop? A: At different levels, each published on their own pages and read 2026-08-03. Grafana breaks cost down per agent, Datadog reports cost across agents and forecasts an ingested vendor invoice, Langfuse filters by user and session, Respan budgets per key or per customer, and Dynatrace assesses token cost per model. All useful. All above a call. Q: Doesn't storing every call get expensive? A: That's the real trade and it's worth stating plainly. A priced call row is small, far smaller than the trace payload most platforms bill you to ingest, and Culpa keeps it on your own storage rather than charging per gigabyte. The floor costs you disk. Skipping it costs you a question you can never answer. ## Sources - Anthropic pricing: https://platform.claude.com/docs/en/docs/about-claude/pricing - Grafana Cloud AI observability: https://grafana.com/docs/grafana-cloud/monitor-applications/ai-observability/ Run the free Cost Leak Scan: https://app.getculpa.com/scan?source=pseo&slug=granular-llm-cost-attribution&cluster=problem Machine-readable index of every guide: https://getculpa.com/api/pages Human-readable index of every guide: https://getculpa.com/guides Site overview: https://app.getculpa.com/llms.txt Privacy: Culpa runs on your infrastructure. Your prompts and responses never leave it. Culpa counts calls to run your plan, and it fails open, so if it ever breaks your app keeps running.