Understanding GA4 Sessions: Stop Losing Attribution and ROI
Published: November 15, 2025
•8 min read
Introduction
You launch a big email campaign. You see the clicks in your email tool, so you know it brought traffic. But when you check Google Analytics 4, the Email channel is flat and a strange spike shows up in your (direct) / (none) traffic. This is the invisible campaign. You cannot take credit for the work, you cannot prove the campaign drove results, and you cannot defend the budget for the next one. This traffic sinkhole is where marketing ROI disappears.
The problem is not a GA4 bug. It is a data quality issue in how your sessions are being tagged.
In the last post on GA4 Events, we cleaned up the what by addressing inconsistencies in event defintions with a Measurement Plan. That told us which valuable actions users took. But that clean event data does not help if you cannot see who deserves credit for it.
This post focusses on the where. We will explain what a GA4 session is, why it controls attribution, and how a simple tagging system can stop your traffic from falling into the (direct) / (none) bucket.
Key Takeaways
- A session is a visit that contains a series of events. Its most important property is its label, which records the source, medium, and campaign that brought the user to you.
(direct) / (none)is GA4’s generic bucket. It holds all traffic that arrives without a label. This is not a GA4 bug. It is a data quality failure caused by missing UTM tags.- The fix is a Campaign Tagging Strategy, a simple system for labeling your links so you get credit for every click you generate.
Understanding A Session
In Google Analytics 4, a session is simply a visit. It is the container that holds all the events a user triggers during that visit, like page_view or generate_lead. When someone lands on your site, GA4 gives that visit a unique ga_session_id and tracks how many times that person has been on your site with ga_session_number. To identify the person behind the visit, GA4 uses either a user_pseudo_id for their browser or a user_id if they are logged in. If you want a fully unique identifier in your database, you combine the user with the visit by pairing user_id with ga_session_id.
Those technical details matter for deeper analysis, but they are not what marketers care about. You are not trying to understand a session’s ID. You are trying to understand why the user arrived in the first place.
This is where the session label becomes the most important part of the data. The café analogy we used in the post on events makes this clearer. Events tell us what the customer did while they were inside. The session is their full visit. The ga_session_id is the order number the cashier hands them. But the moment the person walks in, the first question is, How did you hear about us?
That answer is the session label. Maybe they saw a billboard, read a blog post, clicked a link in your newsletter, or simply wandered in without remembering how they found you. In GA4 terms, those are your sources and mediums, and (direct) / (none) is the shrug. As a marketer, you are not analyzing order number 42. You are analyzing where the person with order number 42 came from, and your job is to reduce the number of people who shrug.
The Problem With (direct) / (none)
(direct) / (none) is not a real traffic source. It is what happens when GA4 cannot find a label for a visit, and it is where your attribution falls apart.
Think back to the invisible campaign from the introduction. You send an email to twenty thousand people with a clean URL like https://www.mywebsite.com/new-feature. A thousand people click it from Gmail, Outlook, or Apple Mail. GA4 sees those users appear on your site, tries to answer the question How did you get here? and finds nothing.
GA4 cannot see inside private apps like email clients. When someone clicks a link in Outlook, their browser simply opens the page. There is no referrer and no label. GA4 has no clue that the person came from your campaign, so it assigns them all to (direct) / (none).
The impact can be brutal. You run a successful campaign, but your analytics say it delivered nothing. You cannot tie a single generate_lead event back to your work, which means you cannot justify the spend. The same thing happens with links in PDFs, social posts, sales outreach, or any place where you share an unlabeled URL.
This is not a measurement failure in the tool. It is a data quality failure in the link.
The Fix: A Simple Campaign Tagging Strategy
When working with events in the last post, we brought order to the event data with a Measurement Plan. We agreed on one consistent name for each important action. We need the same kind of system for sessions. The equivalent is a Campaign Tagging Strategy, a simple way to label our links so GA4 always knows where a visit came from. The key is consistency. Without consistent labels, GA4 cannot attribute visits correctly, and traffic ends up in (direct) / (none).
The solution is to add the labels yourself using UTM parameters, small tags attached to the end of a URL. You only need three to solve almost every attribution problem:
utm_sourcefor where the traffic came from, like linkedin, newsletter, or partner_blogutm_mediumfor how it arrived, like social, email, or referralutm_campaignfor why the user clicked, like fall_promo or new_feature_launch
To see how this works, take the invisible email campaign from earlier. The clean URL was .../new-feature. The tagged version becomes .../new-feature?utm_source=newsletter&utm_medium=email&utm_campaign=fall_promo.
Now when a thousand people click the link, GA4 reads the tags and applies the correct label to every session. The Email channel lights up with the exact source, medium, and campaign, and the traffic no longer falls into the black hole.
Managing tags in a spreadsheet can be annoying, so many teams use a simple UTM builder to speed things up. One option is our one which you can use for free. The important part is the consistency. When your tags are clean, your attribution is clean.
Common Questions About Sessions
When we talk about sessions, a few questions often come up. These are common traps that lead to messy data and lost attribution.
-
What exactly is a session? - A session is a single visit that contains all the events a user triggers during that visit. It is the container that holds the actions and behaviors of a user while they are on your site. The most important property of a session is its label, which tells you the source, medium, and campaign behind that visit.
-
This seems like a lot of extra work for every link. - It takes far less time than trying to explain why all your traffic appears as
(direct) / (none). Once you have a system, tagging a link takes about 10 seconds. You can use a spreadsheet or a UTM builder. The real effort is proving ROI without clean data. -
Why can’t GA4 figure this out automatically? - It can for some sources, like Google searches. But GA4 cannot see inside private email apps, PDFs, or links sent in Slack. You must provide the label yourself. Without it, GA4 labels the traffic as
(direct) / (none). -
Why does traffic from Google, LinkedIn, and Twitter appear automatically, but not email? - These platforms pass along a Referrer, a digital signpost that tells GA4 where the user came from. Google Ads adds a gclid for perfect tracking. That traffic shows up correctly because it has a label. Any link you control, like emails or sales outreach, needs the same approach.
Conclusion: Taking Credit for Every Visit
A session is a simple container, but its label is the key to all marketing attribution. (direct) / (none) is not a bug. It is a data quality failure caused by missing labels. Every time you share a clean link without a tag, you lose visibility into the traffic you generate.
In the last post, we cleaned up event data, the what users did. Now we have cleaned up session data, the where they came from. When you combine these two datasets, you can finally see which campaigns drove which valuable actions.
With consistent labeling and clean session data, your reports are more accurate. You can better prove ROI, justify budgets, and understand better how each visit contributes to your goals.
Next, we will tackle a related challenge. Sometimes GA4 splits a single visit into multiple sessions and the original source loses credit. This is known as the self-referral problem, and we will explore how this happens, what it means, and most importantly how to avoid it.
![Photo of [object Object]](/images/profile.jpg)