Why is my paid traffic showing as Direct?
Paid clicks land in Direct in GA4 when the click ID (gclid, msclkid, or fbclid) gets stripped between the ad click and the page load. The four most common causes: (1) intermediate redirects that don't preserve query parameters (link shorteners, email tracking, some affiliate platforms), (2) payment gateway redirects (Stripe, PayPal, Klarna) returning users without the original click ID, (3) manual UTMs added on top of auto-tagging which can override the click ID, and (4) browser-level click ID stripping in privacy-focused browsers.
The fix: audit your redirect chains and ensure every redirect preserves query parameters.
How auto-tagging works on each platform
Google Ads — gclid (and gbraid/wbraid)
When auto-tagging is enabled in Google Ads (default for new accounts), Google appends gclid=XXXX to the destination URL of every ad click. Google's GA4 ↔ Ads link uses this gclid to:
- Match the ad click to the resulting GA4 session
- Import Google Ads cost data into GA4
- Attribute conversions back to Google Ads campaigns
Privacy variants: gbraid for iOS app campaigns where ATT is denied, wbraid for iOS web campaigns. Both behave like gclid for attribution but provide privacy-preserving aggregated data instead of user-level granularity.
Microsoft Ads — msclkid
Microsoft Ads uses msclkid as its equivalent click ID. Auto-tagging is opt-in (not default) — must be enabled in Microsoft Ads account settings. Once enabled, msclkid forces a session into Paid Search classification regardless of explicit UTMs.
Meta Ads — fbclid
Meta uses fbclid for Facebook and Instagram ad clicks. Different mechanism: fbclid doesn't change GA4 channel classification (you still need explicit utm_medium=paid_social), but it enables Meta's Conversions API for first-party data passing back to Meta.
TikTok Ads — ttclid
TikTok's click ID. Like fbclid, doesn't change GA4 channel classification — needs explicit UTMs alongside.
LinkedIn Ads — li_fat_id
LinkedIn's first-party identifier for ad clicks, used for conversion API. Doesn't change GA4 attribution; needs explicit UTMs.
The core distinction: gclid and msclkid forcefully classify the channel; fbclid, ttclid, li_fat_id are first-party data passes that complement explicit UTMs without overriding them.
How click IDs get stripped
Six common breakage patterns:
1. Email platform link tracking
Mailchimp, HubSpot, Marketo, Klaviyo wrap outbound URLs in their tracking domains (click.email.example.com/track?u=...&dest=...). When the user clicks, they redirect through the platform before landing on your site. If the redirect doesn't preserve the original query parameters (gclid, fbclid), they're lost.
Fix: Configure email platforms to append-rather-than-replace query parameters. Most modern platforms support this — check the link tracking settings.
2. Link shorteners
bit.ly, ow.ly, t.co (Twitter's), and custom shorteners often strip query parameters from the destination URL. The shortened URL stores only the destination path, not the parameters.
Fix: Use shorteners that preserve query parameters (Bitly Pro supports this; free tier doesn't). Or never shorten URLs that contain click IDs — share the full URL.
3. Affiliate networks
Some affiliate networks (especially older ones — CJ, Rakuten LinkShare, Awin) redirect through their tracking domain to attribute the affiliate. Click IDs get stripped in the redirect.
Want to see whether attribution loss is already distorting your channel data?
Fix: Configure deep-link or first-party tracking on the affiliate network. Most modern affiliate networks now support this; older configurations may need manual update.
4. Payment gateway returns
Stripe, PayPal, Klarna, Afterpay, Affirm — when the user completes payment off-domain and is redirected back, the return URL typically doesn't carry the original gclid. The post-payment session is a new session attributed to the payment provider as referral.
Fix: Either pass the click ID through the payment flow as metadata (if your gateway supports it), or use server-side conversion tracking (Google Ads' offline conversion import) so the conversion attribution doesn't depend on the post-payment session being correctly attributed.
5. Single-page app navigation
In a SPA (React, Vue, Angular), client-side navigation can drop the click ID after the initial page load. The first page view captures it; subsequent in-app navigations may not. If the conversion event fires after several SPA navigations, the click ID is gone.
Fix: Ensure your GA4 implementation captures the click ID at first page load and stores it in a session variable, then includes it in conversion event parameters. GTM has a Cookie-based click ID variable that handles this pattern.
6. CDN or WAF stripping
Some CDN and WAF configurations strip query parameters from URL patterns they consider non-essential. CloudFlare, Akamai, and AWS WAF can be configured to do this.
Fix: Audit your CDN/WAF rules. Whitelist gclid, msclkid, fbclid, ttclid as protected parameters that should always pass through.
The conflicts between auto-tagging and manual UTMs
Adding manual UTMs alongside auto-tagged click IDs creates conflicts:
Google Ads conflict: With auto-tagging on, manually added UTMs override the auto-tagged source/medium classification. The session shows as medium=cpc from your manual UTMs, but the gclid linkage to Google Ads cost data may break — leaving you with sessions but no cost data.
The rule: With auto-tagging enabled, never add manual UTMs to Google Ads destinations. Auto-tagging handles everything. If you need to track creative variants, use the campaign URL options to add custom parameters that don't conflict with UTMs.
Microsoft Ads: Same pattern — never add manual UTMs alongside msclkid auto-tagging.
Meta Ads: Different — fbclid doesn't override UTMs, so manual UTMs and fbclid can coexist. You need both: UTMs for GA4 channel classification, fbclid for Meta's Conversions API.
Multi-domain auto-tagging considerations
For sites spanning multiple domains (main site + checkout subdomain + blog on different TLD), auto-tagging needs cross-domain configuration in GA4:
- Configure cross-domain tracking in GA4 Admin → Data Streams → Web → Configure tag settings → Configure your domains
- Add all relevant domains that should be treated as the same property
- Verify with the linker parameter —
_glparameter should appear in URLs crossing domains - Test the click ID survives — click an ad, complete the cross-domain journey, check if gclid persists
Without proper cross-domain configuration, the click ID is captured on the first domain but lost when the user navigates to your secondary domain. The conversion attributes to the wrong channel.
How to audit click ID preservation
Three-step audit:
1. Pick a representative paid campaign. Click the ad yourself in incognito.
2. Open DevTools Network tab. Watch the URL through the journey.
- Initial page load: gclid present?
- Cross-domain navigation (if applicable): gclid persists via _gl parameter?
- Any redirect chain: gclid present after every redirect?
- Conversion page: gclid present in the URL or session storage?
3. Verify the GA4 session is attributed correctly. Check Realtime → Source/Medium for your click. Should show google / cpc (Google Ads) or bing / cpc (Microsoft Ads), not Direct.
If the click ID drops at any step, that's where attribution breaks. Fix the redirect at that point.
FAQ: Auto-Tagging Conflicts: Google Ads vs Microsoft Ads vs Meta in GA4
How close should auto-tagging conflicts: google ads vs microsoft ads vs meta in ga4 numbers be before I worry?
What should I validate first when auto-tagging conflicts: google ads vs microsoft ads vs meta in ga4 numbers disagree?
When is a discrepancy a tracking bug instead of a reporting difference?
Related guides for Auto-Tagging Conflicts: Google Ads vs Microsoft Ads vs Meta in GA4
ChatGPT, Atlas, Perplexity, Comet, Claude: How Each Shows Up in GA4 (2026 Reference)
In 2026, AI traffic in GA4 splits into three buckets. Browsers and assistants that pass clean referrers (Perplexity web, Perplexity Comet, Claude.ai, Copilot, Gemini standalone) appear with a recognisable source / medium like perplexity.ai / referral. Surfaces that strip the referrer (ChatGPT Atlas…
Perplexity Sources Report: How to Influence What It Cites in 2026
Perplexity citations correlate strongly with five factors: (1) ranking in Bing's top 10 for the underlying query (Perplexity uses Bing's index as fallback alongside its own ~5 billion-URL custom crawler), (2) a clear direct answer in the first 50 words of the relevant page…
Check Auto-Tagging Conflicts: Google Ads vs Microsoft Ads vs Meta in GA4 before campaign reporting gets blamed for the wrong issue
Run a free GA4 audit to spot attribution breaks, UTM governance issues, self-referrals, and source/medium loss fast.