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.

Run a free scan

Mistakes that cost the most

MistakeWhy it hurtsDo 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

  1. Sum your feature breakdown and compare it to your invoice. The gap is your unattributed spend.
  2. Express that gap as a percentage and write it down. That number is the honesty of every cost report you produce.
  3. Grep your codebase for every outbound model call and check each one carries a tag.
  4. List the call sites that emit untagged traffic and rank them by spend.
  5. 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.

Reported: chat $2,400, search $1,600, summarise $1,300, onboarding $700 = $6,000
Invoice = $9,000, so unattributed = $3,000, which is 33%
Of that, eval runs account for about $580 once tagged
Background enrichment jobs account for about $1,900
The remaining $520 comes from call sites nobody knew existed until somebody grepped for them

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

FigureWhat it meansConfidenceSource
30% to 35%modelled share of a monthly invoice sitting outside the feature breakdownestimated$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,000modelled unattributed spend, background jobs alone versus the full gapestimatedBoth 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.

Run a free scan

Keep reading


Sources: Groq pricing. Last reviewed 2026-08-01. Plain text version.