Skip to main content
Terminus
Contents
FoundationsChapter 5 · ~8 min read

Common Mistakes

The errors that break tracking and how to prevent them.

On this page

You now have a working system. Chapters 1–4 gave you everything you need: what to measure, how tracking works, a starter taxonomy, and a recipe for every channel. Run it consistently and you’re ahead of most marketing teams. Chapters 6–13 go deeper when you’re ready: advanced taxonomy design, tools, integrations, attribution, and platform-specific guidance.


Even a well-built system breaks without consistent execution.

The ten mistakes below are the frequent offenders: what each one does to your data, how to spot it, and how to keep it out. None of them require incompetence. Most are made by careful people doing something that felt reasonable at the time.

The Ten Mistakes

1. UTMs on internal links. The single most damaging UTM mistake, and the one rule in tracking with no edge cases:

Never tag an internal link.

A visitor arrives through a paid Google ad. They click an internal promo banner you tagged, and your analytics records a marketing touchpoint that never existed: source=blog_sidebar. The fictional source starts competing with the ad for conversion credit, the ad loses credit it earned, and on platforms that restart sessions when campaign parameters change, one visit inflates into two. UTM parameters are for external inbound links only. (The full mechanism is at the end of this chapter, step by step.)

2. Inconsistent casing. Most analytics platforms treat UTM values as case-sensitive, so Facebook, facebook, and fb each get their own line item. One source becomes three, performance comparisons stop being reliable, and someone inherits the manual cleanup. Lowercase everything.

3. Spaces in parameter values. Spaces either break the URL outright or get encoded into %20, and then spring%20campaign haunts your reports. Use hyphens or underscores as separators.

4. Missing required parameters. Google Analytics expects utm_source, utm_medium, and utm_campaign at minimum. Drop any of them and traffic gets misclassified or dumped into (not set), invisible to standard campaign reports. Ship all three, every time.

5. Duplicate parameters in the same URL. ?utm_source=google&utm_source=facebook produces unpredictable results: some browsers and analytics platforms take the first value, some the last, some concatenate them. Validate URLs so duplicates never ship.

6. UTM parameters placed after a hash fragment. Anything after the # in a URL is not sent to the server by default, so example.com/page#section?utm_source=google silently drops every UTM. Put parameters before the fragment, always.

7. UTMs on organic search traffic. Google Analytics detects and classifies organic search visits on its own. Tagging organic links manually overrides that auto-detection and creates conflicts in your channel groupings. Leave organic search untagged.

8. PII in UTM values. Never put email addresses, user IDs, or any other personally identifiable information in a UTM parameter. This one carries legal risk, not just data risk: under GDPR, personal data in URLs can constitute non-compliant processing, and Google Analytics’ terms of service prohibit it explicitly, with data deletion or account suspension among the consequences. UTM values also travel further than people think: analytics reports, browser history, server logs, referrer headers, third-party systems you don’t control. A value like utm_content=john.smith@company.com is visible to anyone who sees the URL, and once it lands in your analytics it’s extremely difficult to purge. Treat UTM parameters as public data. If you need per-user tracking, use opaque IDs (utm_content=user-8f3a2b) that map to personal records server-side.

9. UTM-tagged pages getting indexed by search engines. A tagged URL that appears on a public page (a social post, a forum reply, a partner’s website) can be crawled and indexed. Now example.com/pricing?utm_source=facebook&utm_medium=paid_social&utm_campaign=spring_sale-2025 lives in Google’s index alongside example.com/pricing, and two problems follow: duplicate content dilutes your SEO authority, and organic clicks on the tagged search result pollute your analytics with false campaign attribution. Real organic visitors get counted as paid social traffic. The fix: canonical tags on every page (<link rel="canonical" href="https://example.com/pricing">, without UTM parameters) so search engines always index the clean URL. Most CMS platforms and site generators set canonical tags by default; verify yours does, and that they point to parameter-free URLs. This is a set-it-once protection against a class of problems you’d otherwise discover only after the data was corrupted.

