·UTM / UTM Parameters / GA4 / Web Analytics / EC

UTM parameters: 4 patterns that break GA4 channel grouping

Practical UTM guide for EC operators: 5 parameters, naming rules that prevent fragmentation, 4 GA4 misclassification patterns, and a pre-launch checklist.

UTM parameters: 4 patterns that break GA4 channel grouping

"The CV that should have been attributed to ads is showing up under Direct / (none)." "One Meta campaign is split across two rows in GA4." Open the monthly report and you'll find UTM parameter problems quietly breaking the data, every month.

UTM parameters look like a fire-and-forget mechanism, but in practice the moment you put a value GA4's classification logic does not understand, your channel grouping collapses. This article walks through the correct way to use UTM parameters — derived from GA4's official specifications — and the 4 patterns that cause channel classification to fail.

Key takeaways#

  1. There are 5 UTM parameters (source / medium / campaign / term / content). The first three (source / medium / campaign) must be set on every paid URL. Values should always be lowercase, hyphen-separated, no spaces.
  2. 4 patterns cause GA4 to misclassify: ① values not in GA4's official source list, ② case sensitivity and naming inconsistency, ③ medium / source combinations that fail the regex condition, ④ UTM loss through redirects, referrer policies, and in-app browsers.
  3. UTMs identify the source of a visit, not the revenue efficiency of that channel. To compare revenue per channel correctly, you need a session-level efficiency metric layered on top of properly tagged UTMs.

1. What UTM parameters are — the role of each of the 5 fields#

UTM (Urchin Tracking Module) parameters are 5 query-string tags appended to your URL. They embed traffic-source information into the URL itself, telling Google Analytics and other analytics tools which campaign or channel a visit came from.

The 5 parameters GA4 officially recognizes are[1]:

ParameterRequired / optionalWhat it representsWhere it surfaces in GA4
utm_sourceRequiredThe traffic source (e.g. google, facebook, newsletter)"Source"
utm_mediumRequiredThe traffic type (e.g. cpc, email, social)"Medium"
utm_campaignRequiredCampaign name (e.g. spring-sale-2026)"Campaign"
utm_termOptionalSearch keyword (mostly for paid search)"Keyword"
utm_contentOptionalCreative identifier within a campaign (e.g. hero-banner-a)"Ad content"

A typical URL looks like this:

https://example.com/lp/?utm_source=google&utm_medium=cpc&utm_campaign=spring-sale-2026&utm_content=hero-banner-a

GA4 reads the combination of utm_source and utm_medium and applies Google's "Default Channel Group" classification rules to label each session as Paid Search, Organic Social, Direct, etc.[2] If your UTM values don't match those rules, the channel report stops being meaningful from that moment on.

1.1 Distinguishing utm_source and utm_medium#

The most common stumbling block in practice is the difference between utm_source and utm_medium. The basic rule:

  • utm_source = "where the visit came from" (specific platform / site / service name)
  • utm_medium = "what type of visit it is" (paid / email / organic / social / etc.)

Examples:

  • Google search ad → source=google / medium=cpc
  • Newsletter shared on Facebook → source=facebook / medium=social
  • Your own newsletter → source=newsletter / medium=email
  • Yahoo search ad → source=yahoo / medium=cpc

utm_medium answers "is this an ad, organic, email, or social?" utm_source answers "specifically which platform?" Mixing these two up causes most of the channel-classification errors covered in section 3.

1.2 The role of utm_term and utm_content#

These two are optional but become valuable as your operation matures:

  • utm_term: records the bid keyword for paid search ads. Google Ads' auto-bidding and DSAs populate it automatically.
  • utm_content: identifies the creative variant in an A/B test within the same campaign — e.g. "hero image A vs B," "CTA copy X vs Y."

In GA4, utm_term surfaces as the "Keyword" dimension and utm_content as the "Ad content" dimension. Think of them as optional levers for finer-grained reporting.

2. UTM naming rules — inconsistency is what fragments your reports#

The most frequent UTM mistake isn't a technical bug — it's naming inconsistency. When the same campaign carries facebook, Facebook, fb, and meta across different ads, GA4 splits one campaign into four rows, each showing roughly a quarter of the real number. The ad platform reports "campaign-level revenue: 1M JPY," but GA4 shows "facebook 250K / Facebook 250K / fb 250K / meta 250K" — and the report reader is left wondering which one is real.

