Guides / cost per customer

What is cost per customer?

Cost per customer is model spend attributed to a paying account rather than to one person inside it. In B2B a single customer can hold dozens of users, so cost per user hides the number your contract actually has to cover. Culpa, a local-first LLM cost, margin, and forecast ledger, tags each call to an account and rolls seat activity up to the customer paying the invoice.

Why this happens

A per-user figure and a per-customer figure answer different questions, and the gap between them is your expansion curve. Land-and-expand is the whole B2B motion: you sign four seats and grow to forty on the same annual contract. Every one of those seats generates model calls the contract already paid for. Per-user cost can sit perfectly flat through all of it, because each individual seat behaves the same way it always did. The account's economics still change completely.

What this usually looks like

  • Renewal quotes get built from a per-user cost that has barely moved in a year.
  • Nobody can state what your largest account costs to serve without exporting something by hand.
  • Seat expansion is celebrated in the revenue review and never appears in the cost review.
  • An account's spend crosses its contract value and the first person to notice is in finance, at quarter end.

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
Using cost per user as a stand-in for cost per customer.The two diverge by exactly your seat growth, which is the metric your sales team is paid to increase.Attribute at the account level and report seats alongside spend, so expansion shows up on both sides.
Attributing spend by whoever holds the API key.Shared service accounts collapse many customers into one bucket and the split can't be recovered later.Pass an account identifier on every call at request time, separate from the credential that authorises it.
Reviewing account cost annually, at renewal.By renewal the seats have already grown and the spend has already landed, so the review is a postmortem.Track cost against contract value monthly, and alert when an account crosses a share of its own revenue.

Run this check tonight

  1. Name your five largest accounts by revenue, then name your five largest by model spend. Compare the lists.
  2. For your biggest customer, divide monthly model spend by monthly contract value. Read that as a percentage.
  3. Count active seats per account this month against the same month last year. That ratio is your hidden multiplier.
  4. Check whether a call can be traced to an account without a join through a user table that may have been reassigned.
  5. Find any account where spend exceeds a third of what it pays, and put it on the renewal agenda now rather than later.

One account, eighteen months, no price change

Illustrative example

A $500 a month contract served on GPT-5.4 mini at real rates of $0.75 per million input and $4.50 output. Seat counts and per-seat token volumes below are modelled on a typical expansion curve.

One active seat: 2M input, 300k output = (2 x $0.75) + (0.3 x $4.50) = $1.50 + $1.35 = $2.85
At signup, 4 active seats = 4 x $2.85 = $11.40 a month against $500 of revenue
Eighteen months later, 46 active seats = 46 x $2.85 = $131.10 against the same $500
Cost per user never moved. It sat at $2.85 the entire time
Gross margin on the account fell from 97.7% to 73.8% with nobody changing anything

The per-user number was correct on every single day and useless on all of them. The account got 11 times more expensive to serve and the only metric that showed it was the one nobody was computing.

Every number, with its confidence and source

FigureWhat it meansConfidenceSource
$2.85modelled monthly model cost for one active seat on GPT-5.4 minicalculated(2 x $0.75) + (0.3 x $4.50) per million, using real GPT-5.4 mini rates from the price book, effective 2026-07-02. Per-seat token volumes are modelled.
$11.40 to $131.10modelled monthly cost of one account as it grew from 4 active seats to 46 on an unchanged contractestimatedBoth endpoints from the teardown arithmetic at real GPT-5.4 mini rates. A range because the seat expansion curve is modelled.

What a generic answer can’t know

A provider knows one API key. It has no idea which of your customers a call belongs to, how many seats that customer has, or what they pay you. Cost per customer needs an account identifier attached when the call is made and joined to contract value afterwards. Culpa does that on your infrastructure, keeps your prompts and responses there, and counts the calls to run your plan.

Questions founders ask next

What's the difference between cost per customer and cost per user?

A customer is the account that pays you. A user is one person inside it. In B2B those differ by the seat count, which grows over the life of a contract, so a flat per-user cost can sit on top of an account that got ten times more expensive.

How do I attribute model spend to a customer account?

Pass an account identifier on every outbound call at request time, kept separate from the credential that authorises the call. Shared service accounts otherwise collapse many customers into one bucket, and no later analysis can split them back apart.

What share of contract value should model spend be?

There's no defensible figure to quote across products, because model intensity varies enormously. The useful test is your own trend plus a threshold you set deliberately, so an account crossing it triggers a conversation before renewal rather than after.

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-01. Plain text version.