How to tell if direct traffic is good or bad, step by step
Grade Direct on behaviour, not size. In GA4, compare its revenue share and engagement rate with the site and see where it lands. Then switch Shopify between Last click and Last non-direct click, and annotate your campaign and tracking dates.
By Joris van Huët, Founder & CEOUpdated 8 min read
Run the numbers for your store: the free UTM coverage calculator.
To tell whether your direct traffic is good or bad, grade how it behaves, not how big it is. Good direct usually lands on your home page, engages like your other channels and keeps its sales when credit skips direct visits. If it lands deep, engages poorly or jumps after a tracking change, part of it is broken.
Step by step
You need GA4 with purchase marked as a key event and a few months of data. Viewer access covers the reports. Adding annotations needs the Analyst role or above.
- Put a revenue figure on Direct. Open Traffic acquisition, which starts on Session default channel grouping. Note Direct's share of Sessions and its share of Total revenue for last month. A label that holds far more revenue than sessions behaves like buyers; the reverse behaves like browsers or junk. Menu path: Reports > Acquisition > Traffic acquisition.
- Set its engagement next to the site total. In the same table, compare Direct's Engagement rate and Session key event rate with the totals row. GA4 counts a session as engaged when it lasts 10 seconds or longer, has a key event, or shows 2 or more pages or screens. Known bots are already filtered out, so a weak Direct row points to broken pages, redirect chains or bots GA4 did not know. Menu path: Reports > Acquisition > Traffic acquisition, Engagement rate and Session key event rate columns.
- See where direct visits land. Open the Landing page report, then open the comparison panel in the top right. Pick the saved comparison for direct traffic, which Google includes in properties for common cases; if yours lacks it, click + Create new. Long product, offer or checkout URLs near the top of the Direct list usually mean links that lost their tags. Menu path: Reports > Engagement > Landing page, then the comparison icon in the top right.
- Measure how much of Shopify's Direct is borrowed. Open Performance by referring channel and use the Attribution menu in the configuration panel. Read Direct's sales under Last click, which counts direct visits, then under Last non-direct click, which skips them. The difference is sales where another channel came before the direct visit. Menu path: Shopify admin > Analytics > Reports > Category: Marketing > Performance by referring channel > Attribution.
- Line Direct up with your calendar. Right click a data point on the Traffic acquisition line graph and click Add annotation. Add one for every campaign launch, big email, press mention and tracking change. Direct that rises with campaigns is borrowed demand; Direct that jumps on a tracking date is broken. Menu path: Reports > Acquisition > Traffic acquisition, right click on the line graph > Add annotation.
- Re-run the grade after every fix. When you tag a leaking link, open the date picker a few weeks later, click Compare and choose Previous period. If Direct falls and the fixed channel rises by about the same amount, the leak is closed. Menu path: the date picker in the top right of any report > Compare > Previous period > Apply.
A worked example
For illustration, say Traffic acquisition shows Direct with 30% of sessions and 45% of total revenue. Step 1 leans good: direct visitors bring more revenue than their share of visits.
Step 2 looks fine too, with Direct's engagement rate close to the site total. Step 3 is where it wobbles. Two long product URLs sit near the top of the Direct landing pages, and both appeared in last week's email.
Say the Shopify check in step 4 shows Direct with €20,000 of sales under Last click and €14,000 under Last non-direct click. In this worked example, €6,000 of Direct's sales had another channel first: say €4,000 from Email and €2,000 from Paid Social.
So the grade splits three ways. For illustration, about €14,000 is earned or came from somewhere off the record, and €6,000 is borrowed. The email links are broken. Fix the email tags first. Then leave Paid Social out of any cut you were planning on last-click numbers.
Now set that next to one store's real export, which holds shares of revenue rather than sales. On its Channels sheet, Direct holds 57.7% of revenue in every view.
Step 4 hunts for borrowing, and borrowing needs at least two touches. On the Journeys sheet, journeys of two or more touches hold 20.6% of revenue (12.2% + 5.4% + 3.0%). A one-touch journey has nobody to borrow from.
So in that store, recorded borrowing is capped at about a fifth of revenue, however large Direct grows. The other four fifths sit on journeys GA4 saw once, where only landing pages and dates can tell earned from off-record.
What the export cannot grade is the off-record kind: the ad seen on a phone, the tip from a friend. For that, steps 3 and 5 matter more than any share, and the export holds neither landing pages nor dates.
What to check when the report looks wrong
- The saved comparison for direct traffic is missing. Saved comparisons are still reaching properties, so yours may not have them. Click + Create new and set the condition yourself.
- Shopify shows no Attribution menu. It appears only when the report holds a sales metric, such as Gross sales, and a marketing dimension, such as Referring channel.
- You cannot add an annotation. Creating one needs the Analyst role or above at the property level. Viewers can see annotations but cannot add them.
- Shopify's Direct is bigger than GA4's. GA4 gives a session that starts with a direct entrance the user's earlier campaign values. Shopify's Last click keeps it as Direct, so the same buyer can sit in two different rows.
- Direct improved after a fix, then slid back. A new email template, link shortener or checkout redirect can undo the tags. Run steps 3 and 6 again after any change to your sending tools.
Which grade should change your budget?
Only two of them, and not in the way a last-click report suggests.
Earned direct changes nothing. It is the free part of your revenue, so leave it alone. If you also bid on your own brand name, check how many of those clicks would have typed your address anyway.
Borrowed direct protects the channels behind it. The channels that gain under Last non-direct click are opening journeys that Direct finishes. Judge them on their paths or on a holdout test, not on the last click they rarely get.
Broken direct comes first. Fix the tags before you move a single euro. Every budget call made on a leaking report credits the leak.
What to do this week
- Run steps 1 to 3 for last month. Pass: Direct holds a bigger share of revenue than of sessions, engages near the total and lands mostly on the home page. Fail: any one of the three goes the other way, so start with the landing pages that look like email or ad links.
- Write down Shopify's two Direct numbers. Pass: the gap between Last click and Last non-direct click is small, so most of Direct had no other channel on record. Fail: the gap is large, so list the channels that gain and keep them out of any cut made on Last click.
- Book the follow-up now. Add an annotation on the day you fix any tags, and set a reminder to run step 6 a few weeks later. Pass: Direct fell and the fixed channel rose by about the same amount. Fail: Direct did not move, so the links you fixed were not the leak.
Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework
Sources, 1 October 2026: Traffic acquisition report (Google); Known bot-traffic exclusion (Google); Landing page report (Google); Apply comparisons to reports (Google); Marketing reports (Shopify); About annotations (Google); Change and compare date ranges in reports (Google); Scopes of traffic-source dimensions (Google)
Related answers
Frequently asked questions
How do I compare direct traffic with other channels in GA4?
Use a comparison. In the top right of a report, open the comparison panel and pick the saved comparison for direct traffic, or click + Create new. GA4 then shows a colour-coded copy of the data for each comparison, so Direct sits beside all users.What does Last non-direct click do to direct sales in Shopify?
It moves them. Last non-direct click gives each sale to the last channel before the purchase, skipping direct visits. Only orders whose whole journey was direct stay with Direct, so the gap with Last click shows how much Direct borrowed.Who can add annotations in GA4?
Anyone with the Analyst role or above at the property level. Viewers can see annotations but cannot create them. Right click a data point on a report's line graph and choose Add annotation; it then shows on every report with a line graph.
Go deeper: Causal attribution, explained.
Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.
Keep reading
Terms in this article
- AnalyticsAnalytics is the systematic computational analysis of data. It reveals customer behavior and measures campaign performance.
- AttributionAttribution identifies user actions that contribute to a desired outcome and assigns value to each. It reveals which marketing touchpoints drive conversions.
- CausalityCausality is the relationship where one event directly causes another, essential for identifying specific actions that drive desired outcomes in marketing.
- Direct TrafficDirect Traffic refers to website visitors who arrive by typing the URL directly into their browser or through bookmarks. They do not come from search engines or referrals.
- Holdout TestA holdout test is an experiment where a portion of the audience does not see a campaign. This measures the campaign's true incremental impact.
- Landing PageLanding Page: A single web page that appears after clicking a search result, marketing promotion, email, or online advertisement.
- RevenueRevenue is the total income generated by the sale of goods or services related to a company's primary operations.
- SessionA Session is a group of user interactions with your website within a given timeframe. It can include multiple page views, events, and transactions.