The three core rules that prevent this:

2.1 Always lowercase#

GA4 stores utm_source values case-sensitively[2]. facebook and Facebook are tracked as separate sources. Just enforcing "everything lowercase" as a team rule eliminates most naming inconsistencies.

2.2 Hyphen-separate, never space, prefer hyphen over underscore#

A value like utm_campaign=spring sale 2026 gets URL-encoded to spring%20sale%202026, and GA4 displays exactly that ugly string in the campaign name field. Use spring-sale-2026 instead. Underscores (spring_sale_2026) technically work but mix poorly with other GA4 metric names — hyphen is the de-facto industry standard.

2.3 Avoid non-ASCII characters#

Including non-ASCII characters like Japanese (utm_campaign=春のセール) results in URL-encoded strings like %E6%98%A5%E3%81%AE showing up in GA4 reports. Stick to alphanumerics and hyphens.

2.4 A naming convention template — share it across the team#

If UTM values are decided ad hoc, three months later nobody remembers who named what. Defining a shared naming convention up front protects long-term report quality.

Channelutm_sourceutm_mediumutm_campaign exampleutm_content example
Google Search Adsgooglecpc2026-spring-sale-searchheadline-a
Yahoo Search Adsyahoocpc2026-spring-sale-yssheadline-a
Meta Ads (Facebook / Instagram)facebookcpc2026-spring-sale-metaimage-a
LINE Adslinecpc2026-spring-sale-linetalkhead-a
Newsletternewsletteremail2026-04-newslettertop-cta
Affiliateaffiliatereferral2026-spring-sale-affpartner-x
Press releaseprtimesreferral2026-04-prtimes
YouTube video descriptionyoutubesocial2026-spring-sale-ytvideo-x

Pick utm_source carefully. GA4 cross-checks the value against its "Source Categories" list and auto-classifies facebook as SOURCE_CATEGORY_SOCIAL.[3] If you use a value that's not in the list (e.g. meta), it falls into Referral instead of Paid Social. For Meta ads in particular, utm_source=facebook is the safe default. The companion article Meta Ads utm_source: what to actually use covers this in detail.

3. The 4 patterns that break GA4 channel classification#

When UTMs are set but the GA4 channel report still doesn't show traffic in the intended channel (Paid Search, Paid Social, etc.), the cause almost always falls into one of these 4 patterns.

#Failure patternWhere it ends up classified
1utm_source value not in GA4's official source list (e.g. utm_source=meta)Referral / (other)
2Case sensitivity / inconsistent naming (facebook / Facebook / fb mixed)Same campaign split across multiple rows
3utm_medium=social + utm_source=facebook triggers OR-condition collisionPaid Social leaks into Organic Social
4UTM lost through redirects / referrer policyDirect / (none)

3.1 Pattern 1: utm_source value not in GA4's official source list#

GA4 channel classification works by matching utm_source values against the "Default Channel Group Source Categories" list distributed by Google[3]. As of April 2026 the list contains roughly 820 source names, with facebook mapped to SOURCE_CATEGORY_SOCIAL, google to SOURCE_CATEGORY_SEARCH, youtube to SOURCE_CATEGORY_VIDEO, and so on.

Putting a value not in the list into utm_source causes GA4 to decide "this isn't social, search, or video either" and bucket the traffic as Referral or (other). A common example is utm_source=meta. Once Meta rebranded, more operators started using this value — but meta is not registered in the source list, so it doesn't classify into Paid Social[3].

What to do:

  • Before launching, check that the utm_source you plan to use exists in the official list
  • Lock major sources to: google / yahoo / bing / facebook / instagram / twitter / line / youtube / tiktok
  • If you must use a value outside the list, define a custom channel group in GA4 with your own classification rules

3.2 Pattern 2: case sensitivity and inconsistent naming#

As mentioned, GA4 treats utm_source values case-sensitively. The common failure mode looks like this:

OperatorValue usedGA4 treatment
AfacebookSOURCE_CATEGORY_SOCIAL
BFacebookSOURCE_CATEGORY_SOCIAL (separate row)
CfbSOURCE_CATEGORY_SOCIAL (yet another row)
DmetaNot classified as social

