Attribution ยท Sprites diagnoses this

UTM parameters being stripped

When paid traffic shows up as direct in GA4 and PostHog, something between the ad and your analytics tag removed the UTMs. The usual suspect is a redirect that forwards the path but not the query string, followed by a client-side route change that rewrites the URL before the tag reads it. Trace one tagged link hop by hop and you will find it.

$1 today. Cancel anytime before day 7.

What Sprites checks

  • !Paid sessions tagged with UTMs58% in GA4
  • !Direct traffic on ad landing pagesUp 41% since launch
  • !PostHog signups with utm_source1 in 3 missing
  • ?Ad final URLs that redirect2 of 9
  • ?Clicks vs tagged sessionsGap of 31%
Illustration of a typical broken account. Your own readout comes from your account.

Why it happens

A redirect forwards the path only

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

See where it breaks

Connect your accounts. Sprites reads them side by side and shows you exactly where the numbers split.