The Business Context
This client sells premium footwear and apparel direct-to-consumer. With monthly ad spend approaching $200k across Meta, Google, and TikTok, accurate attribution wasn’t a nice-to-have — it was existential. Bad data meant bad budget decisions.
They came to us after their head of growth noticed something deeply wrong: GA4 was attributing 42% of their online revenue to “direct / (none).” That’s not normal. Well-run e-commerce brands typically see direct in the 10–18% range. At 42%, either a massive number of customers were typing the URL from memory — or something was broken.
It was broken. Several things, in fact.
Challenge
What 42% Direct Actually Means
“Direct” in GA4 doesn’t mean the customer typed your URL. It means GA4 couldn’t determine where they came from. Every session that loses its referral information — whether from a broken UTM link, a redirect that strips parameters, or a missing cross-domain configuration — gets dumped into direct.
When we first logged into the GA4 property, three things were immediately obvious:
-
No UTM governance — Marketing was using five different conventions for the same channel.
paid_social,Paid Social,paid-social, andmetawere all being used as utm_source values for the same Facebook campaigns. GA4 channel grouping couldn’t recognise any of them. -
Missing cross-domain configuration — The brand used a third-party checkout on a subdomain (
checkout.brand.com). GA4 wasn’t configured to recognise this as the same property, so every purchase session was starting fresh — losing the original source entirely. -
Affiliate and email links with no UTMs — A significant email program and affiliate network were sending traffic with no parameters whatsoever. Every converted email subscriber was landing in direct.
The Real Scope of the Problem
Before touching anything, we ran a diagnostic to quantify the damage:
| Traffic Source | Sessions | Revenue | Avg Order Value |
|---|---|---|---|
| Direct / (none) | 48,200 | $382,400 | $79 |
| google / cpc | 31,000 | $241,800 | $78 |
| facebook / cpc | 22,100 | $89,200 | $40 |
| organic search | 19,800 | $156,600 | $79 |
The $382k in direct was suspicious in both volume and AOV. The average order value matched paid and organic exactly — which strongly suggested these weren’t typed-URL brand loyalists. They were paid and email customers whose source had been dropped.
Action
We worked through the fix in four sequential phases, each requiring sign-off before moving to the next.
Phase 1 — UTM Governance & Taxonomy
We audited every active campaign URL across Meta Ads Manager, Google Ads, TikTok, and the email platform. We documented every UTM pattern in use and created a single standardised taxonomy:
utm_source: meta | google | tiktok | klaviyo | affiliate
utm_medium: cpc | email | social | display | retargeting
utm_campaign: [year]-[season]-[product-line] (e.g., 2025-aw-trainers)
utm_content: [ad-format]-[creative-variant] (e.g., carousel-social-proof)
This was implemented across all platforms using URL builder templates in a shared Google Sheet. Campaigns running the old taxonomy were not killed — we let them run out and rebuilt new campaigns with correct parameters.
Phase 2 — Cross-Domain Tracking Fix
The checkout subdomain was causing a session restart on every purchase. The fix required two changes:
In GTM: Updated the GA4 Configuration tag to add checkout.brand.com to the cross-domain measurement list.
In GA4: Added the checkout subdomain under Admin → Data Streams → Configure tag settings → Configure your domains.
// GTM GA4 Configuration tag — domains field
// Before (only own domain):
// brand.com
// After (cross-domain enabled):
// brand.com, checkout.brand.com
We verified the fix by watching the GA4 DebugView in real time while completing a test purchase. Before the fix, you could see a new session starting at the checkout domain. After — one continuous session from landing to purchase.
Phase 3 — Email & Affiliate UTM Enforcement
The email platform (Klaviyo) had UTM auto-tagging partially configured — it was applying parameters to some flows but not others. We enabled consistent auto-tagging across all flows and one-off campaigns and spot-checked 40 live links.
For affiliates, the network allowed custom tracking parameters but the integration hadn’t been configured. We set this up and sent UTM requirements to the top 20 affiliates as a compliance update.
Phase 4 — Custom Channel Grouping in GA4
Even with corrected UTMs, GA4’s default channel definitions didn’t map correctly to this brand’s channel mix. We created a custom channel group with explicit rules:
| Channel | Rule |
|---|---|
| Paid Social | source contains meta OR tiktok AND medium = cpc OR paid OR retargeting |
| Paid Search | source = google AND medium = cpc |
| medium = email | |
| Affiliates | medium = affiliate |
| Organic Social | source contains meta OR tiktok AND medium = social |
| Direct | (last-resort fallback only) |
Result
We monitored for a full four-week post-implementation period before presenting findings.
Direct / (none) share dropped from 42% to 9%. That residual 9% represents genuine direct traffic — users who know the brand and type it in.
The $380k we “found” redistributed as follows:
- Meta (paid social): +$148k — making true ROAS 3.1x, not 1.2x
- Klaviyo (email): +$112k — email was the second-largest revenue channel, not fourth
- Affiliate: +$84k — affiliate program was significantly undervalued
- Google Ads: +$36k — already being tracked well, minor improvement
The business impact wasn’t just data accuracy. With email correctly attributed, the client increased their Klaviyo investment — specifically the abandoned cart and browse abandonment flows — which had been under-resourced because leadership thought email wasn’t performing. Within 60 days of fixing the data, they added two full-time email specialists.
Meta campaigns that looked unprofitable at 1.2x ROAS were actually running at 3.1x. No campaigns were paused that shouldn’t have been — but only because the growth team had pushed back on the bad data. If they’d acted on the GA4 reports, they’d have cut their highest-performing paid channel.
The lesson: When direct is over 20%, you have a measurement problem, not a brand loyalty problem. The first thing to audit is cross-domain tracking, then UTM discipline, then referral exclusions.