10. Not tagging shareable links (dark social). Someone copies your link into WhatsApp, Slack, iMessage, or an email to a friend. All referrer data dies in transit, and the visit lands as “direct.” For many sites, dark social accounts for a significant share of visits. The only mitigation: pre-tag every link you publish or share, so even a copy-pasted URL carries its attribution with it. This matters most for blog posts, landing pages, and any content likely to be shared.

The deeper problem most teams miss: your own share buttons and internal links work against you here. A visitor arrives on your blog post via organic search, no UTMs. They click your “Share on LinkedIn” button, which generates a clean URL, also no UTMs. Their LinkedIn connection clicks the shared link: no referrer data (LinkedIn’s in-app browser), no UTMs, filed under “direct.” The entire chain, organic visit to social share to new visitor, is invisible to your analytics.

Practical fixes for dark social attribution:

  • Pre-tag shareable content pages. For high-traffic blog posts and landing pages, include default UTM parameters in the canonical share URL: ?utm_source=share&utm_medium=social. Anyone who copies the URL from their browser bar or uses a share button carries those parameters forward. You won’t know which platform they shared to, but “shared” beats “direct” by a wide margin.
  • Configure share buttons to include UTMs. Most social sharing plugins let you customize the shared URL. Set them to append utm_source=share-[platform]&utm_medium=social (e.g., utm_source=share-linkedin, utm_source=share-twitter). That preserves both the “shared” signal and the destination platform.
  • Use JavaScript to add source context dynamically. A script that reads the current page’s referrer or existing UTM parameters and appends them to share URLs can propagate attribution through the sharing chain. If someone arrived via your email campaign and shares the page, the share URL can carry utm_source=share&utm_medium=social&utm_campaign=original_campaign, connecting the share back to the campaign that drove it.
  • Accept the measurement gap. Dark social will never be fully trackable. The strategies above shrink the blind spot; they don’t close it. For content-heavy sites, supplement UTM data with survey-based attribution (“How did you hear about us?”) to catch the word-of-mouth signal that no tracking parameter can.

Before & After: Common Fixes

Internal link with UTMs

Bad

  • <a href="/pricing?utm_source=homepage&utm_medium=banner">See Pricing</a>

Good

  • <a href="/pricing">See Pricing</a>
    • no UTMs on internal links. Ever.

Inconsistent casing

Bad

  • utm_source=LinkedIn
    • some links
  • utm_source=linkedin
    • other links
  • utm_source=li
    • yet more links

Good

  • utm_source=linkedin
    • always, everywhere

Spaces and special characters

Bad

  • ?utm_campaign=Summer Sale 2025!&utm_source=Facebook

Good

  • ?utm_campaign=summer_sale-2025&utm_source=facebook

Parameters after the hash fragment

Bad

  • example.com/page#section?utm_source=google

Good

  • example.com/page?utm_source=google#section

Missing required parameters

Bad

  • ?utm_source=google
    • no medium or campaign: traffic goes to "(not set)"

Good

  • ?utm_source=google&utm_medium=cpc&utm_campaign=spring_sale-2025

The simulation below is the same one you toggled in Chapter 1. Back then it was a preview. Reread it now, knowing the ten mistakes, and the free-text side turns into a diagnosis you can run yourself: casing variants, a stray space, no approved list anywhere in sight.

TRY IT · Governance on / off

Same channel, same month, same spend. The only difference is whether people typed values by hand.

Session sourceSessionsLeads
Facebook1,20431
facebook86224
FB3919
fb2146
Face Book120

One channel, five rows. Which number goes in the board deck?

Debugging Techniques

  • Inspect the full URL after clicking. Check the browser address bar to confirm all expected parameters arrived intact. Look for truncation, encoding issues, or missing values.
  • Use browser developer tools. Open the Network tab to inspect the actual request URL and verify that analytics tags fired with the correct parameter values.
  • Test redirect chains. URL shorteners (Bitly, short.io) and ad platform redirects can strip or mangle UTM parameters. Click through every redirect hop and verify the final landing page URL retains all parameters.
  • Use your platform’s debug/preview mode. GA4’s DebugView, Adobe Analytics’ Debugger, or Matomo’s Visitor Log: watch events arrive in real time and confirm that campaign, source, and medium dimensions are populated correctly.
  • Use Google Tag Assistant (or equivalent). The Tag Assistant browser extension validates that your Google tags are firing and shows what data is being sent with each event. Other platforms offer similar browser extensions or tag validation tools.
  • Check real-time reports. After launching a campaign, visit your analytics platform’s real-time reports to verify that traffic is appearing under the expected campaign name, source, and medium.
  • Audit for fragmented values. Pull a report of all unique utm_source or utm_campaign values. Look for near-duplicates caused by casing differences, typos, or inconsistent naming.
  • Use regex to find malformed values. In your analytics platform’s exploration or reporting tool (GA4 Explorations, Looker Studio, Adobe Workspace, etc.), apply regex filters to surface values containing spaces, special characters, or patterns that violate your naming convention.

