The Closed Books

Root Causes of Billing-to-Revenue Discrepancies in Usage-Based Models

Billing systems built for seats can't track tokens, creating predictable revenue leaks.

Contributing Editor · · 10 min read
Cover illustration for “Root Causes of Billing-to-Revenue Discrepancies in Usage-Based Models”
Reconciliation · September 16, 2026 · 10 min read · 2,338 words

Usage-based pricing is now the default model for software, and most billing infrastructure was built for a different era. It counts seats. It doesn't count tokens, GPU-minutes, or API calls, and that gap produces revenue loss traceable to a small set of structural failure points that repeat, company after company, rather than piling up from random operational error.

The direction of the market isn't in question. The 2025 Monetization Monitor found that 59% of software companies expect usage-based pricing to grow as a share of revenue this year, up 18 points from 2023. 2025 MGI Research put silent revenue leakage at 1 to 5% of ARR annually, which for many companies works out to somewhere between $500,000 and $5 million a year. Buyers want to pay for what they consume, and most billing systems weren't built to watch consumption happen in real time. What follows traces the failure points in the order they occur in the pipeline: event capture, aggregation, pricing enforcement, reconciliation. The fix on the other end of that chain is eliminating the need for that integration at all. It's not needing that integration at all.

Event loss at the ingestion layer: how usage disappears before billing ever sees it

Diagram: Where Revenue Disappears: Four Failure Points in the Billing Pipeline. Visualizes: Visualize the four sequential failure points in a usage-based billing pipeline, in the order the article traces them: (1) Event Capture — events dropped via…

Billing starts at ingestion. Every billable action has to get captured, validated, and routed into a metering system before any billing logic can run. This includes an API call, a token, and a GPU-minute. If the event never arrives cleanly, nothing downstream fixes it. That failure becomes permanent the moment it happens. It's structural.

The ways events get lost are mundane, and they repeat constantly. Network failures, queue overflows, and misconfigured producers drop events in transit. Deduplication logic meant to catch true duplicates sometimes grabs a legitimate event alongside them and throws both away. Events arrive out of order and land outside the aggregation window the system expected. Without idempotency guarantees, a retry that should be a harmless no-op creates a duplicate charge instead, or a dropped event just vanishes because nothing ever retries it.

Forrester's 2023 research found that 68% of SaaS companies experienced billing errors in the prior year traceable to data pipeline failures, a majority, not a fringe problem.

The fix looks like append-only event sourcing with configurable retention, so when an error surfaces after invoices have already gone out, the events get replayed and corrected rather than reconstructed by guesswork. Apache Kafka's log-based model has become close to the standard mechanism for this at scale, precisely because it preserves the raw event stream instead of collapsing it prematurely. Idempotency at the point of ingestion isn't optional: a system that can't tell a genuine retry from a duplicate will either drop events and leak revenue, or count them twice and overbill. Under-billing from this layer looks almost boring in practice. The product database shows one number, the billing system shows a smaller one, and nobody notices until someone happens to put the two side by side.

Aggregation timing mismatches: how events that arrive become revenue that doesn't

Aggregation turns raw events into billable quantities. The system groups events into windows, hourly, daily, monthly, and sums or rates them against pricing rules. Get the timing wrong, and the event itself can be perfectly intact while the revenue it represents disappears anyway. This is the failure mode people underestimate most, because nothing looks broken. The data's all there. It's just sitting in the wrong bucket.

The failures cluster around timing, not accuracy. Events landing after a billing cycle's cutoff get logged in the product system but excluded from an invoice already generated. Timezone mismatches between a product's event timestamp and the billing system's cycle boundary quietly shift usage into the wrong period. Batch processing that only runs at month-end can't surface a discrepancy until the invoice is already sitting in the customer's inbox. A tumbling aggregation window set to the wrong interval misattributes events to the wrong billing period entirely, with no error thrown and no flag raised.

Picture a product database logging 10,000 API calls in a period while the billing record shows 9,847. The gap traces to timezone differences, batch delays, and events logged just after the cycle closed, and every one of those missing calls is either lost revenue or the start of a customer dispute. Manual reconciliation of a mismatch like this is time-consuming, and the gap only becomes visible once the invoice is already out the door.

