Revenue discrepancy reconciler
"GA4 says 41k, Ads says 47k, the shop says 52k" is normal. This skill turns the gap into a bridge of named causes, so what is left unexplained is small enough to investigate.
When to use
- When a stakeholder asks which revenue number is right.
- Monthly, before reporting ROAS to anyone.
Input
For the same date range: backend orders (id, created time, status, total, tax, shipping, discounts, refunds), GA4 purchase events (transaction_id, value, tax, shipping, date), and Google Ads conversions and conversion value by conversion date and by click date. Property and account time zones and currencies. Consent mode setup.
The bridge, in this order
- Definitions. Backend gross incl. VAT and shipping vs GA4
value(often ex tax/shipping) vs Ads value (whatever the tag sends). Restate all three on one basis first. - Cancellations, refunds, test orders. Backend may net them; GA4 only if
refundevents are sent; Ads only via adjustments. - Time zones and date cut. Store in UTC, GA4 in Europe/Prague, Ads in another zone moves orders across the day boundary.
- Ads counts by click date, GA4 by event date. A purchase on 2 Sep from a 28 Aug click sits in August in Ads (default columns).
- Attribution scope. Ads counts conversions it can claim in its window, including view-through and cross-device; GA4 attributes across all channels; backend has all orders, including ones no tool attributes.
- Consent mode and blockers. Denied consent removes events from GA4 observed data; Ads may add modeled conversions. Report both effects separately.
- Duplicates and gaps. Repeated or empty
transaction_id, payment-gateway redirects losing the session, missing currency. - Currency conversion at different rates or days.
Rules
- Each bridge line needs a number from the input. Where data is missing, the line says "not quantified" and why.
- Never pick one source as "correct"; say which one to use for which question (finance: backend; channel mix: GA4; bidding: Ads).
- Read-only toward all accounts.
Output format
Backend gross, Sep 1–30 52 340
− VAT and shipping −9 870
− cancelled / refunded −2 110
= backend net comparable 40 360
GA4 purchase value 37 920 gap −2 440 (−6.0%)
consent/blockers (est. from order match 93.9%) ~ −2 300
unexplained −140
Ads (click date, incl. modeled) 43 150 higher: view-through + modeled, not quantified
License
MIT