Testing Without Polluting Your Analytics

Every test click on a UTM-tagged URL lands in your production analytics. One marketer testing five links three times each has just added 15 fake sessions to real campaigns. During a launch week, with several people testing, the noise can meaningfully skew early performance data.

How to test without corrupting your data:

  • Use your platform’s debug/preview mode. In GA4, install the Google Analytics Debugger browser extension and watch your clicks arrive in DebugView (Admin → DebugView). One catch: debug mode routes events to DebugView, it doesn’t keep them out of standard reports, so pair it with the “Developer traffic” data filter (Admin → Data filters) to actually exclude them. Other platforms have equivalents (Adobe’s Debugger, Matomo’s Visitor Log). Still the lightest setup: one extension, one filter.
  • Filter internal IP addresses. Most analytics platforms let you exclude internal traffic by IP range. In GA4: Admin → Data Streams → Configure tag settings → Define internal traffic, then activate the matching “Internal traffic” data filter (Admin → Data filters); defining the IP range only labels the events, and the filter is what excludes them. This removes all internal traffic from reports, not just test clicks. Works for office-based teams; less useful for remote teams with dynamic IPs.
  • Use a staging/test property. Send a duplicate data stream to a separate analytics property reserved for testing. Test against the staging property; only look at the production property for real data. This is the cleanest separation but requires setup.
  • Tag test clicks distinctively. If the above options aren’t available, append utm_source=test or utm_campaign=test to your test clicks, then create a filter to exclude traffic where source or campaign equals test. Just make sure you never accidentally use test as a real campaign value.

Match the approach to your team. Solo marketer: debug mode is enough. Team: IP filtering plus debug mode. Enterprise: a dedicated test property.

Prevention Strategies

  • Use a UTM management system, not just a builder. A builder (spreadsheet-based or purpose-built like Terminus) eliminates typos on individual links. A management system goes further: it enforces your naming convention across every link, keeps a history of what’s been created, and prevents inconsistency at scale. The builder solves construction; the system solves governance.
  • Enforce controlled vocabularies. Replace free-text fields with dropdown lists for source, medium, and campaign values. This prevents inconsistency at the source.
  • Validate URLs before deployment. Run automated checks to catch missing parameters, duplicate keys, PII, spaces, and hash fragment issues before any link goes live.
  • Click-test every link before campaign launch. Manually verify that the final destination URL contains the correct, complete UTM string. No exceptions.
  • Conduct regular analytics audits. Review your campaign data at least quarterly. Look for fragmented values, unexpected (not set) entries, and internal-link tagging. Fix issues at the source, not in the reports.

UTM hygiene pays compound returns. Every error you prevent today is a cleanup task nobody performs next quarter, and a decision your analytics can actually support.

One caution about all this discipline.

We’ve watched teams tag flawlessly for six months and never once open the report. The tagging was never the point.

The point is the report and the decisions inside it. That’s the real job of the quarterly audit below: it puts opening the report on the calendar.

Follow Along: Stride Footwear

Three weeks into the spring sale campaign, Dana runs a quick check in GA4. She filters by campaign and sees:

Campaign                           Source        Medium        Sessions
─────────────────────────────────  ──────────    ──────────    ────────
spring_sale-runners-2025_03        newsletter    email             842
spring_sale-runners-2025_03        facebook      paid_social     2,104
spring_sale-runners-2025_03        instagram     paid_social       631
spring_sale-runners-2025_03        google        cpc               489
spring_sale-runners-2025_03        qr_code-...   offline            73
Spring Sale Runners                facebook      paid_social       156
spring-sale-runners-2025           Facebook      paid_social        94

