Sample teardown

Anatomy of a GA4 audit

What an audit actually finds, and how it's reported — walked through end to end on a representative example.

A representative, anonymized example.

This teardown is a composite of the issues we routinely find — not a specific client, and every number is worked-example arithmetic, not a claimed result. We publish it because you should see the shape and rigor of the work before you pay for it.

The example

A self-serve B2B SaaS at roughly $8M ARR (composite). Stripe checkout, paid acquisition on Google and Meta, ~40% of traffic from the EEA. The trigger for the audit is the classic one: GA4, Stripe, and the ad platforms all report different numbers, and nobody can say which is right.

2

Critical findings

2

Major findings

1

Minor finding

The findings

Five failures, diagnosed and fixed

Each finding is reported the way a real audit reports it: symptom, diagnosis, impact, fix.

Critical

F-1Purchases fire twice — GTM tag and native integration in parallel

Symptom

Reported purchases run consistently higher than the order platform, and the gap grows on days with more traffic.

Diagnosis

GTM Preview and DebugView show two purchase events per checkout: one from the GTM container's GA4 event tag, one from the platform's built-in GA4 integration that nobody remembered was still switched on. A BigQuery count of purchase events per transaction_id confirms it — the same order IDs appear twice. GA4's transaction_id deduplication is best-effort, and it does not reliably reconcile hits arriving from two independent sources.

Impact — in this example

In this composite example: 1,000 real orders produce roughly 1,800 reported purchases once the second pipeline and confirmation-page reloads stack up — revenue reads nearly double, and every ROAS decision made on it inherits the error.

The fix

Run exactly one pipeline. Disable the platform's native GA4 integration or the GTM tag — never both — and add a transaction_id guard so confirmation-page reloads can't re-fire the event. Then re-verify per-transaction counts in BigQuery.

Full write-up: GA4 duplicate transactions inflating revenue

Critical

F-2Consent Mode v2 defaults fire after the Google tag

Symptom

EU conversion counts look implausibly weak versus non-EU, and Google Ads reports fewer conversions than GA4 for the same campaigns.

Diagnosis

The consent default snippet lives in a tag fired on Page View — after the Google tag has already sent its first hit. On every new EEA visit, the first pageview (and any early conversion) leaves without consent state. Only two of the four v2 signals are set, so ad_user_data and ad_personalization are missing entirely, degrading Google Ads measurement for EEA traffic.

Impact — in this example

In this example, with roughly 40% of sessions from the EEA, a meaningful slice of paid-traffic conversions never enters measurement at all — the channel looks weaker than it is, and budget quietly shifts away from what's actually working.

The fix

Move consent defaults to GTM's Consent Initialization trigger so they run before anything else, set all four v2 signals, verify the CMP's accept AND reject paths in preview, and decide deliberately between basic and advanced consent mode.

Full write-up: Consent Mode v2: what changes for your GA4 data

Major

F-3No BigQuery export — and it can't be backfilled

Symptom

Every deeper question — deduplication, reconciliation, cross-device behavior — dead-ends at the GA4 UI's sampling and thresholding.

Diagnosis

The property has never had its BigQuery export enabled. There is no raw, unsampled record of events, so claims like 'revenue is double-counted' can be suspected but not proven, and historical data before the export is switched on is gone for good.

Impact — in this example

In this example the audit itself is constrained: without raw events, quantifying the duplicate-purchase rate requires manual test orders instead of a five-minute query. Every future analysis inherits the same ceiling until the export exists.

The fix

Enable the daily (and if volume justifies it, streaming) export to BigQuery immediately — the daily export is free to enable and bills only for storage and queries; streaming adds a small per-GB fee. Then stand up the basic data-quality queries: duplicates per transaction_id, daily event-volume anomalies, and a GA4-vs-platform revenue reconciliation.

Full write-up: Setting up the GA4 BigQuery export

Major

F-4Payment gateway returns as a referral and claims the revenue

Symptom

A payment provider's domain ranks among the top 'referral' sources, and paid campaigns under-report conversions they clearly drove.

Diagnosis

Checkout redirects through the payment gateway; because the gateway's domain was never added to GA4's unwanted-referrals list, the return registers as a new referral traffic source — and last-non-direct-click attribution hands the purchase's credit to the gateway instead of the campaign that actually won the customer. (If the payment step outlasts the 30-minute session window, the purchase can also land in a fresh gateway-attributed session.)

Impact — in this example

In this example the distortion is structural rather than a percentage: the channel report shows a payment processor as a top revenue 'source' while the campaigns that actually won the customer are marked weaker — precisely backwards for budgeting.

The fix

Add the gateway and SSO domains to GA4's unwanted referrals, verify the session no longer splits on a test order, and re-check attribution on the following week's purchases.

Full write-up: Unassigned traffic in GA4 reports

Minor

F-5GA4 revenue trails Stripe by a persistent, unexplained gap

Symptom

Finance reconciles against Stripe; marketing reports from GA4 — and the two never agree, so neither team trusts the other's number.

Diagnosis

After the duplicates are fixed, a residual gap remains: client-side tracking loss from Safari's ITP, ad blockers, and consent declines means GA4 will always see fewer purchases than the payment processor. That part is physics, not misconfiguration — what's missing is that nobody has measured the gap, explained it, or agreed on a tolerance.

Impact — in this example

In this example the gap itself is normal; the cost is organizational — hours lost re-litigating 'whose number is right' in every reporting cycle, because the divergence was never documented.

The fix

Reconcile weekly in BigQuery against the platform of record, document the expected gap and its causes, and agree on a tolerance. If recovering more of the loss matters commercially, evaluate server-side tagging — as an investment decision, not a reflex.

Full write-up: GA4 missing purchases from Safari & iOS

The deliverable

What you'd actually receive

A findings document in the shape you just read — every issue severity-ranked with its evidence, business impact, and fix — plus a prioritized remediation plan sequenced by impact × effort, and a walkthrough call with the practitioner who did the work.

The standard behind it is public: all 42 inspection points, published in full.

FAQ

About this sample

Want this run on your actual setup?

Start with the free instant audit — it checks your site in about 20 seconds. If the findings warrant a full teardown, book a call.