burneh
Product

Billing that reconciles to the cent.

We build the metering and billing core most SaaS teams bolt on too late: count every unit, price it against the plan, and hand finance an invoice that ties out. This is how ours runs.

Your monthly API calls62,000

Drag it. At 62,000 calls, Starter is cheapest, and the invoice on the right rebuilds itself line by line.

Invoice
INV-2026-0412
Aug 2026
Acme Labs · Starter
Starter plan$49.00
API overage · 42,000 × $0.00$42.00
Loyalty credit-$5.00
Subtotal$86.00
Tax · 8%$6.88
Total due$92.88
Reconciles against 62,000 metered events

Priced the way buyers actually decide.

Same usage as the slider above, priced against every tier. The math is built so the right plan wins at the right size, no bait pricing.

Startercheapest here
$49.00/mo
  • 20,000 API calls
  • 5 seats
  • 20 GB storage
then $1.00 / 1k over
$91.00 at 62,000 calls
Team
$199.00/mo
  • 100,000 API calls
  • 20 seats
  • 100 GB storage
then $0.60 / 1k over
$199.00 at 62,000 calls
Scale
$699.00/mo
  • 500,000 API calls
  • 100 seats
  • 500 GB storage
then $0.20 / 1k over
$699.00 at 62,000 calls

One event, all the way to a billable line.

The same path, every time. No cron doing arithmetic in the dark, no month-end spreadsheet. Each step is replayable, so a wrong number is a bug you can find, not a mystery.

1
Event
usage happens: an API call, a seat added, a byte stored
2
Idempotency
keyed by event id, a retry or replay is ignored
3
Aggregate
rolled up per meter, per account, per period
4
Rate
priced against the plan and its overage
5
Invoice
one line, traced back to the events

Metering that can't double-count.

Every event carries its own id, and the write is an upsert on that id. A network retry, a replayed queue, a duplicate webhook: all land on the same row. That's the one property that makes the invoice trustworthy.

meter.ts
1// a usage event is keyed by its own id, so a retry or a
2// replay lands on the same row and never bills twice
3export async function meter(event) {
4 await db.usage.upsert({
5 where: { id: event.id }, // idempotency key
6 create: {
7 id: event.id,
8 account: event.account,
9 meter: event.meter, // api_call, seat, gb
10 quantity: event.quantity,
11 period: event.period,
12 },
13 update: {}, // seen it already, do nothing
14 });
15}

Billing your finance team can sign off on.

Metering that can't double-count, plans that price themselves, and an invoice where every line traces back to an event. Ready the day you turn billing on.