When a fully tagged campaign shows up as 'direct' in GA4, the UTM died somewhere in the chain. This audit spreadsheet turns that mystery into a row-by-row checklist that tells you exactly where, from in-app browsers to shorteners to a single capital letter.
The post The UTM Audit Spreadsheet That Finds Broken Attribution first appeared on VentureLab.
A campaign you tagged perfectly still shows up as “direct” in your analytics. The UTM did not vanish. It died at a specific point in the chain, and the only way to find that point is to test each link and write down where it broke.
Broken attribution is maddening because the report looks fine until you notice the numbers do not add up: paid social landing in “direct,” email traffic sitting in “unassigned,” a whole campaign missing. The fix is not more theory, it is a UTM audit spreadsheet that walks every campaign link through the exact places a UTM gets stripped, from an app’s in-app browser to a link shortener to a single capital letter in your source name. Build the sheet once, and finding a broken link becomes a ten-minute check instead of a guessing game.
The Short VersionWhen a tagged campaign shows up as direct or unassigned, a UTM parameter got dropped somewhere between the click and your site. The most common culprits are in-app browsers that strip parameters, link shorteners and redirects that lose the query string, inconsistent casing that GA4 treats as separate sources, and a missing or mislabeled medium. Build a spreadsheet with a row for each campaign link, columns for the expected and actual URL, and a break-cause checklist, then click each link through its real channel and log where the UTM survives or dies. The sheet turns a vague mystery into a specific, fixable line item.
Why Your Campaigns Show Up as “Direct”Direct traffic is what analytics records when it cannot tell where a visit came from. Some of it is legitimate, like someone typing your URL. But a spike of direct traffic from a campaign you tagged means the UTM parameters got lost on the way, so the session arrived with no source information attached.
The loss happens at a specific handoff, and there are only a handful of usual suspects. An in-app browser opens your link without passing the parameters or the referrer. A shortener or redirect drops everything after the question mark. A capital letter splits one source into two. Once you know the list, you stop guessing and start checking. That is what the spreadsheet is for.
The Audit Spreadsheet: Columns That Expose the CulpritThe sheet works because it forces you to compare what you intended with what actually loaded. Give it these columns, one row per campaign link.

The magic column is the fourth one. The moment you paste the URL that truly loaded, next to the one you intended, most breaks become obvious.
The Break-Cause ChecklistThese are the causes to check against each row. Nearly every broken UTM is one of them.
| Break cause | What it does |
|---|---|
| In-app browser handoff | Instagram, TikTok, and Facebook in-app browsers can strip parameters or drop the referrer, so traffic lands as direct |
| Link shortener | Some shorteners drop everything after the question mark on redirect |
| Redirect not preserving the query string | A 301, 302, or JavaScript redirect that forgets to carry the parameters forward |
| Checkout or payment handoff | Moving to a Stripe or Shopify domain can lose UTMs across the domain boundary |
| Inconsistent casing | GA4 reads Facebook and facebook as different sources, splitting one channel into several |
| Missing or typo’d medium | Without a valid utm_medium, GA4 sends the traffic to unassigned |
| Non-standard medium value | Using newsletter instead of email, or paid instead of cpc, sends traffic to the wrong channel |
| UTMs after the hash | Anything placed after the # is never recorded |
One nuance worth getting right, because it trips up even experienced marketers. GA4’s channel-grouping rules are not case-sensitive, but the source and medium values you see in your reports are. So Facebook and facebook still map to the same channel, yet they show up as two separate lines in your reports, which quietly fragments your data. Keep everything lowercase and the problem disappears.
How to Test Each LinkThe test is quick, but it has to happen in the real environment, not on your desktop where everything looks fine.
If a specific cause keeps showing up, our deeper guides can help: one on UTMs lost after a link shortener and another on the broader problem of UTM attribution not working.
Fixes That Keep UTMs From BreakingAuditing finds the breaks. These habits stop most of them from happening again.
Because the UTM parameters were lost before the visit reached your site. An in-app browser, a link shortener, a redirect, or a payment handoff can strip them, leaving analytics with no source to record, so it defaults the session to direct.
Is GA4 case-sensitive for UTMs?The source and medium values you see in reports are case-sensitive, so Facebook and facebook appear as separate lines and fragment your data. GA4’s channel-grouping rules themselves are not case-sensitive, so both still map to the same channel. Keeping everything lowercase avoids the fragmentation.
Why does my email traffic land in “unassigned”?Usually because the utm_medium is missing or is not a value GA4 recognizes. GA4’s default channel grouping expects medium values like email, so using something like newsletter, or leaving the medium blank, sends the traffic to unassigned instead of the email channel.
How do I test whether a link keeps its UTMs?Click the link through its real channel, including inside an app’s in-app browser, and look at the final URL that loads to confirm the UTMs are present and before the #. Then check GA4 Realtime or DebugView to see the source and medium the session actually recorded.
Do link shorteners break UTM tracking?They can. Some shorteners and redirects drop everything after the question mark, which erases your UTMs. Avoid shortening links that already have UTMs, or test the shortened link first to confirm the parameters still arrive at your site.
What To Do NextOpen a blank sheet, list your active campaign links, and give each one a row with the columns above. Then click through them the way a real visitor would, on a phone, inside the app, and write down where each UTM lives or dies. You will usually find that a handful of links account for most of your missing attribution, and once they are fixed, your reports start telling the truth again. The audit is boring, and that is exactly why it works.
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Before You Hire a GA4 + Consent Mode Migration Specialist: Questions That Prevent Data Gaps and Broken Tags | 0 | 8.61 | 27-07-2026 |
| 2 | Hiring a Performance Marketer: Questions Before You Commit | 0 | 7.31 | 11-08-2026 |
| 3 | Meta Business Suite Won’t Connect Your Instagram Account: A 2026 Checklist for Page Roles, Two-Factor, and Account Center | 0 | 10.76 | 27-07-2026 |
| 4 | Gmail Sender Logo Missing? BIMI and Inbox Trust in 2026 | 0 | 8.62 | 05-08-2026 |
| 5 | AI Overview Wrong Citations? Fixes for AI Search Visibility | 0 | 6.57 | 12-08-2026 |
| 6 | Agency Asks for Your Customer List? Safer Alternatives | 0 | 7.05 | 14-08-2026 |
| 7 | Email Open Rates Collapsed? How to Diagnose It | 0 | 9.25 | 06-08-2026 |
| 8 | Refurbished Phone ‘Unlocked’ but eSIM Activation Fails? 2026 Checklist | 0 | 11.49 | 26-07-2026 |
| 9 | Introducing the AI Visibility Audit | 0 | 6.87 | 01-06-2026 |