August 20, 2026 · 7 min read
How to Know If Your GA4 Is Tracking Correctly
Most GA4 properties have at least one tracking problem quietly skewing every report. Here is how to confirm whether yours is one of them.
Read articleAdvanced Tracking
June 16, 2026 · 7 min read

Direct traffic is supposed to be people who typed your URL or used a bookmark. For most businesses that is a small, fairly stable share of sessions.
If direct is one of your largest channels, or if it spikes without a corresponding brand campaign, you almost certainly do not have unusually loyal users. You have a tracking problem, and it is quietly stealing credit from the channels that actually brought those people.
GA4 assigns a source to every session. When it cannot determine one, it labels the session direct, or in some reports "(not set)".
Direct is not a positive classification. It is the absence of one. GA4 is not telling you the user typed your URL, it is telling you it does not know how they arrived.
That distinction matters, because it reframes the whole question. You are not looking at a channel. You are looking at a bucket of sessions whose source data went missing somewhere between the click and the report, and every one of those sessions belongs to some other channel that is now being undercounted.
UTM parameters live in the URL. That is their entire existence.
Someone clicks your email campaign and lands on yoursite.com/offer?utm_source=newsletter&utm_medium=email. GA4 reads those parameters and records the source for that session.
Then they click through to another page. The URL is now yoursite.com/pricing. No parameters. For that pageview, GA4 has nothing to read.
Within a single session this is usually fine, because GA4 holds the source for the session duration. The problem arises when the session gets broken and a new one starts without the parameters, which happens more often than most people realize.
A redirect strips them. If your marketing links pass through a redirect that does not preserve query strings, the parameters are lost before GA4 ever sees them. Vanity URLs and link shorteners configured carelessly do this routinely.
The session times out. GA4 sessions end after thirty minutes of inactivity by default. Someone opens your page, leaves it in a tab, returns an hour later and clicks through. New session, no parameters, direct.
A tag fires before the parameters are read. If your GA4 configuration tag loads after a client side redirect, the original landing URL is already gone.
This is the most common cause for anyone with a checkout, booking flow, or payment step on a different domain.
A user arrives from Google Ads on yoursite.com, browses, and proceeds to checkout on checkout.yourprovider.com. Without cross domain tracking configured, GA4 treats that as leaving your site entirely. The session ends.
When they return to yoursite.com/thank-you after payment, that is a brand new session. Its referrer is the payment provider, or nothing at all if the redirect was direct. Your conversion is now attributed either to the payment provider or to direct, and the Google Ads campaign that paid for the visit gets nothing.
The fix has two parts. Configure cross domain tracking in GA4 under Admin, then Data Streams, then Configure tag settings, then Configure your domains, listing every domain in the journey. And add your payment providers to the unwanted referrals list in the same settings area, so a return from Stripe or PayPal does not start a new attributed session.
Subdomains are more forgiving than separate domains, because cookies can be shared, but they still cause problems when the setup is inconsistent.
If your blog runs on blog.yoursite.com and your main site on www.yoursite.com with separate GA4 configurations, or with cookie domain settings that do not match, a user moving between them starts a new session. The referrer is your own blog, which GA4 will treat as a referral from your own property unless it is excluded.
This produces two symptoms at once: inflated direct or self referral traffic, and content that appears to contribute nothing, because the session where the content was read is disconnected from the session where the conversion happened.
The cookie domain setting should be set to auto so cookies are written at the root domain and shared across subdomains. Your own domains should appear in the unwanted referrals list.
The underlying fix is to stop relying on the URL as the only place the source lives.
Capture on first arrival. Add a script that runs on every page load, reads any UTM parameters and the GCLID from the URL, and writes them to a first party cookie or to session storage. Do this once, on the first page of the visit.
Read from storage, not the URL, when it matters. Your form submissions, your CRM field mappings, and any custom source tracking should read from the stored value rather than the current URL. This single change fixes attribution for the majority of visitors, since most do not convert on the page they landed on.
Decide first touch versus last touch explicitly. If a returning visitor arrives from a new campaign, do you overwrite the stored value or preserve the original? Store both in separate keys if you can, and be consistent about which one your reporting uses.
Set the storage duration to match your sales cycle. Ninety days aligns with Google's conversion import window and works for most businesses.
Verify redirects preserve query strings. Test every marketing link path end to end, including any shortener or vanity URL, and confirm the parameters survive to the final destination.
Even with clean capture, channel grouping rules can misclassify sessions.
Open Reports, then Acquisition, then Traffic acquisition, and switch the dimension to Session source / medium rather than the default channel grouping. This shows you the raw values rather than GA4's interpretation of them, and misclassification becomes visible immediately.
Look for inconsistent UTM values. facebook, Facebook, and fb are three different sources to GA4. Case sensitivity catches people constantly. Publish a UTM convention and hold everyone to it, including agencies.
Look for mediums GA4 does not recognize. Anything that is not a standard value such as cpc, organic, email, referral, or social lands in "Unassigned", which is another bucket that hides real traffic. Custom channel groups can capture these under Admin, then Data display, then Channel groups.
Check your unwanted referrals list contains every payment provider, authentication provider, and third party booking tool in your journey.
When direct traffic falls from thirty percent of sessions to eight, those sessions do not disappear. They reallocate to the channels that earned them. Paid campaigns suddenly show the conversions they were always driving. Content shows the assists it was always contributing.
Nothing about your marketing changed. Your ability to see it did.
Why is my direct traffic so high in GA4?
Direct is where GA4 puts sessions whose source it cannot determine, not a positive classification. High direct usually means UTM parameters are being lost through redirects, sessions are breaking during checkout because cross domain tracking is not configured, or payment providers are not on your unwanted referrals list. Those sessions belong to other channels that are now undercounted.
What is the difference between direct and (not set) in GA4?
Direct means GA4 recorded a session with no identifiable referrer or campaign parameters. (not set) generally means the dimension value was missing or unavailable for those rows, often because of a configuration gap or a data collection issue. Both indicate absent source information rather than genuine direct navigation, and both are worth investigating.
How do I stop losing UTM parameters between pages?
Capture the parameters into a first party cookie or session storage on first arrival, then read from that store rather than from the current URL whenever you need the source, particularly at form submission. Also verify that any redirects, link shorteners, or vanity URLs in your marketing links preserve query strings through to the final destination.
Does Stripe or PayPal cause direct traffic in GA4?
They cause referral traffic or lost attribution rather than direct specifically, but the effect is the same: your original source loses credit. When users return from a payment provider, GA4 starts a new session attributed to that provider unless it is listed under unwanted referrals in your data stream tag settings. Add every payment and authentication provider there.
How do I set up cross domain tracking in GA4?
Go to Admin, then Data Streams, select your web stream, then Configure tag settings, then Configure your domains. List every domain involved in the user journey, including checkout and booking domains. Also add third party providers to the unwanted referrals list so returning users do not start a newly attributed session.
Source data that survives the whole journey, from first touch to signed contract.
August 20, 2026 · 7 min read
Most GA4 properties have at least one tracking problem quietly skewing every report. Here is how to confirm whether yours is one of them.
Read article
Analytics & TrackingAugust 18, 2026 · 7 min read
What a professional GA4 audit reviews, the problems it usually surfaces, and what changes in your reporting once they are fixed.
Read article
Analytics & TrackingAugust 13, 2026 · 7 min read
Containers rarely break all at once. They accumulate. Here are the symptoms that mean yours needs attention.
Read article