THE AI BILL

Find out what AI actually costs this business, line by line

A vendor, a tool, a team and an owner on every line. Billed kept apart from metered.The head of IT who owns the AI line on the card statementThe board gets a number off the statement and it holds for ten seconds. Which teams, which tools, who signed them off: that answer is a spreadsheet nobody has updated.

Put a vendor, a tool, a team and a named owner on every AI subscription and API account, then map the charge lines out of your finance export onto a ten-column import template. No billing credential, no vendor console login, no security review.
What one line carries
A vendor, a tool, a team and an owner email
What you supply
Your finance export, mapped onto a ten-column template
Two numbers
Billed per currency, metered separately, never summed
Currency conversion
None. A euro charge is reported in euros
What an import cannot findA subscription that is on no invoice you give it
before the fix

Finance owns the total. Nobody owns the shape.

The card statement gives you a total and it is right: money moved. What it does not hold is which team, which tool and who decided, so the second question in the meeting is the one that lands. The usual answer is a spreadsheet that was accurate the week it was made.

the procedure

4 steps, in this order.

Start to finish
Step 1

Register what you know about

One entry per vendor and tool, with a team and an owner email, in one of three states: approved, prohibited or unknown.

then
Step 2

Map the export onto the template

Ten required columns: external id, vendor, tool, team, kind, currency, amount, charge date and the two service-period dates. Owner email and subscription id are optional.

then
Step 3

Import it, and read what it refuses

The dashboard previews the parsed lines first. Unrecognised columns are refused, bounded at 1,000 lines, and rolled back whole.

then
Step 4

Read billed and metered apart

Billed reports per currency, subscription and API in separate columns. Vendors you have not imported are unknown, not nothing.

Those steps build the register and get the first invoice in. What the reporting does with them afterwards is the capability page.

See how a charge is recorded
before you go further

Built for this. Wrong for that.

Built for

  • An AI bill of several subscriptions plus a metered API account, often in more than one currency.
  • A finance export you can map onto a template, and invoices you can download.
  • Anyone who must name a team and an owner per line rather than produce one total.

Wrong for

  • Anyone who wants subscriptions discovered. An import finds what the invoice lists; anything else stays unknown.
  • Anyone who needs one blended AI number. A charge and an estimate are never added, and no exchange rate is applied.
  • Anyone expecting it to cancel a subscription or reclaim a seat. Only the vendor ends an entitlement.

One thing you can check yourself

One command imports a synthetic invoice, imports it again and asserts the second adds nothing, then asserts billed subscription and API amounts are reported separately.

`npm run evaluate` starts a throwaway copy on a laptop: temporary database, random credentials, a mock provider, none of your data.

Where this is published

A bill and an estimate are never added together.

An invoice is money that has already moved; a metered estimate is a calculation over observed traffic. Adding them produces the single figure an executive asks for and a number that reconciles against nothing — which is how a spend tool loses its credibility over arithmetic.

Billed
What an invoice line says, per currency, with its charge date and service period. Retained without proration.
Metered
What gateway traffic is calculated to have cost, against price rows you hold. Never folded into the billed figure.
Unknown
A source nobody connected. Reported as unknown rather than zero: those look identical on a chart and mean opposite things.
Never produced
A blended total, or a converted multi-currency one. No exchange rate is applied anywhere.
two measurements, reported as two numbers

What a vendor billed you, and what the gateway metered. Both are real and they are not the same measurement, so the report keeps them apart on purpose.

billed — what an invoice says

Imported charge lines. Subscriptions and API charges are two kinds of the same evidence, so they add up inside one currency.

currencysubscriptionapitotal
USD1,240.00806.402,046.40
GBP180.0096.50276.50

no row beneath these two, because nothing is converted: two currencies do not add

never summed
metered — what the gateway recorded

An estimate priced from recorded traces, in USD only. It may cover the same usage an invoice already covers.

estimatedCostUsd
412.90
requests
18,204
inputTokens
24,118,940
outputTokens
3,602,177

a missing cost is not free usage: it is a model with no price row

Field names are the product’s own; the figures are illustrative. Credits arrive as negative amounts and are included. Billed rows total within a currency and no further — nothing is converted, and no figure spans the two panels.

The same export imported twice adds nothing.

Identity is team, source and external id together, so an identical reimport contributes no spend. A reimport reusing an identity with different data is a conflict rather than an update and the whole import rolls back. Corrections are separately identified credit lines, which keeps the ledger append-only.

the bit that remains

4 things this still does not solve.

  • An import finds what the invoice lists. A personal card, a free tier or a vendor you have not exported stays unknown until another source finds it.
  • Nothing is reconciled against the vendor's own billing system. There are no live billing adapters, and every metered figure is a calculation against price rows you hold.
  • It does not reduce the bill. Nothing here routes, caches or downgrades a model to save money, and no percentage saving is claimed anywhere.
  • The register records the current decision. It is not an attestation that earlier use was permitted, and it cannot cancel a subscription.

Every page here ends on what the job still does not solve. The complete position is on one page.

What we do not claim

Does this connect to our finance system or our vendor billing accounts?

No, and that is the argument rather than a limitation. You map the charge lines out of the export finance already produces onto the ten-column import template, as CSV in the dashboard or JSON over the API, so there is no billing connector to authorise and no vendor admin credential in the path. An import then finds what the invoice lists, and nothing else.

Why will it not give us one total for AI?

Because the two things it holds are different measurements. Add a £120 subscription to £340 of estimated tokens and £460 appears nowhere else in your business: not on the vendor invoice, and not in the gateway.

Can we trust a low number, or a screen with nothing on it?

Only as far as your coverage. A source nobody connected reads as unknown, never zero, and the estate report's completeness flag is hard-coded false with its reasons beside it. Detail rows cap at 1,000 and any truncation is stated in the report.

what happens next

Describe the version of this you actually have.

Say what your estate contains and which part of it worries you, and you will get a straight answer about where to start.

no form · no qualification step · no sales desk