ChatGPT + AI Assistants Attribution Fix: How to Tag, Detect, and Report ‘Dark’ AI Referral Traffic in GA4
Mika Sandgrove | | 4 min read
Intro: The ‘dark’ AI referral problem (and the fix in one sentence)
“Dark” AI referral traffic is sessions sourced from AI assistants that arrive without referrer data and get classified as Direct/(direct)/(none) (or sometimes Unassigned).
If you’re seeing unexplained Direct spikes and you suspect ChatGPT (or similar assistants) is involved, you’re usually not losing visits—you’re losing attribution. GA4 can’t reconstruct a missing referrer after the fact.
The fix is measurable: tag AI-assistant links with consistent UTMs, validate GA4 records them as session attribution, then report them in a dedicated Exploration (and optionally a narrow channel group). Done right, sessions move out of Direct into a traceable bucket without breaking your core channel logic.
What’s actually happening: why ChatGPT/AI assistant clicks go “dark” in GA4
When a click lands without a referrer, GA4 buckets it as:
- Default Channel Group: Direct
- Session source/medium:
(direct) / (none)
When I run GA4 audits, AI-assistant traffic goes dark for a few repeatable reasons:
- In-app browsers / webviews: Opens in a context that doesn’t reliably pass referrer.
- Privacy + referrer policy behavior: Platforms may reduce or withhold referrer data.
- Redirect chains: Shorteners and tracking hops can drop referrer and/or query parameters.
Symptoms: Direct rises while Referral dips, and source/medium looks inconsistent when you compare session vs user acquisition dimensions.
Required fix: tag AI assistant links with a consistent UTM standard
UTMs work because they override missing referrer attribution. GA4 reads campaign parameters from the landing URL and assigns session source/medium from them.
Use a minimal convention:
utm_source= assistant name (canonical)utm_medium=ai_assistant(exact match)utm_campaign= use-case bucket
Recommended standard:
utm_medium=ai_assistantutm_source=chatgpt(orclaude,gemini, etc.)utm_campaign=content_share|support_reply|outreach
Examples:
https://www.example.com/blog/ga4-attribution?utm_source=chatgpt&utm_medium=ai_assistant&utm_campaign=content_sharehttps://www.example.com/help/reset-password?utm_source=chatgpt&utm_medium=ai_assistant&utm_campaign=support_replyhttps://www.example.com/demo?utm_source=chatgpt&utm_medium=ai_assistant&utm_campaign=outreach
Governance that keeps reporting usable: lowercase only, no spaces (use underscores), one canonical utm_source per assistant, and one internal list of allowed values.
Verify and detect in GA4: confirm AI assistant traffic is being captured
You’re checking two things: UTMs survive the first hit, and GA4 records them as session-level attribution.
Quick sanity test:
- Click a tagged link yourself (desktop and mobile if you can).
- In Reports → Realtime, confirm the visit appears.
Then validate where it matters:
- Go to Reports → Acquisition → Traffic acquisition.
- Set the dimension to Session source/medium.
- Look for
chatgpt / ai_assistant.
One-pass QA checklist: confirm the landing URL still has UTMs after load, ensure utm_medium=ai_assistant shows as Session medium, and verify redirects (non-www→www, locale routing, trailing slash rules) don’t strip parameters. Server logs or user-agent patterns can help debug, but they won’t replace UTMs for attribution.
Report it cleanly: an “AI Assistants” view without breaking channel logic
Session attribution reporting lives and dies by the dimension you pick.
Use Session source/medium (or Session source + Session medium). Avoid building this view on First user source/medium, which is first-touch acquisition and will often disagree with how a given session arrived.
Saved Exploration:
- Explore → Blank.
- Dimensions: Session medium, Session source, Landing page + query string (or Page path).
- Metric: Sessions.
- Filter: Session medium exactly matches
ai_assistant. - Rows = Session source; add Landing page as a breakdown when you need detail.
Optional channel group: Admin → Data display → Channel groups, add a rule where Session medium equals ai_assistant. Keep it narrow so you don’t reclassify email/paid traffic.
Adopt the UTM standard first, then test one tagged link end-to-end, then save and share the Exploration filtered on Session medium = ai_assistant. Expect Direct to drop and AI Assistants to rise because you’re reclassifying sessions you already had, not creating new demand.
Sources
Article author
Mika Sandgrove
Mika Sandgrove is an SEO writer and independent SEO consultant with more than three years of experience creating and optimizing content for search. He runs his own SEO practice, helping businesses improve their organic visibility through SEO strategy, content optimization, and technical and on-page SEO services. Much of his work comes through freelance marketplaces and online client platforms, where he works with businesses across different industries and markets. Mika primarily writes about SEO, search visibility, and practical optimization strategies, and is increasingly exploring Answer Engine Optimization (AEO) and how businesses can adapt their content for AI-powered search experiences.