Two rogue entries at the bottom. She traces them back: Marcus, their new social media contractor, created his own Facebook ad without using the shared taxonomy sheet. He used Spring Sale Runners as the campaign name (with spaces and uppercase) and Facebook as the source (capitalized).

250 sessions, about 5% of the paid social total, are now fragmented. In last week’s quick report, nobody noticed. But if this kept going for the full quarter, the error would compound.

Dana’s fixes:

  1. She updates the Facebook ad to use the correct UTM values (the 250 sessions with old values are already recorded and can’t be changed; she accepts the small data gap)
  2. She adds Marcus to the shared taxonomy Google Sheet and walks him through it: 10 minutes
  3. She adds a rule: nobody launches an ad without having the link validated against the approved values first

The takeaway: The taxonomy worked, because it made the error visible. Without consistent values everywhere else, the rogue entries would have vanished into a sea of inconsistency. Governance can’t prevent every mistake. What it does is make mistakes detectable.

Quarterly Audit Checklist

The prevention strategies above reduce errors at creation time. No system is leak-proof, and the audit exists to catch what slips through. Run this checklist quarterly against your analytics data:

1. Case inconsistency. Pull all unique values for utm_source, utm_medium, and utm_campaign. Sort them and look for case variants: Facebook vs. facebook vs. FACEBOOK. These are the same source split into separate line items.

2. Near-duplicates. Look for values that differ by typos, abbreviations, or minor variations: email vs. e-mail vs. Email_Newsletter. These likely represent the same thing, fragmenting your data.

3. Delimiter chaos. Check whether your values consistently use one delimiter convention. Mixed use of hyphens, underscores, spaces, pipes, and camelCase within the same parameter makes filtering and regex matching unreliable.

4. Missing parameters. Check what percentage of your tagged URLs are missing utm_medium or utm_campaign. These show up as (not set) in GA4 reports and represent invisible traffic.

5. Naming structure drift. If you use a structured or key-value taxonomy (Chapter 6), check what percentage of campaign names follow the expected pattern. If less than 80% match, the convention is breaking down.

6. Value sprawl. Count unique values per parameter. If utm_source has 47 unique values, you probably don’t have a controlled vocabulary; most organizations need 8–15 sources. High sprawl signals that people are inventing values instead of picking from an approved list.

7. Stale values. Look for values referencing old campaigns, discontinued platforms, or date-based names from years ago. These aren’t errors per se, but they indicate whether your taxonomy is being actively maintained.

For each issue you find, fix it at the source: update the controlled vocabulary, retrain the person who created the inconsistency, or tighten the builder tool’s validation. Fixing data in reports (post-hoc classification) is a safety net, not a strategy.

Scoring Your Naming Health

A simple way to quantify the results of your audit is to score across four dimensions:

DimensionWeightWhat to measure
Consistency35%What percentage of values are free of case variants, typos, and delimiter mixing?
Completeness25%What percentage of tagged URLs have all three required parameters (source, medium, campaign)?
Uniqueness20%What’s the ratio of true unique values to near-duplicates and case variants?
Structure20%What percentage of campaign names follow your documented naming pattern?

Score each 0–100 and take the weighted average. Rough benchmarks:

  • 90–100: Your naming conventions are well-governed. Maintain the cadence.
  • 70–89: Solid foundation with room to tighten. A few inconsistencies are fragmenting your data.
  • 50–69: Significant blind spots. Your analytics data has gaps that affect decision quality.
  • Below 50: Your campaign data is unreliable. Prioritize fixing this before trusting any channel-level reporting.

Track this score over time. A rising score means governance is working. A declining score means the convention is losing adoption; find out why.

UTM data looks wrong in reports?

  • Missing entirely?Check: parameters before # fragment? Required params present?
  • Fragmented/duplicated?Check: casing consistency? Spelling variants?
  • Wrong source shown?Check: internal links tagged? Redirect stripping params?
  • (not set) values?Check: utm_source + utm_medium + utm_campaign all present?

When You Inherit a Mess

