UTM Parameters: The Complete Guide to Campaign Tracking

Learn what UTM parameters are, how to build tagged URLs, naming conventions, common mistakes, and how GA4 reads them — with official Google sources.

May 30, 2026
16 min read
21 views

You launch a campaign across email, Instagram, a paid search ad, and a printed flyer with a QR code. A week later you open your analytics, see a pile of traffic, and ask the one question that matters: where did these clicks actually come from? Without a way to label each link, the answer is usually a vague blur of "Direct" and "Referral" that tells you almost nothing about what worked.

UTM parameters solve exactly this problem. They are small tags you add to the end of a URL so your analytics tool can attribute each visit to a specific source, channel, and campaign. This guide explains every parameter using Google's official definitions, shows you how to build a clean tagged URL step by step, covers the naming conventions that keep your data sane, and explains how Google Analytics 4 (GA4) actually reads your tags — including the rule that quietly sends bad tagging into the "Unassigned" bucket.

What are UTM parameters? (and what UTM actually stands for)

A UTM parameter is a key-value pair appended to a URL's query string. It does not change where the link goes — it simply carries extra information that your analytics platform reads and stores against each session. Add UTMs to a link, share it, and when someone clicks, your reports can tell you the source, medium, and campaign behind that visit.

The meaning of "UTM" — Urchin Tracking Module

"UTM" stands for Urchin Tracking Module. The name comes from Urchin, a web analytics company Google acquired in 2005; its tracking format became the foundation of Google Analytics, and the utm_ prefix stuck around (Wikipedia — UTM parameters). That history matters for one practical reason: UTMs are an open, tool-agnostic convention. They aren't proprietary to Google — most analytics platforms read the same five core parameters.

Anatomy of a tagged URL

Here is a standard tagged URL, structured exactly as Google documents it:

https://example.com/page?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale

Three characters do all the work (Google Analytics Help — Collect campaign data with custom URLs):

  • ? separates the page URL from the parameters (the "query string").
  • = links a key to its value, for example utm_source=newsletter.
  • & separates one key-value pair from the next.

The order of the parameters does not matter to analytics — utm_medium first or utm_source first reads identically. What matters is that the keys are spelled exactly right and the values are consistent.

Manual tagging vs auto-tagging

There are two ways to attach campaign data to a link. Manual tagging means you write the UTM parameters yourself — the method this guide is about. Auto-tagging is a Google Ads feature that automatically appends a gclid (Google Click Identifier) parameter to your ad URLs. According to Google, auto-tagging gives you access to platform-specific dimensions and more detailed data, and when you use both methods together the auto-tagged values take precedence (Google Analytics Help — Traffic-source dimensions, manual tagging, and auto-tagging).

The simple rule: let auto-tagging (gclid) handle Google Ads, and use manual UTMs for everything else — email, organic social, newsletters, partnerships, QR codes, and any link you build by hand.

The UTM parameters explained (one by one)

There are six UTM parameters in common use plus three newer ones introduced for GA4. The definitions below are quoted directly from Google's documentation so you're working from the source, not a paraphrase.

utm_source (required)

Identifies the referrer — where the traffic comes from. Google's examples: "google, newsletter4, billboard" (Google). Use the specific platform or property, not the channel type: instagram, linkedin, spring_newsletter, partner_blog.

utm_medium (required)

Identifies the marketing medium — the type of channel. Google's examples: "cpc, banner, email". This is the single most important parameter to get right, because GA4 uses it to assign your traffic to a channel group (more on that below). Stick to a small, fixed vocabulary: email, social, cpc, referral, affiliate.

utm_campaign (required)

Identifies the specific campaign or promotion. Google's examples: "Product, slogan, promo code, for example: spring_sale". This is your human-readable campaign label — keep it descriptive but consistent, like spring_sale_2026 or black_friday.

utm_term (optional)

Used for paid search keywords. Google defines it simply as "Paid keyword". If you're running paid search and not relying on auto-tagging, this captures which keyword drove the click, for example utm_term=running+shoes. Most non-search campaigns leave it empty.

utm_content (optional)

Used to differentiate between variations of the same link. In Google's words: "Use to differentiate creatives. For example, if you have two call-to-action links within the same email message, you can use utm_content and set different values for each so you can tell which version is more effective." This is your A/B testing parameter — utm_content=header_cta vs utm_content=footer_cta.

