REVENUE CONTROL / BROWSER-LOCAL
How the reconciliation ledger is calculated
The engine validates first, then assigns events, resolves every effective price revision, rates exact decimal quantities and rounds once for each governed segment.
The deterministic sequence
- Validate unique event and invoice-line keys, non-overlapping invoice periods, types, currencies and timestamps.
- Reject gapped or overlapping tiers and conflicting effective price windows.
- Assign each event to exactly one
[period_start, period_end)interval. - Choose an exact customer price first, otherwise the meter default effective at each event timestamp.
- Rate each effective revision, apply its included quantity and minimum, then compare the exact summed minor units. Tier bounds follow Stripe's
up_to: a volume total equal to a tier's end is priced in that tier. Before 17 October 2026 such a total fell into the next tier; every ledger names its rules inrules. - Emit input hashes, normalized rows, selected pricebook rows and arithmetic trace behind every finding.
Finding classes
late_eventmissing_invoice_lineinvoice_period_unknownextra_invoice_linemissing_usageunbilled_usageunknown_priceambiguous_pricestale_price_idcurrency_mismatchamount_mismatchAn event without an invoice line is blocked because its billing-period allowance and minimum cannot be inferred. Duplicate keys and invalid rows stop before rating; they are input errors, not financial findings.
Limits
A blocked line is never included in an aggregate money claim. MeterProof does not infer a missing contract term, combine currencies or recommend an accounting action.
How "nothing uploaded" is tested
Before a release, an automated test opens this site in Chromium and WebKit, runs the worked audit and a full audit of the three starter CSVs, and records every request the page makes. It fails if any request carries a body over 1 KB, carries a row from the files, or goes anywhere except this site and the cookieless analytics endpoint. The optional AI pricebook builder is the one feature that sends text — only what you paste, after you sign in — so the test leaves it out.