Traffic-light checks: data quality from BigQuery

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_box shows a short hint: what's it about, why is it a problem? Two to three sentences at most.
  • render_solution_accordion expands 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 purchase events, a custom-code bug in GTM.
  • session_start missing → 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 gclid is there - and Google Ads still isn't.

How to proceed

  1. In the dashboard, switch to the traffic-light tab and look for red/yellow cards.
  2. For each section, read the hint box - it names the symptom concretely.
  3. Expand the solution accordion and work through it step by step.
  4. For e-commerce topics, jump straight to E-commerce checks in detail
  • the funnel logic and its thresholds are explained there.
  1. For data-quality topics (PII, duplicates, missing items), read on in Event quality & PII notes.