utm_id (campaign ID)

Google defines utm_id as the "Campaign ID. Used to identify a specific campaign or promotion. Use the same IDs that you use when uploading campaign data." The distinction between utm_id and utm_campaign trips people up, so here's the practical difference: utm_campaign is a name, and names get renamed. If you change a campaign's name in your ad platform mid-flight, the utm_campaign value can shift and fragment your reporting. A utm_id is a stable identifier that stays the same even when the display name changes (Funnel.io — What's a UTM ID). For data you plan to join with cost imports or keep consistent over months, a stable utm_id is worth the effort.

The newer GA4 parameters

Google has added three optional parameters aimed at GA4 properties (Google):

  • utm_source_platform"The platform responsible for directing traffic to a given Analytics property", for example a media-buying platform that manages budgets and targeting.
  • utm_creative_format"Type of creative, for example: display, native, video, search."
  • utm_marketing_tactic"Targeting criteria applied to a campaign, for example: remarketing, prospecting."

One honest caveat that most guides skip: not every UTM parameter has a matching dimension in the GA4 interface. Analytics Mania notes that utm_source_platform and utm_creative_format are not reported in GA4 (Analytics Mania — UTM Parameters in GA4). You can add the newer parameters to your URLs without breaking anything, but don't assume you'll find a dedicated report column for each one. For most marketers, the five classic parameters plus utm_id remain the workhorses.

Quick reference table

ParameterRequired?What it capturesOfficial example
utm_sourceYesThe referrer / where traffic comes fromgoogle, newsletter4
utm_mediumYesThe marketing medium / channel typecpc, email, banner
utm_campaignYesThe campaign or promotion namespring_sale
utm_termNoPaid search keywordrunning+shoes
utm_contentNoDifferentiate creatives / A/B variantsheader_cta
utm_idNoStable campaign ID1234
utm_source_platformNoPlatform directing trafficsearch_ads_360
utm_creative_formatNoCreative type (not reported in GA4)video
utm_marketing_tacticNoTargeting criteriaremarketing

How to build a UTM-tagged URL (step by step)

Use a UTM builder

The easiest and least error-prone way to tag a URL is a builder that assembles the query string for you. Google offers the free, official Campaign URL Builder for websites, plus a separate GA4 builder for Play Store app links. You fill in the fields, it produces the URL, and you avoid typos in the parameter keys — which is where most tracking breaks. Third-party builders such as UTM.io also work and add features like saved templates, but for a single clean link the official Google tool is all you need.

Build it manually

Building a URL by hand is straightforward once you know the structure. Start with your destination, add ?, then chain the parameters with &:

  1. Start with the clean destination: https://yoursite.com/landing
  2. Add the first parameter after a ?: ?utm_source=instagram
  3. Chain the rest with &: &utm_medium=social&utm_campaign=spring_sale

The finished link, using Google's own manual-tagging example format (Google):

https://yoursite.com/landing?utm_source=instagram&utm_medium=social&utm_campaign=spring_sale

Shorten the tagged URL

A fully tagged URL is long, ugly, and unfriendly to share — especially on social, in print, or as a QR code. That's why most teams run the tagged URL through a URL shortener before publishing it. The short link still carries the UTM data through to your destination, but it reads cleanly and is far easier to drop into a bio, a slide, or a flyer.

Some shorteners include a built-in UTM builder so you can tag and shorten in one step. Minily does this on every link, free, alongside QR code generation for the same link — handy when you're taking a campaign offline. We'll come back to honest limits in the dedicated section below; for now, the point is simply that tagging and shortening belong together in the same workflow.

How GA4 reads your UTMs (default channel grouping)

Adding UTMs is only half the job. Understanding how GA4 interprets them is what separates clean reports from a mess of "Unassigned" traffic.

Where to see UTM data in GA4

In GA4, your manual campaign data shows up under Reports > Acquisition > Traffic acquisition, where you can switch the primary dimension to Session source / medium, Session campaign, and related fields. The values you see there are exactly the strings you put in your utm_source, utm_medium, and utm_campaign parameters — which is precisely why consistency matters so much.

How utm_medium maps to channels

GA4 sorts traffic into a "default channel group" using rules based largely on the medium value. These rules are published by Google (Google Analytics Help — Default channel group). A few of the key ones:

  • Organic Search: a known search engine source, or utm_medium=organic.
  • Paid Search: a known search engine source and a medium matching ^(.*cp.*|ppc|retargeting|paid.*)$ (so cpc, ppc, paid all qualify).
  • Organic Social: a known social source, or a medium in social, social-network, social-media, sm, social network, social media.
  • Email: a source or medium equal to email, e-mail, e_mail, or e mail.
  • Affiliates: utm_medium=affiliate.
  • Referral: a medium in referral, app, link.
  • Display: a medium in display, banner, expandable, interstitial, cpm.

The takeaway: if your medium value doesn't match one of these patterns — say you write utm_medium=newsletter instead of email, or utm_medium=social-post instead of social — GA4 has no rule to place it, and the traffic can land in Unassigned. The fix is almost always to use a recognized medium value and store the finer detail (like "newsletter" vs "transactional") in utm_source or utm_campaign instead.

The "all or nothing" rule

This is the single most important and least-known GA4 behavior. Google states that if any UTM parameter is present on the URL, Google Analytics derives all cross-channel traffic source dimension values from UTM parameters, exclusively (Google). In plain terms: the moment GA4 sees even one UTM tag, it stops inferring the source/medium from the referrer and uses your tags only. So if you add utm_campaign but forget utm_source and utm_medium, GA4 won't fall back to the referrer — those dimensions simply come back empty.

The rule is the reason Google recommends always populating at least source, medium, and campaign together — and ideally utm_id and utm_source_platform as well. Partial tagging is worse than no tagging.

UTM naming conventions (build a system, not a mess)

UTM tags only pay off if everyone tagging links does it the same way. A few conventions prevent the slow rot that turns a year of data into noise.

Pick a case and stick to it

Google is explicit that parameter values are case sensitive"utm_source=google is different from utm_source=Google" (Google). That means Facebook and facebook create two separate rows in your reports, splitting one channel's data in half. The standard fix is to lowercase everything, always.

Separators: hyphens for words, no spaces

Never put spaces in a UTM value — they get encoded as + or %20 in the URL and create inconsistent values. Use hyphens to join words (spring-sale) or underscores if that's your house style — just be consistent. Also avoid characters that have meaning in a query string: &, =, #, and / can break or truncate the URL.

Keep a shared spreadsheet and one owner

The most reliable convention isn't technical — it's organizational. Maintain a shared document that lists your approved source, medium, and campaign values, and put one person in charge of it. When a new marketer needs a link, they pick from the list instead of inventing fb-ads while a colleague uses facebook_paid. A short, governed vocabulary beats clever tagging every time.

Don't tag internal links

Only tag links that bring users to your site from outside. Tagging links between pages of your own site re-attributes the visitor to the internal link and, because of the "all or nothing" rule above, can start a fresh session and corrupt the original source. If you need to track on-site clicks, use event tracking, not UTMs.

Common UTM mistakes (and how to fix them)

Most broken campaign data traces back to a handful of avoidable errors (Usermaven — common UTM mistakes):

  • Inconsistent case. Facebook, facebook, and FaceBook are three different sources to GA4. Fix: lowercase everything.
  • Spaces and special characters. Spaces become +/%20; &, =, #, and / can break the query string. Fix: hyphens only, no special characters.
  • Random medium values. Mixing fb, facebook, and facebook-ads for the same channel fragments reporting and can throw traffic into "Unassigned". Fix: a fixed medium vocabulary mapped to GA4's recognized values.
  • Partial tagging. Adding one UTM and not the others leaves the rest blank because of the all-or-nothing rule. Fix: always include source + medium + campaign together.
  • Tagging internal links. Corrupts attribution and breaks sessions. Fix: external links only.
  • Not testing before launch. A typo in utm_medum won't error — it just silently fails. Fix: click your tagged link once and confirm it appears correctly in GA4's real-time or DebugView before you publish.

UTM tracking with a link shortener

A link shortener and UTMs are complementary, not competing, tools. The UTM carries the campaign data; the shortener makes the resulting link short enough to share, brand, and turn into a QR code. Pairing them is the natural workflow for any campaign that lives outside a single ad platform.

Here is the honest framing: a URL shortener does not replace your analytics platform. It does not do multi-touch attribution, it isn't a substitute for GA4's full reporting, and you should be skeptical of any shortener that claims otherwise. What a good shortener does is make the creation and distribution of a tagged link painless.

On that narrow job, here is where the main options stand, presented neutrally:

ToolFree-plan UTM builder?Free-plan notes
BitlyNo — UTM building is a paid featureFree plan: ~5 short links/month, 2 QR codes/month, no click/scan analytics on free; mature paid analytics + QR ecosystem (Bitly)
TinyURLNoUnlimited link creation on free (no account required), but no analytics on the free tier (Dub comparison)
MinilyYes — built-in on every link, freeFree plan caps at 5 links total; global analytics only on free (clicks, top 3 countries, last 10 clicks); no public API

Read that honestly. Bitly has the most mature paid analytics and QR ecosystem, but its UTM builder is locked behind paid plans (Bitly free plan details). TinyURL wins on free unlimited link creation (no account needed) but offers no analytics on its free tier. Minily includes a UTM builder on every link for free and adds QR codes, geo/device conditional redirects, and CSV export — but the free plan caps at five links total, and there is no public API, no white-label, and no multi-touch attribution. If you need more than a handful of links, our Pro plan lifts the cap and unlocks per-link and per-tag analytics (cities, devices, OS, referrers, all countries, live mode). Pick the tool that fits your actual constraints — you can compare the specifics on Minily vs Bitly.

For a deeper dive into reading the data your tagged short links produce, see our companion guide on how to track link clicks for free.

Frequently Asked Questions

What does UTM stand for?

UTM stands for Urchin Tracking Module, named after Urchin, the analytics company Google acquired and whose tracking format became the basis of Google Analytics (Wikipedia).

What are the three required UTM parameters?

utm_source, utm_medium, and utm_campaign. Google treats these as the core set you should always include together, while utm_term and utm_content are optional (Google).

Are UTM parameters case sensitive?

Yes. Google states that parameter values are case sensitive, so utm_source=google is different from utm_source=Google (Google). Lowercase everything to avoid splitting one channel into multiple rows.

What's the difference between utm_id and utm_campaign?

utm_campaign is the human-readable campaign name, which can change if you rename the campaign. utm_id is a stable campaign identifier that stays the same even when the display name changes, keeping your reporting consistent over time (Funnel.io).

Do UTM parameters affect SEO?

Not when used correctly on external links — UTMs are query parameters, not separate pages. The risk is on internal links: if tagged internal URLs get indexed, they can create duplicate-content variants. Avoid tagging internal links, and use canonical tags so search engines consolidate to the clean URL.

Should I tag internal links with UTMs?

No. Tagging links between pages of your own site re-attributes the visitor and, because GA4 derives all source data from UTMs once any tag is present, can start a new session and overwrite the original traffic source. Use event tracking for on-site clicks instead.

Where do I see UTM data in GA4?

Go to Reports > Acquisition > Traffic acquisition and set the primary dimension to Session source / medium or Session campaign. The values shown are the exact strings from your UTM parameters.

Why do my UTMs show up as "Unassigned" or the wrong channel?

GA4 assigns traffic to channels using rules based mostly on the utm_medium value (Google's default channel group). If your medium doesn't match a recognized pattern — for example newsletter instead of email, or social-post instead of social — GA4 has no rule to place it and may file it under "Unassigned." Use a recognized medium value and put the extra detail in the source or campaign field.

Conclusion: a checklist for a clean tagged URL

UTM parameters are simple to add and easy to get wrong, and the cost of getting them wrong is invisible — your data just quietly degrades. Before you publish your next campaign link, run it through this checklist:

  • All three required tags present: utm_source, utm_medium, utm_campaign.
  • Everything lowercase, hyphens instead of spaces, no & = # / inside values.
  • utm_medium uses a value GA4 recognizes (email, social, cpc, referral, affiliate).
  • Values match your shared naming spreadsheet, not improvised on the spot.
  • External links only — never tag internal navigation.
  • Click the link once and confirm it appears correctly in GA4 before launch.

Get those six things right and your analytics will finally answer the question you started with: where did this click come from? Build the tagged URL with Google's official builder or a shortener that includes one, keep your conventions tight, and let the source documentation — not invented uplift statistics — be your guide.


Found this article helpful?

Join MiniLy to create your own short links and QR codes with detailed analytics.

Unlimited Links
Custom QR Codes
Real-time Analytics

No credit card required