Revenue and subscriptions
Why Firebase Revenue and App Store Connect Revenue Don't Match
Updated 2026-09-144 min read
Short answer
They measure different amounts at different moments. GA4's in_app_purchase records the purchase the app observed, converted to your property's currency. App Store Connect reports sales — what customers were billed — and proceeds, after taxes and Apple's commission, with refunds handled on Apple's side. Expect a gap: reconcile the number of transactions first and the amounts second.
A subscription app closes its month. GA4 shows $9,400 in purchase revenue, App Store Connect shows $8,700 in sales and $6,900 in proceeds, and the founder wants one number for the investor update. The honest answer is that there are three, and each is right about something different.
What each system is counting
| GA4 (Firebase) | App Store Connect | |
|---|---|---|
| Recorded from | The app, when the purchase event is logged | Apple's transaction records |
| Amount | The price of the purchase the app saw, in the property currency | Sales: amount billed to customers. Proceeds: customer price minus taxes and Apple's commission |
| Taxes | Whatever the store price included | In sales only where the App Store price includes tax |
| Refunds | Not deducted automatically for App Store purchases | Accounted for in Apple's reports |
| Renewals | Only where collected as app_store_subscription_renew | Included in Apple's reports |
| Sandbox and test purchases | Ignored for in_app_purchase | Not included |
Why the totals drift apart
- Commission and taxes: proceeds are the customer price minus applicable taxes and Apple's commission, and the commission rate depends on the program you are in and, for subscriptions, on how long the subscriber has been paying
- StoreKit 2: Firebase logs StoreKit 1 purchases automatically, but purchases made with StoreKit 2 have to be logged with Analytics.logTransaction(). Without that call they never reach GA4
- Double counting: GA4's purchase figures include both purchase and in_app_purchase events, so an app that also logs its own purchase event for the same transaction counts the sale twice
- Refunds: Apple's reports account for refunded purchases; GA4 keeps the original iOS purchase
- Other platforms in the property: Google Play purchases from an Android stream are added to the same GA4 total
- Currency and dates: GA4 converts amounts to the property currency and dates them in the property time zone, while Apple's reports use their own dates and exchange rates
The ordering matters when you investigate. Commission, tax and currency explain a gap in amounts. StoreKit 2, double counting, refunds and other platforms explain a gap in the number of transactions — and those are the ones that mean your analytics is wrong.
How to reconcile them
Filter GA4 to the iOS stream
Restrict purchase figures to the iOS app before comparing anything with App Store Connect.
Compare transaction counts before amounts
Count in_app_purchase events for the same days as App Store Connect's in-app purchase and subscription units. If counts agree and amounts do not, the difference is price, tax, currency or commission. If counts disagree, the difference is in the logging.
Check the StoreKit version
If the app uses StoreKit 2 and never calls Analytics.logTransaction(), GA4 is missing those purchases — often all of them.
Look for a second revenue event
Search the code for purchase events logged after a successful transaction, and break GA4 revenue down by event name. purchase and in_app_purchase side by side for the same sales means double counting.
Compare with sales, not proceeds
GA4 records what the purchase cost, so it lines up with what customers were billed. Proceeds are what you are paid and will always be lower.
Careful: Do not "fix" the gap by scaling GA4 revenue to match Apple. Use App Store Connect for money and GA4 for behaviour: which paywall, placement or cohort led to the purchase.
What goes wrong if you misread it
- Reporting GA4 revenue as income overstates what the business earns by the commission, taxes and refunds
- A move to StoreKit 2 looks like a sudden collapse in revenue when only the logging stopped
- A duplicate purchase event doubles the conversion rate in every paywall analysis
- Comparing a combined iOS and Android GA4 total with App Store Connect makes iOS look better than it is
What each number is for
| Question | Use |
|---|---|
| How much did we earn? | App Store Connect proceeds, and Payments and Financial Reports for what was actually paid |
| How much did customers spend? | App Store Connect sales |
| Which paywall, placement or cohort converts? | GA4 purchase events, segmented |
| Is purchase logging working? | GA4 transaction counts against App Store Connect units, per platform |
How this looks in Appnaly
Appnaly keeps App Store figures and Google Analytics figures as separate sources instead of blending them into a single revenue number, because — as above — they count different things. Read money from the store, and use Analytics to understand which users and screens produced it.