Batch processing finds these mismatches after the fact. Stream processing applies billing logic as events arrive and can flag a mismatch before an invoice ever generates. Those are two different outcomes. They're two different outcomes. Even a small lag in billing events is enough to generate disputes and under-billing once that delay runs across thousands of customers and millions of events a day.

Pricing dimension complexity that billing systems cannot model

Usage-based pricing spans several models. It's several: pure pay-as-you-go, credit-based systems, hybrid subscription-plus-usage arrangements, outcome-based pricing. Each demands different billing logic, and a system built to handle one well often can't handle the other three at all. Most companies fall into the same trap: they build for the pricing model they launched with, and the model changes under them within a year or two.

The clearest case is dimensionality. A product billing simultaneously across tokens, GPU-minutes, audio minutes, megapixels, and hardware tiers needs a billing engine that holds and evaluates all of those at once, and most billing platforms weren't built to do that. Metric translation compounds it: if a product tracks API calls internally but bills on some derived metric, that conversion step is itself a place where the numbers quietly diverge. Mixpanel's own pricing metric shifts are an instructive case of how a misaligned pricing metric produces systematic billing discrepancies, not occasional ones.

AI margins sharpen the urgency here. ICONIQ's research shows the average AI builder now uses 3.1 model providers, up from 2.8 just six months prior, and each provider carries its own cost structure that has to map cleanly to whatever unit the company bills on. A customer on a flat $499-a-month plan who suddenly generates 10x their usual usage can flip that account's margin from positive to negative within a single billing cycle. A billing system that can't model consumption in real time has no way to see that coming, let alone stop it before the invoice goes out wrong.

Credit-based pricing adds its own layer of exposure. Vendors routinely reserve the right to change credit multipliers on existing services, so something costing 10 credits today might cost 20 tomorrow. Unless the billing system versions those multiplier changes and applies them correctly going forward, every invoice generated after the change is wrong. Salesforce charges $2 per AI conversation through Agentforce, Zendesk charges $1.50 per resolved conversation, and HubSpot charges $10 per 1,000 AI credits beyond a plan's allotment. None of these are seat-based numbers, and a billing tool built to count seats has no native way to express any of them. When the platform can't represent the model, the result is custom code maintained in parallel forever, or errors wherever the pricing complexity outruns what the platform can hold.

Pricing configuration drift: when the rate applied stops matching the rate agreed

This failure mode looks nothing like the first two. The billing system works exactly as designed, captures every event, and charges the wrong rate anyway, correctly and consistently, invoice after invoice. Nobody's system is broken. The number in it is just wrong.

Drift accumulates through a handful of familiar paths. Grandfathered pricing that should have expired stays live because nobody updated the billing configuration. Volume discount tiers fail to reset at period boundaries. Promotional rates keep running long after their intended end date. Custom contract terms get translated incorrectly into the billing system, or don't get translated at all. When a CRM amendment gets processed but the billing system never picks it up, finance and sales end up reporting two different ARR figures for the same customer, both confident, both wrong.

A Cledara analysis found that 42% of SaaS companies had at least one active subscription where the billed rate no longer matched the current list price or the contracted rate. The root of the problem usually isn't technical at all. Contract data lives scattered across PDFs, email threads, CRM fields, and spreadsheets rather than one structured system of record, and as long as that's true, every pricing change opens a window where the configuration, the contract, and what's actually being billed drift apart from each other.

Pricing keeps changing, which keeps reopening that window. Pricing changes are frequent across the industry, and most software companies have revisited their pricing or packaging in recent years. Subscription state lag makes it worse still: a customer upgrades, downgrades, pauses, or cancels, and if the billing system reflects that change on any delay, every day of lag is either revenue lost or an overbill waiting to turn into a dispute.

The reconciliation gap between metering and invoicing layers

The standard architecture in this industry is two separate systems, a metering tool and a billing tool, stitched together through integration. That seam is a permanent maintenance obligation for as long as the two systems stay separate, and it doesn't get cheaper as the business scales. It gets more expensive. This is where most billing teams get the tradeoff backwards: they treat the seam as a one-time integration cost instead of a recurring tax on every schema change and every pricing update from then on.

