If campaigns show up as Direct, source and medium values contradict each other, or the same channel has three spellings across six months of data, UTM parameters are almost certainly part of the problem.

UTMs are the tags added to the end of URLs to tell GA4 where traffic came from. Used consistently, they give you channel comparisons you can base budget decisions on. Used inconsistently, they produce noise that looks like signal.

Download the guide (PDF) · Use the UTM builder

What UTM parameters are.

They're query string tags on a URL. When someone clicks a tagged link, GA4 reads the tags and stores the values against the session. They then appear as dimensions in Traffic acquisition, User acquisition, key event reports and any Exploration you build.

https://www.example.com/sale?utm_source=google&utm_medium=cpc&utm_campaign=brand_search_2026

Everything after the ? is the query string. GA4 reads the UTMs on the page where the user lands and uses them to attribute what happens next.

The five parameters.

Three are needed for useful attribution. Two are optional but useful for detail.

utm_source

The specific platform or origin: where did this visitor come from?

Name the platform or publisher, not the category. Use linkedin, not social. Use customer_newsletter, not email.

Naming rules: always lowercase, underscores between words, and consistent. facebook in one campaign and Facebook in another creates two separate sources in GA4 and splits your data.

Approved values by channel:

  • Paid media: google, bing, facebook, instagram, linkedin, twitter, tiktok, pinterest, reddit, youtube
  • Email: customer_newsletter, prospect_newsletter, promotional_email, transactional_email
  • Referral and partner: partner_[partnername], affiliate_[affiliatename]
  • Other: sms, push_notification, qr_code, direct_mail

utm_medium

The type of channel: what kind of marketing is this?

Where source names the platform, medium groups sources into channel types. GA4's default channel group uses it, together with the source, to decide whether traffic is Paid Search, Paid Social, Email, Organic Social and so on.

This is where most of the damage happens. Invented values such as newsletter instead of email, or social_paid instead of paid_social, either fall outside GA4's channel rules and land in Unassigned, or get read as the wrong channel. It's one of the most common causes of inflated Unassigned or Direct traffic.

