Why it happens
A redirect forwards the path only
A redirect forwards the path only
A 301 or 302 written as a path rule drops everything after the question mark. Vanity URLs, trailing slash rules and http to https hops are the usual culprits.
The app router rewrites the URL on load
A single-page app, a locale redirect or a login wall that navigates in JavaScript can replace the URL before the analytics tag fires.
The tag loads after the URL changes
A consent banner or tag manager that loads the tag late reads the cleaned URL, not the one the visitor landed on.
Cross-domain hops without linking
A checkout or booking tool on another domain starts a new session with no UTMs unless cross-domain measurement is set up.
Malformed UTMs
A second question mark, an unencoded space or a # before the parameters makes the analytics tag ignore them.
How to line them up, step by step
Click a real ad and keep the trail
Open your browser developer tools, go to Network, turn on Preserve log, and click through a live ad. Read the URL of every redirect.
Find the first hop without UTMs
The first response in the chain whose Location header lacks the query string is your break. Fix that redirect rule to pass the query string through.
Check what the tag saw
In GA4 open Admin, then DebugView, and check page_location on the first page_view includes the UTMs. In PostHog open the Activity tab and check the first $pageview carries utm_source.
Set up cross-domain measurement
In GA4 go to Admin, then Data streams, then your web stream, then Configure tag settings, then Configure your domains, and add every domain in the journey.
Point ads at the final page
Set each ad final URL to the page that actually loads, so no redirect sits between the click and the tag.
Steps checked against Google Analytics Help: Collect campaign data with custom URLs; Google Analytics Help: Set up cross-domain measurement; PostHog Docs: UTM segmentation.
Sprites diagnoses this
Sprites diagnoses it
Sprites breaks PostHog and GA4 traffic down by UTM and shows which paid clicks arrive with none.
What Sprites does
- Breaks PostHog visits and signups down by utm_source and landing page, so paid landing pages with no UTMs stand out.
- Breaks GA4 sessions down by channel, source and medium, and by landing page, so direct traffic on ad pages is visible.
- Lists every final URL your Google Ads clicks went to and flags the ones off your domain.
- Puts ad platform clicks next to tagged sessions for the same days.
What it doesn't do
- It does not change redirects, routers or tags on your site.
- It does not rewrite ad URLs or URL parameters.
Questions
Why is my paid traffic showing as direct?
The visit reached your analytics without UTMs or a click ID. A redirect, a client-side route change or a late-loading tag removed them before the tag read the URL.
Does Safari strip UTM parameters?
No. Safari strips known click IDs like gclid and fbclid in Private Browsing, Mail and Messages, but leaves UTMs alone.
Do redirects always remove UTMs?
No. A redirect keeps them if the rule passes the query string through. Path-only rules are the ones that drop them.
How do I check where UTMs are lost?
Click a tagged link with the browser Network panel recording and Preserve log on. The first redirect whose target URL lacks the parameters is the break.
- UTM parameters not showing in GA4
- PostHog UTM tracking
- gclid missing from your URLs
- What is fbclid?
- What is gclid?
- Multi-touch attribution
- PostHog vs Google Analytics for paid ads
- Attribution window
- Cross-channel attribution
- Google Ads attribution model
- Meta ads attribution settings
See where it breaks
Connect your accounts. Sprites reads them side by side and shows you exactly where the numbers split.