How to Set Up UTM Tracking So You Actually Know What's Working

Last month I was reviewing a client's Google Analytics account and found 47 different variations of the word "facebook" in their source column — Facebook, facebook, fb, FB, Facebook-Ad, facebook_paid. Every single one was a separate traffic source as far as Analytics was concerned. Their channel data was completely shattered, and they had no idea which campaigns were actually driving revenue.

This is the UTM problem in a nutshell: not that people don't use UTMs, but that they use them inconsistently. This guide is about fixing that — building a system so tight that your reports are actually trustworthy.

What UTM Parameters Actually Are (The Short Version)

UTM stands for Urchin Tracking Module, a naming convention left over from a company Google acquired back in 2005. The parameters are just extra bits of text you append to a URL that tell your analytics platform where that traffic came from.

There are five parameters. Three are required to get meaningful data:

  • utm_source — The platform or publisher sending the traffic. Example: newsletter, google, instagram
  • utm_medium — The marketing channel or type of traffic. Example: email, cpc, social
  • utm_campaign — The specific campaign this belongs to. Example: summer-sale-2026, onboarding-drip

Two are optional but very useful:

  • utm_content — Differentiates creatives or links in the same campaign. Example: hero-banner, text-link
  • utm_term — Primarily for paid search keywords. Example: running-shoes-women

A tagged URL looks like this:

https://yoursite.com/landing-page?utm_source=newsletter&utm_medium=email&utm_campaign=june-product-launch&utm_content=cta-button-top

Ugly? Yes. Powerful? Absolutely — if you're consistent.

Step 1: Create a Naming Convention and Write It Down

This is the step most teams skip, and it's why their data falls apart. Before you tag a single URL, you need rules that every person on your team will follow.

Here are the decisions you need to make right now:

Case sensitivity: Analytics treats Google and google as two different sources. Pick lowercase, always, and make it non-negotiable. Lowercase is the standard across the industry.

Word separators: Hyphens are far easier to read than underscores in a data table. Choose one and stick with it. summer-sale beats summer_sale for readability, though either works.

Source vocabulary: Write out every source you'll ever use and what it maps to. Don't let ig and instagram and Instagram coexist. Your master list might look like:

  • google
  • meta
  • instagram
  • linkedin
  • newsletter
  • twitter
  • youtube
  • partner-[name]

Medium vocabulary: Be ruthless here. A common set that covers 90% of use cases:

  • cpc (all paid search)
  • paid-social (all paid social)
  • email (all email sends)
  • organic-social (unpaid social posts)
  • display (banner/programmatic)
  • affiliate (partner/commission traffic)
  • referral (press, blog, content partnerships)

Campaign naming format: A consistent format like [year]-[quarter or month]-[campaign-name] makes it easy to filter and compare later. Example: 2026-q2-summer-sale or 2026-jun-product-launch.

Document all of this in a shared Google Sheet or Notion page. Call it your UTM Style Guide. It should be the first thing a new marketing hire reads.

Step 2: Build a URL Builder Spreadsheet (Not the Google Tool)

Google's Campaign URL Builder at ga-dev-tools.google.com works fine for one-off links. But for any team or anyone running multiple campaigns, you want a spreadsheet that enforces your naming convention automatically.

Build it like this in Google Sheets:

Column A: Base URL (just the destination, no parameters)
Column B: Source (dropdown menu locked to your approved source list)
Column C: Medium (dropdown locked to your approved medium list)
Column D: Campaign name
Column E: Content (optional)
Column F: Term (optional)
Column G: Generated URL (formula)

The formula in Column G:

=A2&"?utm_source="&LOWER(B2)&"&utm_medium="&LOWER(C2)&"&utm_campaign="&LOWER(D2)&IF(E2<>"","&utm_content="&LOWER(E2),"")&IF(F2<>"","&utm_term="&LOWER(F2),"")

The LOWER() function wraps every field so even if someone types Instagram, it outputs as instagram. That single formula has saved more than one analytics account from chaos.

Add a column H for a shortened URL using a Bitly API connection or just do it manually after generation. Keep every row — this spreadsheet becomes your campaign history.

Step 3: Tag Everything (And Know What Not to Tag)

Tag every link you share in a context you control — emails, social posts, paid ads, bio links, QR codes, PDF downloads with embedded URLs, partner newsletters, influencer posts.

Do not tag internal links on your own site. If you add UTM parameters to links inside your website — say, from your homepage to your product page — you'll reset the session in Analytics and overwrite the original traffic source. Your paid ad traffic suddenly looks like it came from "direct" because someone clicked a UTM-tagged internal CTA. This is one of the most common self-inflicted analytics wounds.

Also don't tag organic search. Google Search Console and your analytics platform handle that automatically.

Step 4: Configure Your Analytics to Read These Properly

If you're using Google Analytics 4, go into Admin → Data Streams → your stream → Configure tag settings → List unwanted referrals. Add your own domain here so internal traffic doesn't contaminate your source data.

Next, go to Admin → Reporting identity and make sure you're using Blended or Observed to give yourself the best cross-device picture.

Then create a custom exploration (formerly called custom reports) in GA4 with these dimensions and metrics to make your UTM data actually readable:

  • Dimensions: Session source, Session medium, Session campaign, Session content
  • Metrics: Sessions, Engaged sessions, Conversions, Revenue (if applicable)

Save this as a default report your whole team can access. It should be the first thing you check when evaluating a campaign.

Step 5: Reading the Results — What to Actually Look For

When your tags are clean, your reports get genuinely interesting. Here's how to extract real insight rather than just staring at numbers:

Compare medium performance over time: Filter your UTM campaign report to a 90-day view and compare email vs. paid-social vs. cpc by engaged session rate and conversion rate — not just raw traffic. A channel sending 10,000 sessions with 0.2% conversion beats one sending 2,000 sessions with 1.5% conversion only if the economics work out. Do the math with actual revenue data.

Look at content parameter to kill underperforming creatives: If you tagged a campaign with content variants like video-ad-a, video-ad-b, and static-image, your report will show you exactly which creative drove conversions. Most teams never tag at this level and then wonder why their creative testing goes nowhere — it's because they can't see the results cleanly.

Watch for untagged traffic spikes: If you run a campaign and suddenly see a spike in direct or (not set) traffic at the same time, someone on your team sent untagged links. Track it down. It means revenue you can't attribute.

Build a monthly UTM audit into your workflow: Once a month, export your source/medium report and look for typos, rogue capitalization, or unapproved source names. Catching Newletter (typo) or linkedin-ads (inconsistent with your paid-social medium convention) early keeps the data clean going forward.

The Payoff: Attribution You Can Actually Trust

Here's what changes when your UTM hygiene is solid: you stop having to guess. You stop saying "I think the Instagram campaign drove that lift" and start saying "Instagram paid social drove 340 conversions in May at a $14 cost per conversion, beating email by 40%." Your budget decisions get sharper. Your agency or freelancers are held to a real standard. Your quarterly reviews have teeth.

None of this requires expensive software. It requires a shared naming document, a disciplined spreadsheet, and ten minutes of training for anyone who sends a marketing link. The infrastructure is already in your analytics platform — UTMs are just the key that unlocks it.

Get the naming convention right first. Everything else follows from that.