All posts

How to Build UTM Links That GA4 Reads Correctly

11 min read

The minimal correct UTM link takes your destination URL and appends ?utm_source=source&utm_medium=medium&utm_campaign=campaign, with every value lowercase and hyphens instead of spaces. Those three parameters, source, medium, and campaign, are the ones Google Analytics 4 treats as essential. Copy that pattern into your own URL now, then test it in a browser tab and confirm it shows up in GA4’s Realtime or DebugView before you send a single click to it.


TL;DR:

  • Ensure UTM parameters are all lowercase, hyphen-separated, and placed before any anchor tags to prevent tracking issues.
  • Always verify your UTM values match approved vocabulary to avoid data fragmentation and confusing reports.
  • Test and confirm the full link appears correctly in GA4’s Realtime or DebugView before sharing or shortening it.
  • Use templates or governance tools to manage UTM consistency at scale and prevent spelling errors across campaigns.
  • Build UTM links first, then shorten or generate QR codes only after confirming accurate data capture.

Table of Contents

Building a UTM link isn’t hard, but the order you do things in determines whether it breaks later. Here’s the sequence that avoids the most common mess-ups.

  1. Start with the final destination URL. Not a placeholder, not a shortened version, the actual page the click should land on.
  2. Check for an existing query string. If the URL already has a ? in it (like a product page with ?color=blue), you add your UTM parameters with & instead of a second ?. If there’s no query string yet, you start with ?.
  3. Write each parameter as key=value, joined by &. No spaces, no unencoded symbols. This is the exact structure UTM tracking guidelines from the University of Minnesota lay out: a ? followed by key=value pairs separated by &.
  4. Force lowercase and use hyphens for spaces. utm_campaign=spring-sale works. utm_campaign=Spring Sale creates a URL-encoding headache and, worse, a reporting headache.
  5. Add utm_term and utm_content only when they earn their place. Use utm_term for paid search keywords. Use utm_content to split-test two versions of the same ad or email link, like a button versus a text link.
  6. Encode special characters if you can’t avoid them. An ampersand or space inside a value needs percent-encoding, or the parameter will get cut off mid-string.
  7. Place your UTM string before any anchor (#). If your link points to a page section, the anchor has to come last: https://example.com/page?utm_source=newsletter&utm_medium=email#pricing. Put the UTMs after the anchor and GA4 never sees them, because everything after the # is invisible to the server.

That last step trips up more marketers than any other. It’s an easy mistake because visually the link still “looks right,” and it will still click through fine. It just won’t track.

What Do UTM Parameters Actually Mean?

Five standard parameters exist in Google’s tracking model: utm_id, utm_source, utm_medium, utm_campaign, and utm_content, with utm_term layered in for paid keyword tracking, according to Analytics Mania’s breakdown of UTM parameters in GA4. Here’s what each one actually reports on:

  • utm_source — where the traffic comes from (newsletter, google, facebook, partner-site).
  • utm_medium — the channel type (email, cpc, social, referral).
  • utm_campaign — the specific initiative (spring-sale, product-launch-q1).
  • utm_term — the paid keyword that triggered the ad, mostly used in search campaigns.
  • utm_content — differentiates similar links or ads, like two CTA buttons in the same email.
  • utm_id — an optional campaign ID, useful when you’re syncing with ad platform campaign IDs.

Here are two you can copy directly. For an email newsletter driving to a landing page:

https://example.com/landing-page?utm_source=newsletter&utm_medium=email&utm_campaign=spring-sale

For a paid search ad, where the keyword matters:

https://example.com/shoes?utm_source=google&utm_medium=cpc&utm_campaign=spring-sale&utm_term=running-shoes

Statistic to remember: UTM values are case-sensitive, and GA4 treats “Google” and “google” as two separate sources, according to the same UMN tracking guidelines. One capitalized letter from one team member splits your traffic data in half.

Naming Rules and a Pre-Launch Validation Checklist

Most UTM disasters aren’t technical. They’re spelling. One person writes email, another writes e-mail, a third writes Email, and now your acquisition report shows three sources instead of one. Fixing that after the fact means reprocessing weeks of campaign data by hand.

The naming rules that prevent it are boring on purpose:

  • Always lowercase, no exceptions, even for brand names or product names in the campaign string.
  • Hyphens for spaces, never underscores or camelCase.
  • Keep campaign names short and descriptive: black-friday-2026, not our-big-black-friday-sale-this-year.
  • Pick one medium vocabulary and stick to it (email, cpc, social, referral, affiliate) instead of letting each team invent its own.

Before a link goes live anywhere, run it through this checklist:

  • Click the link yourself, on both desktop and mobile.
  • Follow the full path, including checkout or signup, since some redirects and payment processors strip query strings entirely.
  • Open GA4’s Realtime or DebugView and confirm the source, medium, and campaign appear exactly as written.
  • Watch for red flags: missing utm_source or utm_medium (these show up as “(not set)” in reports), mixed spellings of the same channel, or a medium value that doesn’t match your team’s agreed vocabulary.

Pro Tip: Bookmark your GA4 DebugView tab during any campaign launch week. Catching a bad UTM in the first hour saves you from a data cleanup that takes days.

Once more than two or three people are creating links, manual checklists start to fail. That’s the point where a governance tool, one that enforces dropdowns instead of free text, or a shared naming template, becomes worth the setup time. SourceLoop’s comparison of UTM tracking tools makes the same case: consistency is the real challenge at scale, not the syntax.

Not every campaign needs the same tooling. A one-off link for a personal LinkedIn post doesn’t need the same infrastructure as a 40-person marketing team running twelve simultaneous campaigns.

  • Free browser-based builders work well for one-off links and small campaigns. Many, like UtiloKit’s UTM builder, include platform presets, an enforce-lowercase toggle, and required-field validation so you can’t submit a link missing utm_source. Because these assemble the URL locally rather than uploading your campaign values to a server, they’re also a reasonable privacy-conscious default for quick tagging.
  • Team link-management tools matter once more than one person is building links. Templates and enforced dropdowns stop the spelling drift that free-text fields invite.
  • Shortening and QR generation come after you’ve confirmed the UTM is capturing correctly, never before. Shortening a link changes how it looks. It shouldn’t change what it tracks, and confirming that order avoids finding out the hard way that a shortener rewrote your query string.

The workflow that holds up under real campaign pressure: build the UTM, test the click path end to end, confirm capture in GA4, then shorten or generate a QR code for the final asset.

Rdyrct handles the back half of that workflow: shortening the tagged link and turning it into a branded QR code, without storing IP addresses in the process. That matters if you’re running campaigns across print, packaging, or events where a QR code is the only way to get a UTM into a physical space.

A practical run-through looks like this:

  • Build your UTM string using the format above, with source, medium, and campaign set correctly.
  • Test the full link and confirm it appears in GA4.
  • Shorten it with a branded domain using rdyrct, keeping the link readable and on-brand.
  • Generate a branded QR code if the campaign needs a print or in-person touchpoint, using utm_medium=qr to keep that channel distinct in reporting.
  • Monitor referrer, device, and campaign performance in rdyrct’s analytics dashboard alongside your GA4 data.

A naming convention that lives only in someone’s head disappears the day that person goes on vacation. The fix isn’t more discipline. It’s a document or template that removes the need for memory entirely.

The simplest version is a shared spreadsheet or campaign brief with locked dropdown columns for utm_source and utm_medium, so a new hire can only pick from approved values instead of typing freeform text. A more structured version is a central repository, sometimes a Google Sheet, sometimes a dedicated field in your project management tool, that logs every UTM link ever created for the quarter, tagged by owner and campaign.

The goal either way is the same: nobody should ever type a raw parameter value from memory. They should select from a pre-approved list, or copy a template string and swap out only the campaign name. Fragmentation at scale almost always traces back to a missing central policy, not to any one person being careless. Enterprise teams increasingly solve this by normalizing values at the data layer rather than trying to police every individual creator, catching and correcting variants in the pipeline before they hit the reporting dashboard.

Whatever format you choose, review it quarterly. Campaign types change, new channels get added, and a naming system that made sense in January can leave gaps by fall.

A single evergreen campaign might run for six months with the same three UTM links. A seasonal push might spin up forty links in a week, across email, paid social, affiliate partners, and display. Managing that volume by hand in a spreadsheet works until it doesn’t.

The practical fix is a template-based approach: build one master UTM string per campaign, then generate variations by swapping only the utm_source or utm_content field. If your campaign name or medium ever needs to change mid-run, say a rebrand or a shift in ad platform naming, doing it through a shared template means one edit propagates everywhere instead of forcing you to individually rebuild forty links.

For teams running high link volume, a bulk CSV upload into a link management or governance tool beats manual entry every time. You define the base URL and campaign structure once, then feed it a list of source and content variants, and it generates the full set with naming rules already enforced. This is also where version control matters: keep a record of which links are live, which are retired, and which were quietly replaced mid-campaign, so nobody accidentally reports on a dead link’s traffic weeks after it stopped running.

How UTM Parameters Feed Into Campaign Attribution

UTM parameters only matter because analytics platforms read them and turn them into attribution data. When a tagged link is clicked, GA4 parses the parameters from the landing-page URL and stores them as session-level attributes, surfacing them under Acquisition reports as Source, Medium, and Campaign dimensions.

That’s the mechanism behind every attribution report you’ll ever pull. A campaign that shows strong conversions under utm_source=newsletter, utm_medium=email is only trustworthy if every newsletter link actually used that exact pairing. If half your newsletter links accidentally used utm_medium=newsletter instead of email, GA4 splits the credit across two rows, and both numbers understate the channel’s real performance.

This is also why missing parameters cause so much confusion. A link with no utm_source or utm_medium doesn’t just get ignored. It shows up in reports as (not set), a bucket that quietly absorbs traffic and makes your attribution data look worse than it is. Google’s own documentation on custom URL tracking flags this directly: skip the parameters, and the report fills with unattributed noise instead of clean channel data.

Attribution, in the end, is only as good as the tagging discipline behind it. The platform does its job correctly. The gap almost always sits upstream, in how consistently the links were built.

A Repeatable Checklist for Building and Reviewing UTMs

Consistency comes from a repeatable process, not from remembering rules under launch-day pressure. Here’s a workflow worth pinning above your desk or dropping into your campaign brief template:

  1. Confirm the destination URL is final and correct, no typos, no staging domain left in by accident.
  2. Check for an existing query string and use ? or & accordingly.
  3. Pull utm_source and utm_medium from your team’s approved vocabulary list, not from memory.
  4. Write the campaign name in lowercase, hyphenated, and short enough to scan at a glance.
  5. Add utm_term or utm_content only if the campaign genuinely needs keyword or variant tracking.
  6. Place all UTM parameters before any # anchor in the URL.
  7. Click-test the link on desktop and mobile before it goes live anywhere.
  8. Confirm it appears correctly in GA4 Realtime or DebugView.
  9. Log the finished link in your shared repository or spreadsheet before sending it out.
  10. Shorten or convert to a QR code last, after capture is confirmed, not before.

Run through that list every time, and the naming drift that quietly wrecks most attribution reports never gets the chance to start.

The Rules I Actually Follow When Tagging Campaigns

I keep three rules non-negotiable: everything is lowercase, no exceptions, even when a brand name looks strange lowercased. Campaign names stay short and hyphenated, because a name I have to think about is a name I’ll eventually misspell. And I never trust a link until I’ve clicked it myself, all the way through checkout or signup, because redirects strip query strings more often than anyone expects.

My go-to pattern looks like utm_source=partner-name&utm_medium=referral&utm_campaign=q1-launch. It’s boring, and that’s the point. And once the tagging is solid, privacy-conscious analytics matter just as much: you want to know where clicks came from without a tool quietly logging every visitor’s IP address to get there.

— Andrea

Rdyrct gets you tracked, shortened, and QR-ready without handing over visitor IP addresses to do it. Once your UTM string is built and tested, that’s the whole remaining job: a branded short link, an analytics dashboard that reports referrer, country, and device, and a QR code if the campaign needs one for print or packaging.

Various subscription tiers are available to meet the needs of solo marketers and teams, offering features such as custom domains and extended analytics history. Start by building your UTM link the way this article laid out, then head to rdyrct to shorten it and check the click data come in clean. Need a QR code for a flyer or product tag instead? The QR code generator handles that in the same flow, no account required to try it.

Sources

Keep reading. More from the blog.

  1. rdyrct 1.1: bring your links from Bitly, then tag, shorten and track them

    rdyrct 1.1.0 is out: import your links from Bitly, Short.io, Rebrandly or Dub with the same short URLs, a free UTM builder, links made from the homepage, and your own copy in one step.

  2. 30 Day UTM Governance for Marketers: Clean GA4 and Privacy First Links

    Adopt a 30-day UTM governance plan to stop GA4 fragmentation. Enforce naming rules, validate tagged links, and use privacy-first short links and QR workflows.

  3. Best URL Shortener in 2026: the Buyer's Shortlist

    The best URL shorteners in 2026, ranked on price, custom domains, link limits and analytics history, with the plan numbers from each vendor's pricing page.

Short links on your own domain. Free to start.

Links, QR codes and click analytics for your team. No visitor IP address is ever stored.