Guides / unattributed llm spend
Unattributed LLM spend, and why it keeps growing
Unattributed spend is every dollar your breakdown can't assign to a feature, user or customer. It grows because new call sites ship without tags, and it hides your worst waste. Culpa, a local-first LLM cost, margin, and forecast ledger, tracks the untagged share as its own number, so the gap in your attribution stays visible.
Why this happens
Attribution decays by default. Someone adds a call site in a hurry, the tag is optional, and the call lands in the default bucket. Background jobs, migrations, eval runs and internal tools rarely carry customer identifiers at all. Because nobody owns the unattributed bucket, nobody notices it growing, and it becomes the single largest line in a breakdown that everyone still treats as complete.
What this usually looks like
- Your feature breakdown sums to noticeably less than your invoice, and the difference has no name.
- The largest single line in your cost report is a default or empty category.
- New call sites are discovered during incidents rather than during review.
- Background and internal traffic never appears in any cost review, because it has no customer to attach to.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Mistakes that cost the most
| Mistake | Why it hurts | Do instead |
|---|---|---|
| Making the attribution tag optional at the call site. | Optional fields are omitted under time pressure, which is exactly when new call sites get written. | Make the tag a required argument, so an untagged call can't compile or passes through a loud default. |
| Treating the unattributed bucket as rounding error. | It only ever grows, and because it's unowned it hides the waste nobody is looking for. | Track untagged spend as a headline metric with a target, and review any increase as a defect. |
| Excluding internal and background traffic from attribution because it has no customer. | That traffic is often the largest untagged slice, and excluding it makes the whole breakdown untrustworthy. | Give internal traffic its own feature tags, so it's attributed even where no customer exists. |
Run this check tonight
- Sum your feature breakdown and compare it to your invoice. The gap is your unattributed spend.
- Express that gap as a percentage and write it down. That number is the honesty of every cost report you produce.
- Grep your codebase for every outbound model call and check each one carries a tag.
- List the call sites that emit untagged traffic and rank them by spend.
- Check whether an untagged call fails loudly or silently today. Silent is why the bucket grows.
A breakdown that looks complete and covers two thirds of the bill
Illustrative example
A $9,000 monthly invoice. The cost report shows four features. The arithmetic below is what the report shows against what the invoice says, priced on real rates but with modelled volumes.
A third of the bill sat outside a report everyone treated as the whole picture, and the largest hidden line was a background job with no owner and no customer.
Every number, with its confidence and source
| Figure | What it means | Confidence | Source |
|---|---|---|---|
| 30% to 35% | modelled share of a monthly invoice sitting outside the feature breakdown | estimated | $3,000 unattributed against a $9,000 modelled invoice, from the teardown arithmetic. Published as a scenario because no customer data backs the split. |
| $1,900 to $3,000 | modelled unattributed spend, background jobs alone versus the full gap | estimated | Both endpoints from the modelled breakdown above. A range because it brackets one known contributor against the total. |
What a generic answer can’t know
A provider can't attribute anything to your features, because your feature names have never crossed the wire. The unattributed bucket isn't a provider limitation you can work around with better reporting, it's missing capture. Culpa attaches identifiers as calls leave, on your infrastructure, where your prompts and responses stay, and counts the calls to run your plan.
Questions founders ask next
What is an acceptable level of unattributed LLM spend?
Aim for near zero, and treat any sustained increase as a defect rather than a fact of life. The exact target matters less than the direction, because a bucket that grows is one that will eventually hide something expensive.
Can I attribute past spend retroactively?
No. The identifiers had to travel with the request. Once calls are in a provider's billing record without them, the mapping to your features doesn't exist anywhere and no analysis rebuilds it.
Should internal and background traffic be attributed?
Yes, with its own feature tags. It has no customer, but it definitely has a cost and an owner. Leaving it out is how the largest untagged line in most breakdowns comes to exist.
On your infrastructure
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.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Keep reading
Sources: Groq pricing. Last reviewed 2026-08-01. Plain text version.