Reconciliation at that seam tends to look the same everywhere. The metering system holds one event count, the billing system invoices a different one, and the causes are usually the same pipeline failures and timing mismatches already described, just surfacing now at the point where the two outputs get compared instead of at their source. Manual reconciliation eats roughly one to three days of a finance or engineering team's month, and by the time the discrepancy turns up, the incorrect invoices have already gone out, and customers have already paid them or disputed them.

The exposure isn't purely operational, either. The Anti-Fraud Collaboration's analysis found that between 2021 and 2024, 43% of SEC accounting fraud cases involved revenue recognition, and reconciliation failure sits directly upstream of that kind of exposure.

Event sourcing offers the clearest architectural answer. Storing every state change as an immutable, append-only event creates a full audit trail from the raw event to invoiced revenue, and that trail turns a discrepancy investigation from a forensic scramble into something closer to a straightforward query. But the integration burden doesn't disappear just because the audit trail exists: every schema change on the metering side, every pricing rule update on the billing side, forces a re-validation of the seam between the two systems. Companies running fragmented billing codepaths often spend significant time each month reconciling outputs before they can even close the books, and accurate forecasting isn't possible when the metering layer and the invoicing layer don't agree on the same underlying numbers to begin with.

What closing these gaps requires from billing infrastructure

Each root cause traces to a specific infrastructure gap, and each gap has a specific fix. Event loss calls for idempotent ingestion with configurable retention and full replay, built to capture events at millisecond speed without dropping them under back-pressure. Aggregation timing calls for real-time stream processing instead of batch, with billing logic applied as events arrive rather than reconciled at month-end. Dimension complexity calls for a pricing engine that can model tokens, GPU-minutes, call minutes, credits, and outcome-based units at the same time, without a custom code path for every new dimension a product adds. Configuration drift calls for pricing changes that product and finance teams can execute directly, without opening an engineering ticket, against a single system of record for contract terms, rates, and discounts.

The reconciliation gap exposes the real mistake causing all of this: treating two-system architecture as a reasonable tradeoff instead of the wrong default. Metering and invoicing need to run on the same engine, a single system in place of two vendors held together by a seam someone has to maintain forever. Every fix listed above, except this one, is a patch on a system that still has two sources of truth arguing with each other once a month. The only fix that actually closes the reconciliation gap is removing the seam.

Prepaid credit wallets and postpaid invoicing aren't separate paradigms anymore, whatever the market's vendor categories suggest. AI and enterprise products routinely need both running on the same customer account at the same time, and a platform treating them as two distinct billing flows just reintroduces the reconciliation work it was supposed to eliminate.

Real-time spend visibility follows directly from closing these gaps, and it is the thing that decides whether customers trust their invoices. It's the thing that decides whether customers trust their invoices. Customers who can watch their own consumption in-flight don't get blindsided by a bill; companies that can't offer that visibility absorb support costs and churn that, over time, cost more than the infrastructure they were avoiding buying in the first place. On-premises deployment requirements disqualify a fair share of the category outright, since enterprises with data-residency or sovereign cloud obligations rule out any billing infrastructure that can't run where their data actually lives, and that elimination happens before evaluation even starts.

Building metering and billing in-house costs months of engineering time up front and creates a maintenance burden that never really ends. The true cost of open-source billing infrastructure is the team that has to own, upgrade, and debug it indefinitely, month after month, for as long as the company runs it. It's the team that has to own, upgrade, and debug it indefinitely, month after month, for as long as the company runs it. The 1 to 5% of ARR in leakage cited earlier is what it costs to get this wrong, and none of it is inevitable. It's the price of running two systems where one would do.

Sources

  1. Usage-Based Pricing for SaaS and AI: Your Complete Guide
  2. The Great SaaS Price Surge of 2025: A Comprehensive Breakdown of Pricing Increases. And The Issues They Have Created for All Of Us.
  3. billingplatform.com
  4. Building a Usage-Based Billing Pipeline: Metering Events, Idempotent Aggregation, and the Stripe Meter API Architecture That Handles Millions of Events Without Losing a Cent — MVP Factory
  5. lsvp.com
  6. withorb.com
Filed underReconciliation

More in Reconciliation