Why revenue numbers never match

Revenue discrepancies aren't bugs—they're inevitable features of how modern companies operate.

Different definitions

Stripe reports what was actually charged. It includes prorations, refunds, disputes, and currency conversions. MRR is calculated from active subscriptions at a point in time.

Your database might track "contracted revenue" based on subscription records—what customers agreed to pay, regardless of what was invoiced or collected.

The CRM shows deal values, which might include one-time fees, multi-year contracts counted upfront, or pipeline optimism that never closed.

Different timing

Stripe updates in real-time. Your database might batch-process subscription changes overnight. The CRM updates when sales remembers to move deals to closed-won. Comparing them at the same timestamp compares different realities.

Different boundaries

Which customers count? Stripe sees everyone with a payment method. Your database might exclude free trials. The CRM might include partner deals that don't flow through Stripe at all.

The cost of discrepancies

When revenue numbers don't match, someone has to reconcile them manually. Usually before an important meeting. Usually under time pressure.

The real costs:

  • Hours of forensic work tracing individual transactions across systems
  • Delayed decisions while waiting for "the real number"
  • Lost credibility when different teams present different figures
  • Audit risk when you can't explain the differences
  • Compounding errors when discrepancies go unnoticed and grow

How Eru reconciles revenue

Understand what each system means

Eru's AI agent explores each data source to understand its specific definition of revenue. Not a generic "Stripe connector"—your actual implementation. It learns which fields represent MRR, ARR, one-time charges, and discounts. It maps the relationships between subscriptions, invoices, and payments.

Establish clear mappings

Once Eru understands each system, it creates explicit mappings. "MRR in Stripe equals the sum of active subscription amounts, minus scheduled cancellations, converted to USD at daily rates." These mappings are documented, versioned, and auditable.

Run continuous checks

Eru schedules Truth Checks that compare revenue across systems with defined tolerances. "Stripe MRR should match database MRR within 1%." When the check fails, you get an alert with the exact discrepancy and where to look.

Explain the differences

Not all discrepancies are errors. Some are timing differences. Some are definitional. Eru tracks known variances so you can distinguish expected differences from actual problems.

Example: Monthly revenue check

Truth Check: Monthly Revenue Reconciliation Schedule: Daily at 6am UTC Tolerance: 1% or $500, whichever is greater Sources: - Stripe API: sum(subscriptions.plan.amount) where status=active - Database: sum(mrr_cents)/100 from subscriptions where cancelled_at is null - HubSpot: sum(deal.amount) where stage=closed_won and close_date in current_month Expected: All three within tolerance Alert: #finance-ops on failure Evidence: Include top 10 largest discrepancy contributors

What you get

Single source of truth

One documented definition of revenue that everyone uses. No more "which spreadsheet has the real number?"

Early warning

Catch discrepancies when they're small. A 2% drift caught early is easier to fix than a 15% surprise at quarter-end.

Audit trail

Every check execution is logged with full evidence. When the auditor asks how you calculated revenue, you have receipts.

Time back

Stop spending Friday afternoons reconciling spreadsheets. Let Eru do the tedious comparison work.

Common reconciliation checks

Related

Stop reconciling manually

Eru runs continuous checks so discrepancies never surprise you.