Guides / gross margin per customer

What is gross margin per customer?

Gross margin per customer is what an account pays you minus what serving it costs in model spend, per account rather than averaged. On usage-heavy AI products the spread between accounts is enormous. Culpa, a local-first LLM cost, margin, and forecast ledger, tags spend to a customer and reconciles it against revenue you type in or import.

Why this happens

Traditional SaaS could ignore per-customer cost because serving one more account was close to free. AI products broke that. Your heaviest account can cost fifty times your lightest one on the same plan, so a single flat price produces both your best and your worst margin. An average margin across the base looks fine right up to the point where a handful of heavy accounts move onto a cheap tier, and by then the damage is in the run rate.

What this usually looks like

  • Your blended gross margin looks healthy while a specific plan tier is losing money on every heavy account.
  • Nobody can name your least profitable customer, so nobody can act on it.
  • Usage caps got set from a guess rather than from the token profile of your actual power users.
  • A large new logo lands and the model bill jumps by more than the contract's monthly value.

Free, no card, no account

Run the free Cost Leak Scan

It shows your most expensive conversation before you install anything.

Run the free Cost Leak ScanStart 14-day trial

Mistakes that cost the most

MistakeWhy it hurtsDo instead
Reporting one average margin across all customers.Usage on AI products is long-tailed, so an average sits nowhere near the accounts that actually decide your economics.Report the distribution. Your 90th-percentile customer cost is the number that should set your pricing floor.
Attributing model spend to customers by dividing the total by headcount.It produces a number that's wrong for every single account, and confidently wrong is worse than absent.Tag every call with a customer identifier at request time, so the roll-up is measured rather than apportioned.
Treating a signed contract value as revenue for margin purposes without checking usage.An account can be profitable in month one and underwater by month four purely because its usage grew.Recompute margin per account monthly, and alert when any account's cost crosses a share of its revenue.

Run this check tonight

  1. Pick your ten largest accounts by usage and compute model spend for each over the last month.
  2. Divide each account's spend by what it pays you. Anything above about a third of revenue deserves a conversation.
  3. Find the single account with the worst ratio. Check which plan it's on and whether that plan has a usage cap.
  4. Compare your heaviest account's cost to your median account's. The multiple tells you how badly a flat price fits.
  5. Check whether any account costs more than it pays. On usage-heavy products that's common and rarely noticed.

Two accounts on the same $200 plan, opposite margins

Illustrative example

Both accounts pay $200 a month. Both run on Claude Sonnet 5 at its real introductory rates, $0.002 per 1k input and $0.010 per 1k output. Only their usage differs, and the volumes below are modelled.

Light account: 2M input, 400k output = (2,000 x $0.002) + (400 x $0.010) = $4 + $4 = $8
Light account margin = ($200 - $8) / $200 = 96%
Heavy account: 60M input, 14M output = (60,000 x $0.002) + (14,000 x $0.010) = $120 + $140 = $260
Heavy account margin = ($200 - $260) / $200 = negative 30%
Blended across just these two = ($400 - $268) / $400 = 33%, which describes neither account

One account at 96% margin, one at negative 30%, and a blended 33% that would let both hide. The heavy account costs $260 to serve for $200, and only per-account attribution surfaces it.

Every number, with its confidence and source

FigureWhat it meansConfidenceSource
$260modelled monthly model spend for a heavy account paying $200calculated(60,000 x $0.002) + (14,000 x $0.010) using real Claude Sonnet 5 introductory rates per 1k tokens from the price book, effective 2026-07-02. Usage volumes are modelled.
-30% to 96%modelled gross margin spread between two accounts on an identical planestimatedRange across the two modelled usage profiles above, both priced at real Claude Sonnet 5 rates. Shown as a range because the endpoints depend entirely on your own usage distribution.

What a generic answer can’t know

Margin needs two numbers from opposite sides of your business, model spend and revenue, joined on the customer. No provider has your revenue, and no billing system has your token counts. The join has to happen where both are reachable. Culpa does it on your infrastructure, keeps your prompts and responses there, and counts the calls to run your plan.

Questions founders ask next

How do I attribute model spend to a specific customer?

Attach a customer identifier to every outbound call at request time, the same way you'd tag a feature. Without it the calls are anonymous in the ledger afterwards, and no amount of analysis recovers the mapping.

Where does the revenue side come from?

You type it in or import it. Culpa doesn't connect to your payment processor automatically at launch, so the revenue figure is one you supply and the margin is computed against it.

What margin should an AI product target?

There's no defensible industry figure to quote here, and numbers that circulate usually come from companies with very different usage profiles. The useful target is your own trend, and knowing which accounts sit below it.

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.

Keep reading


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