Waterline

Some of your customers cost more than they pay.

If your product runs on OpenAI or Anthropic and bills by seat or usage, Waterline connects that spend to your Stripe revenue and shows gross margin for every customer account. Not estimates. Your invoices, your books, reconciled.

Works with OpenAI and Anthropic. Reads Stripe with a read-only key.

The problem

52%

median AI gross margin

ICONIQ State of AI, Jan 2026 (n≈300 software executives)

23%

of revenue: average spend on inference

ICONIQ State of AI, Jan 2026

70%

of AI companies say delivery costs are eroding margins

Revenera Monetization Monitor (n=501 product leaders)

Your provider dashboard shows one number for the whole month. Stripe shows what came in. Nothing connects them, so the question “is this account making us money?” has no answer. And the accounts quietly losing money look exactly like the ones that aren't.

Every account below the line still shows up the same in a blended average.

Process

How it works

  1. 01~30 seconds

    Connect Stripe

    A read-only restricted key. Pulls customers, subscriptions and charges.

  2. 02~2 minutes

    Connect your model providers

    OpenAI and Anthropic, via a separate admin-level key, not the one your app uses for calls. Encrypted at rest with AES-256.

  3. 03~15 minutes of engineering

    Tag your calls with a customer ID

    One line after each model call. Tags it with a customer ID so spend can be split per account.

The product

The margin layer

Every account's margin, reconciled against your actual provider invoices. Updated as new invoices land, with alerts before you'd otherwise notice something's wrong.

Accounts
THE WATERLINE-34%-12%-3%+8%+41%+63%

Dig into any account whenever you want. Get paged the moment one crosses a threshold.

Which accounts are below the waterline?

Gross margin per customer, sorted worst first.

Is our free tier sinking us?

Cost by pricing tier, so you can see what unpaid usage actually costs.

Which feature is eating the budget?

Cost by feature, so gating and bundling decisions have a number behind them.

Did an account just go runaway?

Alerts when an account's cost crosses a threshold or its margin drops sharply, before the invoice arrives.

Questions

Common questions

Why can't I just build this myself?

A single OpenAI or Anthropic call can bill at up to four different rates depending on how it ran: standard, half price through a batch endpoint, a 90% discount on a cached read, or a premium on a cached write (per OpenAI's and Anthropic's own pricing pages, September 2026). Multiplying token count by list price gets this wrong by a full order of magnitude, in either direction, and every new rate tier a provider ships moves the target again.

OpenAI and Anthropic don't know who your customers are. How do you get a per-customer number?

They report cost at the org level, since they have no concept of your customers. We pull the real total from their Costs APIs, then split it across your customers by each one's share of tracked tokens for that period. The real total already reflects whatever mix of batch, cached, and standard pricing actually happened, so the split is fair without needing to know which rate applied to which call.

Will this slow down or break my requests?

track() runs after you already have the provider's response, so it's never in the path of the actual API call. It reads a few fields off an object you already have and queues them in memory. If anything goes wrong, it reports the error through a callback instead of throwing. The one real network call happens on a background timer, or when you call flush() yourself, which is capped at a 10-second timeout so a slow response on our end can't hang yours.

What data do you actually see?

Token counts, the model name, a timestamp, and whatever customer ID you pass in. Not prompt or completion content. For Stripe, a read-only key scoped to customers, subscriptions, and charges, nothing that touches card numbers.

Is the margin number an estimate?

Early on, yes, clearly labeled as one, built from the same usage data the free calculator uses. Once your provider invoices land, we reconcile against them and the number stops being modeled.

What does this cost?

Not decided yet. We're onboarding a handful of design partners first, pricing comes after that.

Get access

Join the waitlist

We're onboarding founders and finance leads in small batches. Leave your email and we'll reach out when it's your turn.