The traffic-light checks in GA4 Auditor read the GA4 BigQuery export tables
(events_YYYYMMDD, events_intraday_YYYYMMDD) and evaluate data quality
at the event level. They are the deep-dive stage after the
Live Check: what the GA4 API only sees in summary,
the traffic-light checks break down all the way to individual events.
What does the app check?
The traffic-light checks group the BigQuery SQL queries under
app/queries/checks/ into thematic sections:
- Events - event errors, duplicates, values
- Sessions - consistency, gap analysis, missing
session_start - Acquisition - channels, self-referrals, payment referrers
- E-commerce - funnel, transactions, attribution, duplicates
- Content - page quality, content groups, site search, User-ID
Each section returns a traffic-light status (Pass / Warning / Fail), a
short explanation in a hint box (render_hint_box) and optionally an
expandable solution guide (render_solution_accordion).
When is a check triggered?
Examples of thresholds from the code:
| Check | Threshold |
|---|---|
| E-commerce funnel errors | >0 errors = Red, 1-3 issues = Yellow, 0 = Green |
| Session consistency | <5 % without session_start = Green, 5-15 % Yellow, >15 % Red |
| Event duplicates | >5 % = Warning |
| gclid without attribution | >10 % of Google Ads sessions = Warning |
The matching SQL logic lives, for example, in
ecommerce_funnel.sql,
session_consistency.sql,
event_quality.sql and
acquisition_channels.sql.
Hint box vs. solution accordion
In the dashboard, each section uses two standardized UI building blocks:
render_hint_boxshows a short hint: what's it about, why is it a problem? Two to three sentences at most.render_solution_accordionexpands into a step-by-step guide: which configuration to adjust, which spot in the code, which follow-up audit question to ask?
This keeps the dashboard status scannable without losing the technical details.
Common causes
- Funnel jumps → missing checkout events, items without IDs or prices
in the
purchaseevents, a custom-code bug in GTM. session_startmissing → the GTM tag only fires after the session timeout, server-side tagging with too much latency.- gclid not attributed → manual UTM parameters override the
auto-tagging click, a cross-domain jump loses the parameter - see the
blog post When the
gclidis there - and Google Ads still isn't.
How to proceed
- In the dashboard, switch to the traffic-light tab and look for red/yellow cards.
- For each section, read the hint box - it names the symptom concretely.
- Expand the solution accordion and work through it step by step.
- For e-commerce topics, jump straight to E-commerce checks in detail
- the funnel logic and its thresholds are explained there.
- For data-quality topics (PII, duplicates, missing items), read on in Event quality & PII notes.