The rule: don't invent medium values. Use the approved list:

  • Paid: cpc (paid search), cpm (impression-based display), display (banner advertising), paid_social (paid social), paid_video (paid video)
  • Organic and other: organic (organic search, set automatically by GA4, so don't add it yourself), social (organic social posts), email (all email), referral (partner or referral traffic), affiliate, sms, push, qr

Most of these map to a default channel. qr doesn't: GA4 has no QR channel, so QR traffic shows as Unassigned unless you add a custom channel group for it. That's fine as long as it's deliberate and consistent.

utm_campaign

The specific campaign: which campaign drove this traffic?

Naming matters most here, because this is the value people filter by. campaign1, test or march tells you nothing six months later.

Recommended format:

[initiative]_[audience]_[date]_[geo]_[product]

You can filter on any part of it in Explorations with "contains" or regex conditions. Examples:

  • spring_sale_2026_q2_uk_shoes: seasonal sale, UK market, one product category
  • brand_awareness_prospects_jan2026_global: awareness campaign, prospecting audience, January 2026
  • webinar_customers_2026-03-15_emea: event campaign with an exact date

Naming rules: lowercase, underscores between elements (no spaces), and a date reference in every name, or the data becomes impossible to filter historically. Match the names in your campaign tracking tools so you can join the data later.

utm_term (optional)

Originally the paid search keyword that triggered an ad. Now also used for audience segments, product identifiers or test variants.

For paid search, use utm_term={keyword}: Google Ads fills in the keyword that matched each click, so you get keyword-level data in GA4 without tagging every keyword by hand. For other channels it can hold audience names, product SKUs or other test variables that don't fit utm_content.

utm_content (optional)

Separates links or creative variants within one campaign. Essential for A/B tests.

Use it for creative variants (variant_a, variant_b, carousel_v2), link positions in an email (header_cta, footer_link, body_link) or ad formats within one campaign. Without it, two variants in the same campaign are lumped together with no way to tell which did better.

Channel-by-channel examples.

Email

Email is where UTMs matter most and go wrong most. Tag every link in every email, including transactional emails, which are often missed.

?utm_source=customer_newsletter
&utm_medium=email
&utm_campaign=spring_sale_2026_mar
&utm_content=header_cta

Source names the list or send, medium is always email, campaign names the send with a date, and content shows which link was clicked.

If one campaign goes to several lists, give each its own source (customer_newsletter and prospect_newsletter, not email_list for both). That keeps the split in GA4 without a custom medium.

Organic social

Organic posts often go untagged. Without UTMs, GA4 records the visit as Referral from the platform or, in mobile apps that strip the referrer, as Direct.

?utm_source=linkedin
&utm_medium=social
&utm_campaign=thought_leadership_2026q1

Use the platform as source and social as medium (not social_media, organic_social or linkedin_organic). GA4 maps social with a recognised social source to Organic Social.

Paid social

?utm_source=facebook
&utm_medium=paid_social
&utm_campaign=lead_gen_2026_q2
&utm_content=carousel_v2
&utm_term=warm_audience

paid_social with a social source maps to Paid Social. Use utm_content for creative variants. utm_term can hold audience names (warm_audience, lookalike_30d, retargeting), which gives you audience-level performance in GA4 that the platform's own reporting may not show clearly.

Paid search

Google Ads has its own auto-tagging, using the gclid parameter and the Google Ads link. When gclid is present, GA4 takes source, medium and campaign from Google Ads.

UTMs on the same URL still populate the "manual" dimensions (such as Session manual source), which can look like a discrepancy if you don't know which dimension you're reading.

The usual approach: keep auto-tagging on for the Google Ads integration, and add UTMs for detail auto-tagging doesn't give you, particularly utm_content for ad variants.

?utm_source=google
&utm_medium=cpc
&utm_campaign=brand_search_2026
&utm_term={keyword}
&utm_content=ad_v1

{keyword} is replaced by Google Ads with the matched keyword at click time. cpc maps to Paid Search.

QR codes and offline

QR codes on print, at events or on packaging are a common source of unexplained Direct: the user scans, lands, and GA4 has no referrer. Tagging the URL behind every code turns that into campaign data.

?utm_source=qr_code
&utm_medium=qr
&utm_campaign=event_london_2026_q1
&utm_content=conference_badge

How UTMs appear in GA4.

Traffic acquisition uses session-scoped data: the source, medium and campaign of each session. Use it to see which channels bring visits.

User acquisition uses user-scoped data: the source, medium and campaign that first brought each user. It persists across sessions and shows which channels win new users.

Key events can be broken down by both session and first-user dimensions, which shows the path from first visit to sale or lead.

Explorations let you combine any UTM dimension with any metric: campaign with revenue, source / medium with conversion rate, utm_content with engagement rate to compare creative variants.

Pre-launch checklist.

  • Source, medium and campaign are all present. Missing one breaks attribution.
  • Everything is lowercase. GA4 treats Google and google as different sources.
  • No spaces. Use underscores.
  • No unencoded special characters. &, # and % inside a value will corrupt the URL.
  • The campaign name follows your convention.
  • The medium is on the approved list.
  • The URL loads correctly with the parameters added. Click through, especially where redirects are involved, and check the UTMs survive.
  • The campaign name is recorded in your tracking sheet.

Common mistakes and what they cost.

Mixed case. Google and google are two sources; Email and email are two mediums, so channel data splits across rows.

Spaces in values. A space becomes %20 or + in the URL and may not be read cleanly, so reports can show the encoded character. Use underscores.

Invented medium values. The most damaging mistake. Some variants still match a channel rule (paidsocial starts with "paid", so it counts as Paid Social with a social source), but they split your reports into extra rows.

Others don't match at all: newsletter with an unrecognised source lands in Unassigned, and social_paid with a Facebook source is read as Organic Social.

Generic campaign names. test, email_march or campaign1 are meaningless within weeks. reengagement_lapsed_mar2026_uk tells you exactly what it was.

No utm_content on creative tests. Two variants in one campaign without it are grouped together, and you can't tell which worked.

Tagging only some links in an email. If an email has five links and only the main button is tagged, the other four arrive as Direct. Tag every link and use utm_content for position.

UTMs on internal links. UTMs belong only on links from outside your site. On internal navigation they overwrite the original source for any session that passes through them.

No documentation. Keep a central record (a spreadsheet is fine) of every campaign name, launch date, channel and parameters. Without it, historical data turns into guesswork.

Keeping a team consistent.

One person using paid_social and another paidsocial on the same campaign splits the data.

A minimal setup needs three things:

  1. One approved list of source and medium values, shared with everyone who builds URLs.
  2. A URL builder that enforces the conventions: Google's Campaign URL Builder with saved values, a spreadsheet that builds the URL from dropdowns, or the UTM builder on this site.
  3. A check before launch, where URLs are compared against the approved list.

Larger teams benefit from a formal step: marketers submit URLs with the brief, and marketing operations checks them against the convention before launch. It becomes essential once more than two or three people build URLs independently.

Summary.

The rules are simple. Lowercase everything. Use approved medium values only. Name campaigns clearly, with a date. Tag every external link. Never tag internal links. Write it all down.

The hard part is getting everyone who builds a campaign URL to follow them.

Marc Alexander, a GA4 consultant, writes UTM rules with teams, and the UTM builder helps everyone follow them.