E-commerce is the area where even small tracking gaps lead to big revenue gaps in your reporting. The Auditor checks this on two levels: live (via the GA4 Data API) and in depth (via BigQuery).
What does the app check?
Four key topics sit behind the e-commerce checks:
- Required events present -
view_item,add_to_cart,begin_checkoutandpurchaseall have to be measured. - Funnel completion - how many sessions that fire a
begin_checkoutactually make it all the way topurchase? - Duplicates - are purchases accidentally being recorded twice?
- Transaction attribution - are purchases assigned to clean channels,
or do they land disproportionately on
DirectandUnassigned?
When does a check trigger?
Straight from the code:
| Check | Threshold |
|---|---|
| Required events | all four present = green; one missing = red |
Funnel completion (purchase / begin_checkout) |
>50 % = green, 20-50 % = yellow, <20 % = red |
| Duplicate transactions | >1 % duplicate purchase = warning |
| Direct/Unassigned on purchases | <15 % = green, 15-30 % = yellow, >30 % = red |
The logic lives in app/services/ga4_api_check_service.py:_run_data_checks()
(required events + attribution) and in the SQL queries
ecommerce_funnel.sql,
ecommerce_transactions.sql
and duplicate_events.sql.
Common causes
- Missing
purchaseevents → checkout runs on a subdomain without tracking, the payment redirect URL clears cookies before the trigger, headless/no-JS checkout. - Duplicate transactions → reload of the thank-you page, a popup workflow fires the trigger multiple times, faulty dedup logic in GTM, a parallel Universal Analytics implementation is still running. Deeper background in the blog post Duplicate purchases in GA4.
- Incomplete item data →
priceanditem_idare passed as(not set)because dynamic fields never make it into the dataLayer. - High Direct share on purchases → payment provider as referrer
(see the blog post Banks and payment providers as referrers)
or cross-domain tracking without a
_gacookie pass.
How to proceed
- Required events first - if
purchaseis missing, any further analysis only pays off once the tracking is running. - Open the funnel section
create_ecommerce_funnel_section- it shows the drop-offs betweenview_item→add_to_cart→begin_checkout→purchaseas a Sankey/bar chart. - Check the duplicates section
create_duplicate_transactions_section- it lists the concrete transaction IDs that fired more than once, including revenue impact. - Cross-check attribution with Attribution & acquisition quality.
- For item-data problems, read on in Event quality & PII notes
- that's where the PII and
(not set)diagnosis lives.