With four people on the team, one campaign splits across four rows, and one of those rows (meta) drops out of Paid Social entirely. The monthly report shows "Paid Social dropped sharply," but the truth is just that the classification fell off.

What to do:

  • Document the naming convention from section 2.4 and store it in a shared location (Notion, Google Drive) every operator references
  • Standardize on Google's Campaign URL Builder for all URL generation — never hand-typed
  • Implement a 2-step approval flow where one person reviews the URL before it goes live

3.3 Pattern 3: medium and source combination collides with GA4's regex#

GA4 channel classification reads the combination of utm_source and utm_medium, not source alone. The classification logic is published — for example, Paid Social matches when:

  • utm_source matches the social-source list AND utm_medium matches the regex ^(.*cp.*|ppc|retargeting|paid.*)$[2]

The catch is that Organic Social is defined with an OR condition[2]:

  • utm_medium matches social / social-network / social-media / sm OR utm_source matches the social-source list

This means utm_source=facebook + utm_medium=social — a seemingly natural combination — is classified as Organic Social purely because utm_medium=social matches. Paid ad revenue ends up labeled as organic, the Paid Social report goes empty, and ad ROAS is understated.

What to do:

  • For paid social channels — Meta, X (Twitter), LINE — fix utm_medium=cpc
  • Reserve utm_medium=social exclusively for organic posts (Organic Social)
  • Verify the channel classification in GA4's real-time report before launching (covered in section 5)

3.4 Pattern 4: UTM lost through redirects, referrer policy, etc.#

Often overlooked: the UTM is set correctly at launch, but gets stripped somewhere on the path before the user lands on the LP. Common causes[4]:

  • Some URL shorteners drop query strings on redirect
  • HTTPS → HTTP redirects strip the referrer (and the UTM with it) because the browser refuses to send referer to a less secure destination
  • <meta name="referrer" content="no-referrer"> on the LP makes referrer-based source detection impossible across the board
  • In-app browsers (LINE, Facebook) drop referrer / UTM depending on the browser implementation

When the UTM is gone, what was originally a paid visit ends up classified as Direct / (none) or (not set). Operators with Direct above 30% of traffic likely have 10–20% paid CV hidden in there. The companion article GA4 Direct/None: 5 causes that quietly inflate it and how to diagnose has the diagnostic playbook.

What to do:

  • Use a custom-domain shortener (your own server) or simply distribute the long URL with the UTM intact
  • Always serve the LP over HTTPS; never let an HTTPS → HTTP redirect happen
  • Don't set referrer-policy: no-referrer on the LP. If you must restrict referer, choose strict-origin-when-cross-origin instead
  • For each major ad platform, run a pre-launch test access and verify in GA4 DebugView that the UTM landed correctly

4. Generating UTMs — using Campaign URL Builder#

Google's official Campaign URL Builder is a free tool for generating UTM-tagged URLs[5]. Hand-assembling URLs invites typo and whitespace bugs; standardizing on this tool is the realistic move in production.

