Guides / cost floor

What is a cost floor?

A cost floor is the lowest defensible figure for a call, recorded when something needed to price it fully never arrived, and flagged as incomplete rather than estimated into looking finished. Culpa, a local-first LLM cost, margin, and forecast ledger, counts a floor as a floor, so a total you can act on stays separate from a total that quietly filled its own gaps.

Why this happens

Every cost tool meets calls it can't fully price, and the choice it makes there decides whether its totals mean anything. There are two ways to arrive at one. The token counts can be incomplete, which happens when a response carries an input count and no output count or neither. Or the counts can be perfect and no rate exists for the model that served the call. Either way the honest move is the same: record what's known, price what can be priced, and mark the row so the shortfall is visible instead of averaged away.

What this usually looks like

  • Your totals reconcile against the invoice for some models and never for others.
  • Nobody has separated rows that were fully priced from rows that weren't.
  • A cost figure has never once looked incomplete, which is unlikely rather than reassuring.
  • A model appeared in production before any rate existed for it and nothing flagged that.

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
Filling a missing token count with an average.The total then looks complete and nothing marks which rows were invented, so nobody rechecks them.Record the gap. A number that admits what it missed is the only one you can improve later.
Reading a headline total without checking how much of it was floored.A floor sits below the truth by construction, so a mixed total understates by an unknown amount.Split every total into fully-priced and floored before quoting it to anyone.
Discarding calls that can't be priced.The token counts go with them, so the spend can never be recovered once a rate exists.Keep the call and its counts. Adding the rate later reprices history rather than rebuilding it.

Run this check tonight

  1. Split last month into fully-priced rows and floored rows, and count both.
  2. For the floored rows, check which of the two causes applies: missing counts or missing rate.
  3. For missing counts, look at whether those calls streamed.
  4. For missing rates, list the model ids and check each against your price book.
  5. Quote the fully-priced total and the floored count together, never the sum alone.

A month with two kinds of gap in it

Illustrative example

5 million calls on GPT-5.4 at real rates of $0.0025 per 1k input and $0.015 output, each sending 3,000 input tokens and returning 500 where the counts arrived. The mix of gaps below is modelled.

Fully priced, 4.2M calls: 4,200,000 x $0.015 = $63,000
500,000 streamed calls arrived with no token counts, so each prices to $0.00 and flags
300,000 calls ran on a model with no rate, so each prices to $0.00 and flags
Reported total = $63,000, with 800,000 rows carrying a floor
16% of calls contribute nothing to a total that will be read as if it were the whole bill

The $63,000 is correct and it isn't the answer. The number that changes what you do next is the 800,000 flagged rows, because that's the part of the month nobody has priced yet.

Every number, with its confidence and source

FigureWhat it meansConfidenceSource
$63,000modelled monthly spend from fully priced calls, excluding every floored rowcalculated4,200,000 calls x $0.015, using real GPT-5.4 rates per 1k from the price book, effective 2026-07-02. Call volume and the mix of gaps are modelled.
16%modelled share of calls contributing nothing to a total that reads as completecalculated800,000 floored rows divided by 5,000,000 calls, from the teardown arithmetic.

What a generic answer can’t know

A provider sends one total and never tells you which of your calls your own tooling failed to price. That comparison needs your ledger and your invoice in the same place, with the floored rows separable from the rest. Culpa keeps that on your infrastructure, where your prompts and responses stay, and counts the calls to run your plan.

Questions founders ask next

What makes a call's cost incomplete?

Either the token counts didn't fully arrive, which needs both an input and an output count to be considered complete, or no rate exists for the model that served it. The first happens most often on streamed responses and the second on models newer than your price data.

Why record a zero instead of estimating?

Because a visible zero gets questioned and a plausible estimate gets trusted. An estimate also destroys the evidence, since nothing afterwards marks which rows were invented, and the total looks finished while being wrong by an unknown amount.

Can a floored call be priced later?

Yes, as long as the token counts were kept. Adding the missing rate reprices the stored history rather than requiring the traffic to be captured again, which is the practical reason to record and flag rather than to drop.

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.


How Culpa works

Find the culprit. Not just the total.

Your dashboard shows what you spent. It stops short of who spent it. Culpa shows the conversation, the user and the feature behind it.

Your prompts stay local.

Culpa runs on your own infrastructure. What you send to a model reaches us at no point.

Every dollar has a name.

Follow any charge to the conversation, the user, the feature and the customer behind it.

See the bill before it lands.

Cost your next feature before you ship it. You get the likely bill and the worst case, at best, median, p90 and p99.

Three steps to your first answer.

1

Change one base URL.

Or drop in the Python or TypeScript library.

2

Find your most expensive conversation.

In the first session, not the first week.

3

Cost your next feature before you ship it.

Base URLhttp://localhost:4545/v1Your traffic keeps flowing if Culpa ever stops.

Why the bill went up

Example dashboard

Calls traced

418,209

across 3 projects

Spend this week

$378.41

+ $182 vs last week

Failed calls

312

74% retried, and you paid for all of them

+ $182 this week traced to one culprit

Spend over 14 days

$0$20$40$60$8024262830020406
user_384report_generatorconv_91fprompt_v1894,220 tokens3 retries$6.81

Most expensive users

user_384$38.42
user_119$21.07
user_562$14.90
user_204$8.30
user_871$5.10

Next week forecast

Best$180
Median$240
p90$310
p99$395

Graded against reality. Accuracy shown as results land.

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: OpenAI API pricing. Last reviewed 2026-08-02. Plain text version.