Attribution & acquisition quality

Acquisition data in GA4 is only as good as the channel assignment. If a high share of your sessions ends up as Direct or (unassigned), GA4 doesn't know where the traffic came from - and that's exactly what the Auditor uncovers.

What does the app check?

The acquisition checks evaluate four layers:

  1. Channel distribution - how large is the share of Direct and (unassigned)?
  2. Google Ads click quality - is gclid correctly classified as Paid Search?
  3. Self-referrals - does your own domain show up as a referrer?
  4. Payment providers - are bank and payment domains measured as a source instead of being correctly excluded?

When is a check triggered?

Check Threshold
Direct share <20 % = Green, 20-35 % = Yellow, >35 % = Red
Unassigned share <5 % = Green, 5-10 % = Yellow, >10 % = Red
gclid mismatch gclid present, but channel ≠ Google Ads = Warning
Payment self-referrals >2 % of sessions = Warning
UTM error utm_source=(direct) or utm_medium=(none) = Red

The thresholds come from app/services/ga4_api_check_service.py:_run_data_checks() as well as from the SQL queries acquisition_channels.sql, channel_distribution.sql, self_referrals.sql and payment_referrals.sql.

Common causes

  • Missing UTM parameters - campaigns without utm_source or utm_medium, untagged email links, social ads measured back as organic.
  • gclid drop - cross-domain redirect without gclid pass-through, payment redirect breaks the parameter, referral exclusion list too short. More background in the blog post When the gclid is there - and Google Ads still isn't.
  • Self-referrals - your own subdomain (shop.example.com) is not entered as a self-referral domain in GA4. Details in the blog post Self-referrals - when your own domain shows up as a source.
  • Payment referrers - PayPal, Klarna, Stripe, Adyen, SOFORT, Giropay and co. end up as a source. Solution: maintain the referral exclusion list. The blog post Bank and payment providers as referrers has the full list of detected providers.
  • AI traffic - visits from ChatGPT, Gemini and co. have been landing in their own "AI Assistants" channel since May 2026. Part of them arrive without a referrer and inflate the Direct share. Background in the blog post Measuring AI traffic in GA4.

How to proceed

  1. Check the channel distribution in the dashboard - compare the Direct/Unassigned share against the thresholds.
  2. For gclid warnings, open the Google Ads attribution section (create_google_ads_attribution_section) - it shows specific sessions with a gclid that were not counted as Google Ads.
  3. Open the self-referrals section (create_self_referrals_section) when your own domain appears as a referrer.
  4. Enter the payment providers in the GA4 property under Property Settings → Data Streams → Configure tag settings → Define internal traffic / List unwanted referrals.
  5. For UTM gaps, review your campaign tagging discipline - without clean tagging, every attribution remains a guess.