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:
- Channel distribution - how large is the share of
Directand(unassigned)? - Google Ads click quality - is
gclidcorrectly classified as Paid Search? - Self-referrals - does your own domain show up as a referrer?
- 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_sourceorutm_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
gclidis 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
- Check the channel distribution in the dashboard - compare the Direct/Unassigned share against the thresholds.
- 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. - Open the self-referrals section (
create_self_referrals_section) when your own domain appears as a referrer. - Enter the payment providers in the GA4 property under Property Settings → Data Streams → Configure tag settings → Define internal traffic / List unwanted referrals.
- For UTM gaps, review your campaign tagging discipline - without clean tagging, every attribution remains a guess.