Skip to content
Metricsjar

Article · Updated August 2026

Track revenue across Stripe, app stores and multiple products

Editorial cover: separate source ledgers feeding one reconciled revenue view

One revenue view should not flatten Stripe, app-store and product ledgers into one unexplained total. Reconcile each source first, then normalize the measures that are genuinely comparable.

Keep separate columns for:

Fictional cross-source reconciliation keeping gross, proceeds and MRR distinct

Choose the reporting basis

MeasureQuestionTiming
Gross salesWhat did customers purchase?Transaction event
Proceeds/net receiptsWhat remains after defined deductions?Source estimate/finalization
Cash collectedWhat settled or paid out?Payment/payout timing
MRRWhat is the normalized value of active recurring subscriptions?Subscription state
Recognized revenueWhat revenue belongs to this accounting period?Service/performance obligation

Stripe documents that revenue recognition can defer subscription invoice line items across their service periods (Stripe). That is different from cash and MRR.

Build a source register

SourceAccounts/productsCurrencyAuthoritative forOwner
StripeWeb SaaS, two accountsUSD/AUDCustomers, invoices, subscriptions, payments, payoutsFinance/founder
App Store ConnectiOS appStore currenciesApple transactions, proceeds, subscription stateFounder
Play sourceAndroid appStore currenciesGoogle transactions and payoutsFounder
RevenueCatCross-platform subscription viewDisplay currencyEntitlements and normalized subscription analyticsProduct/founder

Record account IDs, project/product mappings and timezone. Never rely on display names alone.

Reconcile every source independently

For each source and period:

  1. confirm the account and currency;
  2. export or query transactions;
  3. remove sandbox/test activity;
  4. classify purchase, renewal, refund, dispute and fee;
  5. tie transaction totals to source reports;
  6. tie payouts to the cash ledger separately;
  7. document late events and adjustments.

Only after this source-level check should values enter the combined view.

Normalize products and customers

Create mapping tables:

Source product IDCanonical productBilling intervalRevenue class
price_web_pro_monthlyAcme ProMonthlyRecurring
ios.acme.pro.yearlyAcme ProAnnualRecurring
android_acme_lifetimeAcme LifetimeOne-timeNon-recurring

Keep a separate customer bridge where lawful and available:

Product accountStripe customerRevenueCat app userStore transaction
acct_123cus_…acct_123original transaction ID

Do not deduplicate people from weak personal attributes. Report unknown cross-platform identity when no stable mapping exists.

Normalize MRR deliberately

Stripe defines MRR as the monthly-normalized value of active and past-due subscriptions, excluding trials, taxes, free plans and—in its standard MRR—metered products. It allows configuration of discount treatment and when subscribers become active (Stripe).

Write your policy:

Do not call this cash revenue.

Multiple Stripe accounts

Stripe Organizations can provide consolidated balance and payout-reconciliation reports across enabled accounts, with filters for accounts, time period and settlement currency (Stripe). Consolidated financial reports do not remove the need for product and MRR definition alignment.

When accounts settle in different currencies, retain the source amount and currency, then add a reporting-currency amount with the rate source and date. Do not sum currency symbols.

App stores and web revenue together

RevenueCat Web can place web purchases alongside mobile-store purchases and supports integrations with RevenueCat Billing, Stripe Billing and Paddle Billing (RevenueCat). Whether you use it or another layer, preserve which billing engine owns products, renewals, taxes and customer management.

For every combined row, keep:

Create a canonical transaction table

The normalized layer should preserve the source record rather than replace it.

FieldPurpose
source and source_account_idTrace the owning ledger
source_transaction_idDeduplicate and link back
canonical_product_idGroup equivalent products
product_typeRecurring, one-time or usage
customer_bridge_idJoin only when defensible
event_typePurchase, renewal, refund, dispute, fee
transaction_atCustomer transaction timing
service_period_start/endRecognition and subscription context
gross, tax, fee, refund, proceedsKeep bases separate
original_currency and amountPreserve source truth
reporting_currency and rateExplain normalization
is_testExclude sandbox activity explicitly

Use (source, source_account_id, source_transaction_id, event_type) or another source-supported key for idempotent imports. A retry should update or ignore the record, not create a second sale.

Reconcile cash separately from activity

A payout can contain many transactions, fees, refunds and adjustments. Build two checks:

  1. transaction activity reconciles to the source’s activity report;
  2. payouts reconcile to the bank or cash ledger.

Do not force daily transaction totals to equal daily bank deposits. Payout schedules and settlement delays make that expectation false.

Allocate revenue by product without losing source totals

First reproduce the source total. Then group by canonical product.

Canonical productStripe webApp StorePlay StoreCombined proceeds
Acme Pro$4,900$3,100$1,740$9,740
Acme Teams$2,930$1,140$795$4,865
Source total$7,830$4,240$2,535$14,605

These fictional allocations tie exactly to the source proceeds in the worked example. If the product table does not tie, leave an “unmapped” row visible rather than silently dropping transactions.

Handle late events and restatements

Refunds, disputes, store proceeds and subscription state can arrive after the initial report. Choose a policy:

For an operating dashboard, restating recent periods is often clearer than pretending the first value was final. Accounting policy should be confirmed with the appropriate professional; this article is an analytics method, not accounting advice.

Data-quality checks for the combined view

Run:

Surface failures beside the dashboard. A combined total with a stale store source should be marked partial.

A fictional monthly view

SourceGrossRefundsFeesProceedsEnding MRR
Stripe web$8,400−$300−$270$7,830$6,900
App Store$5,200−$180−$780$4,240$3,950
Play Store$3,100−$100−$465$2,535$2,300
Combined$16,700−$580−$1,515$14,605$13,150

The fictional MRR does not reconcile to monthly proceeds because they are different measures. Annual cash transactions, one-time purchases, renewal timing and fees all contribute to the difference.

Add an MRR bridge:

MovementAmount
Beginning MRR$12,600
New+$1,100
Expansion+$260
Reactivation+$90
Contraction−$180
Churn−$720
Ending MRR$13,150

Common reconciliation failures

Build or buy the reporting layer

Use source exports or a spreadsheet when the products and accounts are few, the process is stable and one owner accepts the maintenance. Use a warehouse/BI layer when flexible finance and product analysis justify modeling work. Use a subscription analytics platform when entitlement and recurring lifecycle are the main job. Use a thin founder-reporting layer when definitions already exist and the repeated need is one operating view.

No layer removes the need to preserve source IDs and revenue bases. It changes who owns collection, refresh, mapping and presentation.

Frequently asked questions

Should Stripe or RevenueCat be the source of truth?

Stripe owns Stripe billing events; app stores own their transactions; RevenueCat can own cross-platform entitlement logic and normalized charts. Name the source per measure rather than selecting one universal truth.

Can I combine several Stripe accounts?

Stripe Organizations support consolidated financial reports for eligible accounts. Product analytics and MRR still require aligned mappings and definitions.

Why does combined MRR not match monthly revenue?

MRR normalizes active recurring subscriptions. Revenue records transactions in the period and can include one-time or annual purchases. They should not be expected to match.

How should currencies be handled?

Retain original amounts and currencies. Add a reporting-currency value using a documented rate source, rate date and policy.

What belongs on the founder view?

Show source health, proceeds or cash on the chosen basis, the MRR bridge and product/source mix. Link to detailed transaction and accounting reports.

Sources

Keep reading