Workflow:

  1. Open Google Campaign URL Builder
  2. Website URL: full LP URL (https://example.com/lp/)
  3. Campaign ID: (optional) your internal campaign ID
  4. Campaign Source: utm_source value (e.g. facebook)
  5. Campaign Medium: utm_medium value (e.g. cpc)
  6. Campaign Name: utm_campaign value (e.g. 2026-spring-sale-meta)
  7. Campaign Term: (optional, paid search only) bid keyword
  8. Campaign Content: (optional) creative identifier

The fully-formed URL appears at the bottom of the page. Copy it and paste it into the destination URL field of the ad platform — that's it. Removing the manual URL-assembly step structurally prevents whitespace, full-width characters, and typos.

4.1 Meta Ads URL dynamic parameters#

In Meta Ads, you can replace the campaign / ad-set / ad name fields in the URL with Meta's official URL dynamic parameters, which expand to actual values at delivery time[6]:

utm_source=facebook
utm_medium=cpc
utm_campaign={{campaign.name}}
utm_content={{ad.name}}
utm_term={{adset.name}}
utm_id={{campaign.id}}

Macros like {{campaign.name}} are replaced by Meta with the actual campaign / ad-set / ad name when the ad serves. This eliminates the need to hand-write a UTM for every ad and naturally preserves A/B test granularity.

4.2 Google Ads auto-tagging (GCLID)#

In Google Ads, enabling auto-tagging automatically appends a gclid parameter, and ad reports flow into GA4 in their full form even without UTMs[7]. Toggle "Settings → Account settings → Auto-tagging" — this is the de facto standard.

Auto-tagging doesn't conflict with using UTMs. Keeping utm_campaign for internal reporting is convenient when other BI tools (Looker Studio, in-house DWH) consume the same data.

5. Verifying UTMs before launch#

Catching a UTM bug after launch means losing that period's data permanently. Routinizing pre-launch verification is the single best investment in long-term report quality.

5.1 Verify in GA4 DebugView#

GA4's DebugView lets you observe your own session in real time:

  1. Install the GA Debugger Chrome extension
  2. Visit the planned launch URL (a staging environment is fine)
  3. Open DebugView in the GA4 admin and inspect the page_view event
  4. Check that the event detail contains source / medium / campaign with the expected values

If the URL parameters got stripped or the utm_source value is missing from the source list, this is where you catch it.

5.2 Verify channel classification in GA4 Realtime#

Once events are confirmed in DebugView, switch to Realtime in GA4 and check which channel your session is being attributed to. If "User first source / medium" and "Session default channel group" show the intended channel (e.g. Paid Social), the same classification will hold post-launch.

5.3 Verify UTM survival through redirect chains#

For ads using URL shorteners, affiliate links, or your own custom-domain shortener, confirm that the UTM survives to the final LP:

  1. Visit the planned shortened URL in your browser
  2. When the address bar resolves to the final LP, eyeball whether UTM parameters are still attached
  3. If they're missing, revisit the shortener configuration or your own redirect implementation

5.4 Pre-launch checklist#

For day-to-day operations, the following pre-launch checklist dramatically reduces incident rates:

  • All three of utm_source, utm_medium, and utm_campaign are set
  • All values are lowercase and hyphen-separated
  • utm_source is in GA4's official source list, or a custom channel group covers it
  • utm_medium resolves to the intended channel under GA4's classification logic (Paid Search / Paid Social / Email, etc.)
  • The URL was generated via Campaign URL Builder (no hand-typing)
  • DebugView shows the expected source / medium / campaign values
  • Realtime confirms classification into the intended channel
  • For shortener-mediated URLs, the UTM survives to the final LP

6. What UTMs cannot show — measuring revenue efficiency across channels#

UTM parameters identify "what this visit came from." They are not a measure of revenue efficiency. As a report consumer, you'll want a layer above UTMs that compares revenue per channel.

For instance, none of the following questions can be answered by UTMs alone:

  • Which produces higher revenue per session — Paid Social or Organic Search?
  • How many times higher is the email-sourced CV rate vs. paid-search-sourced?
  • If the same budget was redirected to blog SEO, how would long-term revenue efficiency shift?

To answer these, you need to decompose channel revenue as "sessions × CV rate × AOV" and compare revenue per session across channels. We call this metric RPS (Revenue Per Session). Running RPS alongside ROAS lets you separate "ad campaign efficiency" from "site-level revenue efficiency" and judge them independently.

UTM hygiene is the prerequisite for computing RPS correctly. Broken UTMs distort channel classification, which corrupts both the denominator (sessions) and the numerator (revenue). The naming rules, the GA4 classification logic, and the pre-launch verification covered in this article have to be in place first — only then does channel-level revenue efficiency become measurable.

The relationship between ROAS and RPS, the breakeven ROAS computation, and the framework for cross-channel revenue efficiency are covered in detail in The ROAS calculation guide for EC operators. Reading ad-level efficiency in the ad platform's ROAS and reading site-level efficiency in cross-channel RPS — the two-axis approach upgrades EC budget decisions by a meaningful margin.

References#

[1] Google Analytics, "Custom campaigns," 2024

[2] Google Analytics, "\[GA4\] Default channel group," 2024

[3] Google Analytics, "\[GA4\] Default channel group source categories," 2024

[4] W3C, "Referrer Policy," 2017

[5] Google Analytics, "Campaign URL Builder," 2024

[6] Meta for Business, "About URL parameters," 2024

[7] Google Ads, "About auto-tagging," 2024

See which ads actually drive revenue, at a glance

14-day free trial. No credit card required. Up and running in 5 minutes.

Start 14-day free trial

UTM parameters: 4 patterns that break GA4 channel grouping | RevenueScope