Maybe you just joined a company where four people have been tagging links for two years with no conventions. Maybe you’re the new marketing ops hire and your predecessor left no documentation. You open your analytics platform and find 47 unique utm_source values, half of them misspellings of the same five platforms.

This section is for you.

Step 1: Don’t fix anything yet. Catalog what you have.

Before changing a single link, export your current UTM data. In your analytics platform (GA4, Adobe, Matomo, etc.), pull a report of all unique values for utm_source, utm_medium, and utm_campaign from the last 6–12 months, and put them in a spreadsheet. You’re building a map of the mess; you need the full picture before deciding what to do with it.

For each value, note:

  • What it probably means (e.g., FB, facebook, Facebook, fb.com all mean Facebook)
  • How much traffic it represents (high-traffic values are higher priority to fix)
  • Whether it’s still in active use (are current campaigns still generating this value, or is it historical only?)

Step 2: Build your target taxonomy.

Using the starter taxonomy in Chapter 3, create the controlled vocabulary you wish you’d had from the start. This is your target state. Map every legacy value to its correct target value:

Legacy valuesTarget value

FBfacebookFacebookfb.comfb
facebook
linked-inLinkedInLinkedinli
linkedin
e-mailEmailemailemail-marketingeMail
email

This mapping document is your most important artifact. Keep it; you’ll reference it for months.

Step 3: Decide between a clean break and a parallel transition.

Two options. Neither is wrong; the right one depends on your situation.

Option A: Clean break. Pick a date. Everything from that date forward uses the new taxonomy. Everything before it stays as-is. In your analytics platform or BI tool, use post-hoc channel groupings or CASE statements to normalize historical data in reports, but don’t try to retroactively fix old URLs or analytics records.

Take this option when: historical data quality is so bad it’s not worth preserving, your naming health score (from the audit checklist above) is below 50, and the organization is small enough to retrain everyone quickly.

Option B: Parallel transition. Run old and new conventions side by side for a defined period (one quarter is typical). Use data filters or BI tool CASE statements to merge old values into new ones in reports. Migrate active campaigns to the new taxonomy as they renew or relaunch; never change UTMs on a running campaign mid-flight.

Take this option when: you have historical data worth preserving, active campaigns are in-flight and can’t be retagged immediately, or you need time to retrain a large team or multiple agencies.

  1. Month 1Audit & catalog existing data. Build target taxonomy.
  2. Month 2New taxonomy enforced for all new campaigns. Old campaigns keep existing values.
  3. Month 3Migrate remaining active campaigns at natural renewal points.
  4. Month 4+Old values sunset. Reports use new taxonomy only.
Timeline for Parallel Transition

Step 4: Normalize historical data in reports. Don’t rewrite history.

UTM values already recorded in analytics are immutable. What you can do is normalize them at the reporting layer:

  • Custom channel groupings: Create custom channel groupings in your analytics platform (GA4, Adobe, etc.) that map legacy medium values to correct channels (e.g., social-paid, paid-social, and paidsocial all → Paid Social).
  • Looker Studio / BI tools: Use CASE statements or lookup tables to consolidate legacy values in dashboards. Example: CASE WHEN utm_source IN ('FB', 'facebook', 'Facebook', 'fb') THEN 'facebook' ELSE utm_source END.
  • Data warehouse: If your UTM data flows to BigQuery, Snowflake, or similar, build a transformation layer (dbt models work well for this) that applies your legacy-to-target mapping.

The key principle: fix data at the reporting layer, not at the collection layer. What’s recorded is recorded; the job is making reports tell a clean story from here forward.

Step 5: Prevent regression.

The mess you inherited happened because governance didn’t exist or wasn’t enforced. The new taxonomy will decay exactly the same way unless you:

  • Switch from free-text link building to a tool with controlled vocabularies (even a Google Sheet with data validation dropdowns)
  • Run the quarterly audit checklist (above) without fail
  • Designate a taxonomy owner: one person who approves new values and reviews audit results
  • Brief every person who creates links (including agencies and freelancers) on the new conventions

The audit scores from the checklist above are your progress metric. A rising score means the mess is getting cleaner. A plateau means the convention isn’t reaching everyone who creates links; find out who, and where.

