UTM Parameters: The Complete Guide for Marketers (2026)
What UTM parameters are, how the five tags work, and the naming rules that stop reports turning to mush. A plain-English guide for marketers running real campaigns.
Muzahid Maruf, Founder · TrackRev.io & Contant.io
On this page
- 01What UTM parameters are
- 02The five UTM parameters explained
- 03How to build UTM-tagged links
- 04UTM naming conventions that survive reality
- 05Common UTM mistakes — and how to fix them
- 06How to read UTM data in your reports
- 07What the data looks like once it's clean
- 08When you don't need UTMs
- 09TrackRev and UTM tracking
UTM parameters are the five short tags you add to a URL — utm_source, utm_medium, utm_campaign, utm_content, utm_term — that tell your analytics tool where a visitor came from. They are simple to add, free to use, and quietly the difference between a marketing report you can act on and one that credits everything to "Direct" or "Unknown."
Across TrackRev workspaces, teams that ship clean UTM-tagged links recover attribution on 30–40% of revenue that untagged setups silently misclassify — a finding broadly consistent with HubSpot's State of Marketing report, which finds attribution is one of the top measurement challenges for marketing teams. The catch is that UTMs only pay off if they're spelled the same way every time and captured before the browser strips them. This guide covers what each parameter does, how to build links that survive real-world conditions (Safari ITP, iOS 17 link tracking protection, email confirmation hops), and the naming rules that keep your reports comparable across quarters.
Key Takeaways
- UTM parameters are five querystring tags —
utm_source,utm_medium,utm_campaign,utm_content,utm_term— that tell your analytics where a click came from. They've been the web standard since 2005. - Spelling drift is the silent killer:
Newsletterandnewsletterbecome two separate sources in most dashboards. Lock the vocabulary in a shared list — or, better, in dropdowns — so nobody types from memory. - UTMs only identify clicks, not revenue. To attribute Stripe charges to a UTM source you have to carry the values forward at three steps: cookie at click, user record at signup, Stripe metadata at checkout.
- iOS 17 link tracking protection strips UTM parameters from Safari URLs. Server-side capture (read the UTMs on your tracking domain before the browser ever sees them) is the only way to keep iOS attribution intact.
What UTM parameters are
UTM parameters are five standard querystring tags appended to a URL that identify the source, medium, campaign, content, and search term that drove a click.
The format hasn't changed since Google added it to Urchin in 2005 — which is why every analytics tool on earth, from GA4 to Mixpanel to HubSpot to TrackRev, reads them by default. The whole stack agreed on the names so marketers wouldn't have to.
All five parameters are optional. A link with just utm_source still gets attributed; a link with all five gives you the precision to compare two banners inside the same campaign. The tradeoff isn't "more parameters = better" — it's "only as many as you'll actually use in reports." Adding utm_term to organic links you'll never filter by is noise.
Anatomy of a UTM-tagged URL
Everything after the ? is the querystring. Each utm_* parameter is a key/value pair separated by =, and multiple parameters are joined with &. A full example:
https://example.com/pricing ?utm_source=newsletter &utm_medium=owned-email &utm_campaign=product-launch-jun26 &utm_content=header-cta &utm_term=The destination page (/pricing) is what the visitor sees. The querystring is read by your analytics on landing, then can be stripped from the URL bar for a cleaner UX without losing the data — most tools snapshot the values into a session or cookie before the URL ever changes.
The five UTM parameters explained
Each parameter answers a different question. Confusing them is the most common cause of unreadable reports — and it happens silently, because every tool will accept whatever you put in any field. The discipline is on you.
| Parameter | What it tracks | Good example | Bad example |
|---|---|---|---|
utm_source | The specific platform or origin | newsletter | email (too generic) |
utm_medium | The channel type for grouping | owned-email | email (collides with source) |
utm_campaign | The specific initiative or push | product-launch-jun26 | campaign1 |
utm_content | Link variant or placement | header-cta | link |
utm_term | Paid-search keyword only | stripe attribution tool | (leave blank for non-paid) |
The five standard UTM parameters and the question each one answers.
utm_source: the specific platform
utm_source names the exact origin of the click — not the channel category. newsletter, youtube, partner-acme, twitter, google. Be precise. email is wrong here because two months from now you won't remember if it was the onboarding sequence, the weekly newsletter, or a one-off broadcast — and the report can't tell you either.
If you sponsor two podcasts, give each one its own source: podcast-acme, podcast-beta. Aggregation across them is what utm_medium is for.
utm_medium: the channel type
utm_medium groups sources into channel categories so you can ask "how is paid social doing?" without summing twelve different utm_source rows by hand. Use a fixed, internal vocabulary: cpc, owned-email, affiliate, organic-social, paid-social, sponsorship, referral.
The single biggest mistake is letting utm_medium drift into duplicating utm_source. utm_source=newsletter&utm_medium=email is fine. utm_source=email&utm_medium=email is a destroyed report — you've answered the same question twice and lost the ability to group.
utm_campaign: the initiative
utm_campaign names the push — the launch, the sale, the seasonal push, the webinar series. The trick is versioning. summer-sale looks fine the first time you run it, then collides with itself a year later and you can't compare 2026 to 2025 without a spreadsheet hack. Bake the month-year (or quarter) into the name from day one: summer-sale-jun26, product-launch-jun26, q3-webinar-series. Future-you will thank present-you.
utm_content: the variant
utm_content distinguishes link placements or creative variants within the same campaign — the header CTA versus the footer link, banner A versus banner B, the in-line link versus the button. This is what makes A/B-style decisions possible: same campaign, different content values, compare the conversion rates.
Common patterns: header-cta, footer-link, inline-text-1, banner-blue, banner-orange. Keep the values short and self-describing — they show up in dashboards, and "banner-blue" reads at a glance where "v3_b_blue_2026Q2" doesn't.
utm_term: paid-search keywords only
utm_term was built for one job: capturing the keyword that triggered a paid-search ad. Google Ads can auto-populate it via {keyword}, as documented in Google's URL parameters reference; most other channels don't need it. Leave it blank everywhere except paid search and stop debating what to put in it — there's no scenario where utm_term=newsletter-link earns its keep in a report.
The five parameters in one sentence
Source is where the click came from. Medium groups sources into channel types. Campaign names the initiative. Content separates variants within a campaign. Term captures paid-search keywords — and is blank otherwise.
How to build UTM-tagged links
There are three honest options: build them by hand, use a builder, or have your link-tracking tool generate them. All three produce the same URL — the choice is purely about how much discipline you trust your team to hold.
By hand
For a single one-off link, hand-typing is fine. Append ? to the destination, then the parameters joined by &. Lowercase, hyphens for spaces, double-check every separator.
https://example.com/pricing?utm_source=newsletter&utm_medium=owned-email&utm_campaign=product-launch-jun26&utm_content=header-ctaWith a UTM builder
Google's Campaign URL Builder fills in the parameters via a form and outputs the URL. Useful for occasional tagging; not enforceable. Any team member can ignore the builder, type a link from memory, and re-introduce inconsistency. The reports won't tell you who broke them — they'll just stop aggregating cleanly.
For most marketing teams, the bottleneck isn't typing UTMs; it's making sure everyone uses the same spelling. A builder helps the user who opens it. It does nothing for the user who doesn't.
With a link-tracking tool
Tools like TrackRev bake the UTMs into every branded short link at creation time. The creator picks the source/medium/campaign from dropdowns populated by your internal vocabulary, the short link is generated, and the long URL with the correct UTMs is what visitors land on. Misspellings become impossible because the values come from a list, not a textbox.
This is also the point at which UTM data starts feeding revenue attribution rather than just click counts — see UTM parameters and Stripe for the technical hand-off from click to charge.
UTM naming conventions that survive reality
The whole point of UTMs is aggregation: "how much revenue did the newsletter drive this quarter?" The aggregation only works if every link wrote utm_source=newsletter the same way. The four rules below come from watching reports collapse under inconsistency.
- Lowercase only.
Facebook,facebook, andFaceBookare three different sources in most tools — and your dashboards will silently split them into three rows. - Hyphens, never spaces. A space becomes
%20on the URL and shows up assummer%20salein reports. Pick one separator (hyphens are friendlier to read than underscores) and never deviate. - Version your campaigns by date.
product-launch-jun26, notlaunch. Six months from now you will have a second launch and zero way to compare. - Keep a shared list of allowed values. A single source of truth — a spreadsheet, a Notion page, or a tool's dropdown — so the canonical spelling isn't decided by whoever needs a link first.
A naming template you can copy
Lock in a template once and the team stops debating it. A pattern that holds up across SaaS, e-commerce, and creator businesses:
| Parameter | Convention | Example |
|---|---|---|
utm_source | exact platform or partner, lowercase | newsletter, youtube, partner-acme |
utm_medium | fixed internal vocabulary | cpc, owned-email, affiliate, sponsorship |
utm_campaign | {initiative}-{monthyear} | summer-sale-jun26, q3-webinar-series |
utm_content | placement or variant, hyphenated | header-cta, banner-blue |
utm_term | paid-search keyword or blank | stripe attribution tool or empty |
A reusable template. Keep it in a shared doc; every link follows it.
Common UTM mistakes — and how to fix them
Four mistakes cause the majority of broken UTM data. The first two are formatting; the second two are architectural and quietly cost you the most.
Mixed case and encoded spaces
Most analytics tools treat parameter values as case-sensitive: utm_source=Newsletter and utm_source=newsletter are two separate buckets. A single inconsistent link can split a year of newsletter clicks into two rows that nobody re-merges. Same for spaces — they get URL-encoded to %20 and read as garbage. Lowercase everywhere, hyphens for spaces, no exceptions.
UTM overwrite on second visit
If a visitor arrives via the newsletter, leaves, and comes back via a paid ad — and your pixel writes UTMs into the same cookie on both visits — the second click silently overwrites the first. Last-touch dashboards now credit the ad; first-touch dashboards lose the newsletter entirely. Fix: implement "first-touch wins" (only write if the cookie is empty), or capture both touches as separate events and let your attribution model apportion credit at reporting time.
Email confirmation strips the chain
Classic failure mode: visitor clicks a UTM-tagged link, signs up, and is sent an email confirmation. The confirmation link lands on your site without UTMs and overwrites whatever cookie value you had. Result: a buyer who was clearly newsletter-driven gets attributed to "direct." Fix: write the UTM values onto the user record at signup itself, before the confirmation round-trip ever happens. The durable identity is in the database; the cookie is just a relay.
Safari ITP and iOS 17 link tracking protection
iOS 17's link tracking protection strips known tracking parameters from URLs in Safari, Messages, and Mail. UTM parameters are explicitly on that list when the link is shared through those surfaces. The mitigation is server-side capture: when your tracking domain receives the request, read the UTMs off the URL before the browser ever does, store them on the server, and redirect to a clean URL. TrackRev's tracking domains do this by default; raw client-side pixels do not.
The mistake that costs the most
Spelling drift. A single team member typing utm_source=Newsletter instead of utm_source=newsletter creates a second row in every dashboard for the next quarter. The fix is structural — dropdowns, not textboxes — not a Slack message asking people to be careful.
How to read UTM data in your reports
Once UTMs are flowing in, the natural next question is where you actually look at them. There are three common surfaces, each with a different trade-off.
GA4: clicks and goals, no revenue by default
GA4 reads UTM parameters automatically and surfaces them under Acquisition → Traffic Acquisition, broken down by session_source, session_medium, and session_campaign. You'll see sessions, engagement rate, and event counts (including conversions, if you've configured them). What you won't see — without custom webhook plumbing — is Stripe revenue. GA4 doesn't talk to Stripe; closing that loop takes either a homegrown bridge or a tool that does it for you.
Stripe metadata: revenue, but only if you wire it
Per Stripe's metadata documentation, you can attach up to 50 key/value pairs as metadata on every Checkout Session, PaymentIntent, and Customer (keys up to 40 characters, values up to 500). If you write utm_source, utm_medium, and utm_campaign into the metadata at checkout time, every payment becomes attributable. The full hand-off is in UTM parameters and Stripe; the broader revenue picture is in how to attribute Stripe revenue to marketing channels.
A unified attribution tool
The third option is a tool that captures UTMs at the click, persists them to the user, hands them to Stripe, and shows revenue-by-UTM in one report — without the team writing webhook handlers. TrackRev does this end-to-end; the click-side capture is server-side (immune to iOS 17 stripping) and the revenue side reads directly from Stripe. The point isn't that you can't build it yourself — it's whether "another two days of webhook plumbing" is the best use of your engineering time.
What the data looks like once it's clean
Across TrackRev workspaces, the ordering by click volume is rarely the ordering by revenue. The shape below is typical for SaaS:
| utm_source | Click-to-paid conversion | Revenue per converted visitor | LTV multiple vs platform avg |
|---|---|---|---|
| Newsletter (owned) | 4.2% | $38 | 1.6x |
| Google (paid) | 1.9% | $31 | 1.3x |
| Facebook (paid) | 1.4% | $24 | 1.0x |
| Twitter/X (organic) | 0.8% | $19 | 0.8x |
| Affiliate / partner | 3.6% | $42 | 1.8x |
| Direct | 6.1% | $51 | 2.1x |
Median values from aggregate TrackRev workspace data, 2026.
Two patterns repeat: owned channels (newsletter, affiliate partners) over-index on per-visit revenue, and paid social over-indexes on click volume but under-indexes on LTV. The decision "keep funding what looks busy" inverts once you can read revenue by UTM. For the rationale on which model to apply to that data, see attribution models for SaaS; for the benchmark numbers, marketing attribution benchmarks 2026.
When you don't need UTMs
UTMs are the right tool when you have multiple sources sharing a destination and need to tell them apart. They're overkill — and add visual noise to your URLs — when:
- The destination is only reachable via one channel (e.g. an in-app deep link). The source is implied.
- You're tracking on-site clicks between pages of your own site. Use page-path analytics, not UTMs.
- The link is a permanent navigation link in your header or footer. Tagging it pollutes "direct" traffic with a single repeated source.
If in doubt, ask: "would I ever want to filter a report by this source?" If the answer is no, you don't need the UTM.
TrackRev and UTM tracking
TrackRev makes the UTM discipline structural rather than aspirational. The link tracker bakes the parameters into every short link from a vocabulary you control — no more Newsletter vs newsletter splits. The first-party pixel captures the values server-side, immune to iOS 17 link tracking protection. The Stripe sync pushes them into metadata and reads them back on the webhook, so revenue lands attributed without a separate engineering project.
Related reading: UTM parameters and Stripe covers the click-to-charge hand-off in detail; how to attribute Stripe revenue to marketing channels covers the broader setup; channel LTV is the metric you should be ranking your UTM sources by once revenue is wired in. TrackRev's free tier covers 1,000 events; the paid tier removes the cap. For tool comparisons, see Bitly's revenue tracking gap.
External references: Google's official UTM parameter guide on the Analytics Help Center; Stripe metadata documentation; Apple's developer note on iOS 17 link tracking protection.
Found this useful? Share it.
Frequently asked questions
- UTM parameters are five standard querystring tags appended to a URL that identify the source, medium, campaign, content, and search term that drove a click. The five tags are utm_source (the specific platform), utm_medium (the channel type), utm_campaign (the initiative), utm_content (the link variant or placement), and utm_term (paid-search keyword). They've been the web-wide standard since Google added them to Urchin in 2005, and every analytics tool reads them by default.
- Yes — in most analytics tools, the values are case-sensitive. utm_source=Newsletter and utm_source=newsletter are treated as two different sources, which silently splits a single channel into two rows in your dashboards. The safe rule is lowercase everywhere, applied consistently. Many tools also treat the parameter names (utm_Source vs utm_source) as case-sensitive, so stick to the lowercase form for both.
- UTM parameters identify clicks, not revenue, so the connection to Stripe (or any payment processor) has to be built. The standard pattern: capture the UTM values in a first-party cookie when the visitor lands, copy them onto the user record at signup, then attach them as Stripe metadata when you create the Checkout Session or PaymentIntent. On the webhook, read session.metadata and you have UTM source, medium, and campaign next to the actual charge amount. A tool like TrackRev automates all three hand-offs.
- Partially. iOS 17 link tracking protection strips known tracking parameters — including UTMs — from URLs shared through Messages, Mail, and Safari. The mitigation is server-side capture: when your tracking domain receives the click, read the UTMs off the URL on the server before the browser ever sees them, store them in a session, and redirect to a clean URL. TrackRev's tracking domains do this by default; client-side-only pixels do not.
- No. All five are optional, and you should only use the ones you'll actually filter reports by. utm_source is almost always worth setting. utm_medium is worth setting when you want to group sources into channel types. utm_campaign is worth setting on anything with a defined initiative. utm_content is worth setting only if you'll compare variants. utm_term is for paid search only — leave it blank everywhere else.
- UTM parameters are an open standard readable by every analytics tool — you control the values and your tool reads them by default. gclid (Google) and fbclid (Facebook) are platform-specific click identifiers that the respective ad platform writes into the URL automatically and uses to attribute the conversion back in their own dashboard. The two work in parallel: UTMs feed your own attribution tool, gclid and fbclid feed Google Ads and Meta's reporting. iOS 17 strips gclid and fbclid more aggressively than UTMs.
- Yes. Append them with & instead of ? — for example, https://example.com/pricing?ref=blog&utm_source=newsletter&utm_medium=owned-email. The order of parameters does not matter to analytics tools; they parse by key. The only thing to watch is duplicate keys — if the destination page already uses utm_source for something else (rare but possible), your appended value may overwrite or be overwritten depending on the tool's parsing order.
- Not directly. Google and Bing strip known querystring parameters from canonical URLs and treat the base page as the same content regardless of UTM tags. The only SEO risk is duplicate content if your CMS treats querystring variants as separate pages — fix this by setting a rel='canonical' tag pointing to the clean URL. UTM-tagged links shared on social media will not split your ranking signal as long as canonical is set correctly.
- Google's Campaign URL Builder is the most-used free tool — it fills in the parameters via a form and outputs the URL. UTM.io offers a free tier with a shared link library. For teams that need enforcement (so nobody types a UTM from memory and breaks the report), a link-tracking tool like TrackRev or Bitly bakes the parameters into branded short links from a controlled vocabulary, removing the discipline problem.

Written by
Muzahid Maruf, Founder, TrackRev.io & Contant.io
Muzahid Maruf is the founder of TrackRev.io and Contant.io. He writes about marketing attribution, link tracking, and revenue analytics for SaaS teams.
Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth
Keep reading
Related articles from the TrackRev blog.