The honest truth about inheriting a mess: You will not achieve perfect historical data continuity. Some comparisons across the old/new boundary will be unreliable. That’s fine. Perfection was never on offer. Draw a line, get clean data flowing from that line forward, and make reporting good enough to trust for decisions. A quarter of clean data under a governed taxonomy is worth more than two years of chaos.

Before You Move On: Three Things That Matter Now

This guide is designed so you can stop here and be fine. Chapters 1–4 gave you the system; this chapter showed you the landmines. But three concepts from the advanced chapters affect everyone, including teams running the simplest possible taxonomy. Two minutes to understand them now saves months of confusion later.

1. Your medium values must align with your analytics platform’s channel groups.

The starter taxonomy in Chapter 3 wasn’t arbitrary. Those utm_medium values (cpc, paid_social, email, display) were chosen because GA4’s Default Channel Grouping rules recognize them, and most other analytics platforms use similar conventions. Your platform reads utm_medium and utm_source to sort traffic automatically into channels like “Paid Search,” “Paid Social,” and “Email.” Use a medium value your platform doesn’t recognize (say social-paid instead of paid_social; GA4’s paid rule wants the paid marker up front, so social-paid matches nothing) and classification falls back on the source alone. From a recognized social source, the traffic lands in Organic Social and your ad spend reads as organic. From any other source, it drops to “Unassigned” (GA4) or a catch-all bucket and never appears in your channel reports at all. Stick to the medium values in the starter taxonomy. If you use GA4 and need to deviate, check GA4’s channel grouping documentation first to confirm your values will be recognized. Chapter 11 covers GA4 integration in depth; other platforms publish their own channel grouping specs.

2. Consent banners may hide 15–60% of your campaign data.

If you use any cookie-based analytics tool (GA4, Adobe Analytics, etc.), many jurisdictions legally require user consent before tracking: GDPR in the EU, and similar laws in an expanding list of countries and states. The implication for UTM tracking: a visitor arrives via a perfectly tagged campaign link, declines the cookie banner, and is never recorded in your analytics. Depending on your audience’s geography and your consent banner design, 15–60% of campaign-attributed traffic can go unrecorded. No amount of tagging fixes this; it’s the operating reality of privacy-compliant analytics. Your UTM reports show a floor, not the ceiling, of actual campaign performance. Keep that gap in mind when evaluating results, especially for campaigns targeting European audiences. Chapter 12 covers privacy and compliance in detail.

3. How internal-link tagging actually breaks your data.

Mistake #1 gave you the rule. Here’s why it holds. A visitor clicks your Google Ads campaign and arrives on your site; GA4 starts a session attributed to utm_source=google / utm_medium=cpc. The visitor browses, then clicks a promotional banner on your blog that links to /pricing?utm_source=blog_sidebar&utm_medium=banner. GA4 won’t split the session (that was Universal Analytics behavior; GA4 sessions survive new campaign parameters), but it now has a second campaign touchpoint on record, and that is enough. Attribution is built to ignore direct visits, not fictional campaigns: blog_sidebar enters the conversion path as a legitimate marketing touch and competes for the last-click credit the Google ad paid for. And if the visitor idles past the 30-minute session timeout before clicking that banner, the new session attributes to blog_sidebar outright. Your paid search looks weaker than it is, and a fictional internal source collects conversion credit it never earned.

That’s the entire case for the absolute: never tag an internal link. No exceptions, no edge cases.


The short version: The deadliest mistake is tagging internal links: it plants fictional touchpoints in real conversion paths and hands conversions to sources that don’t exist. Consistency errors (casing, spaces, naming variants) split one channel into phantom line items. Redirects and shorteners can strip parameters en route, so test the full chain before launch. Pre-tag anything shareable, because dark social forwards arrive with no referrer. Run the 7-point audit quarterly; it catches the drift that prevention alone can’t. And if you read nothing from Chapters 6–12, keep the three points above: platform-recognized medium values, consent undercounting, and the internal-link mechanism.

Action Item: Run the quarterly audit checklist above against your analytics data right now. Pull unique values for utm_source and utm_campaign from the last 90 days, score your naming health, and fix the top three issues at the source.

Next upChapter 6: Advanced Taxonomy Structures