utm_source vs utm_medium: the rule that fixes most GA4 attribution

The most common UTM mistake is putting the channel name in utm_medium. Here is how the two parameters work plus a lookup table that keeps grouping clean.

Trakl Team4 min read
On this page+

The single mistake that creates more messy GA4 reports than any other is putting the channel name in utm_medium. utm_medium=facebook instead of utm_medium=social. Every time someone makes that mistake, their Facebook traffic vanishes from the Paid Social row and lands in "Other," which is the GA4 graveyard for misconfigured tags.

Here is the rule, the lookup table that fixes it, and the half-dozen edge cases that come up.

The rule

utm_source is the specific origin of the click. utm_medium is the channel category that origin falls into. One source, one medium, every time.

  • utm_source=facebook and utm_medium=social (Facebook organic post)
  • utm_source=facebook and utm_medium=paid_social (Facebook ad)
  • utm_source=mailchimp and utm_medium=email (any email through Mailchimp)
  • utm_source=linkedin and utm_medium=social (LinkedIn organic post)
  • utm_source=linkedin and utm_medium=paid_social (LinkedIn ad)
  • utm_source=google and utm_medium=cpc (Google paid search)

The source is always specific. The medium is always categorical.

Why GA4 cares about utm_medium specifically

GA4's default channel grouping is built around utm_medium. The exact strings GA4 looks for, in the channels most marketing teams use:

GA4 channel grouputm_medium values it matches
Paid Searchcpc, ppc, paidsearch
Paid Socialpaidsocial, paid_social, social-paid, paid-social
Organic Socialsocial, social-network, social-media, sm
Emailemail, e-mail, e_mail
Displaydisplay, banner, expandable, cpm
Affiliatesaffiliate, affiliates
Referralreferral
Organic Shoppingorganic_shopping
Paid Shoppingpaid_shopping, paidshopping

Any value that does not match these strings goes into "Unassigned" or "Other" depending on the GA4 version. A utm_medium=facebook lands in Other. A utm_medium=paidsocial lands cleanly in Paid Social. The tag is a one-character difference and the report is a different row.

The lookup table that keeps your team aligned

Pin this somewhere. The table below covers roughly 95 percent of marketing channels:

Channelutm_source examplesutm_medium
Google paid searchgooglecpc
Google organicgoogleorganic
Bing paid searchbingcpc
Facebook adsfacebookpaid_social
Facebook organicfacebooksocial
Instagram adsinstagrampaid_social
Instagram organic / bioinstagramsocial
LinkedIn adslinkedinpaid_social
LinkedIn organiclinkedinsocial
TikTok adstiktokpaid_social
Twitter / X organictwittersocial
Reddit organicredditsocial
Reddit adsredditpaid_social
YouTube organicyoutubesocial
Pinterestpinterestsocial
Mailchimpmailchimpemail
Iterable, Klaviyo, Customer.io(vendor name)email
Customer newsletternewsletteremail
Sales rep emailsales-emailemail
Partner blog postpartner-namereferral
Affiliate network(network or affiliate ID)affiliate
Display ad networkgoogle-display, meta-audiencedisplay
Podcast adpodcast-namepodcast
QR scan from printqroffline
SMSsmssms

Two notes:

  1. Use lowercase, hyphens, and underscores. GA4 distinguishes paid_social and paid-social. Both appear in the GA4 channel match list. Pick one and stay consistent. Underscore is more common in GA4 documentation; hyphen reads better in URLs. We default to underscore for the medium values listed above and hyphen for source values.
  2. Use cpc for paid search, paid_social for paid social. This is a GA4 oddity. Paid search uses the historic Google Ads convention cpc. Paid social uses the modern paid_social. Both work; mixing them inside one campaign does not.

The three edge cases that trip teams up

Influencer posts. If a creator posts about your product on their channel, the source is the creator (utm_source=creator-name) and the medium depends on how you compensated them. Paid sponsorship is paid_social. Affiliate commission is affiliate. Earned-media organic mention is referral or social depending on the channel.

Email links inside email. A weekly newsletter contains links. A subscriber clicks. Source is the newsletter platform (mailchimp, klaviyo). Medium is email. So far so good. The trap: when the visitor lands and clicks an internal link on your site, GA4 attributes a new pageview to the original source as long as the session continues. This is correct. The mistake some teams make is appending UTMs to internal site links inside the same session, which breaks the attribution chain.

Cross-domain campaigns. Your campaign sends a visitor from marketing.com to app.com. Without cross-domain measurement enabled in GA4, the second domain shows up as a referrer and the original utm_source and utm_medium get clobbered. Fix: Admin → Data Streams → Configure tag settings → Configure your domains. Add both domains.

The smart-paste shortcut

Manually typing source-medium pairs into a UTM builder is the slowest path to the right answer. The faster path:

  1. Build the URL once for each channel using a builder that enforces the table above.
  2. Save the templates in a shared doc your team works from.
  3. When a new campaign starts, copy the template URL and replace only the utm_campaign value.

The Trakl free UTM builder has the source/medium taxonomy from the table above built into dropdowns. The medium dropdown filters to whatever is valid for the source you picked, so a marketer cannot pick linkedin / cpc even by mistake.

What to do if your historical data is already a mess

Three steps:

  1. Open GA4. Reports → Acquisition → Traffic Acquisition. Group by Source / Medium.
  2. Sort by sessions descending. Look at the top 30 rows.
  3. For every row where medium is not in the GA4 channel list, write down the campaign that produced it.

Now you have a hit list. Going forward, every link your team builds gets the right utm_medium from the start. Old data stays wrong; you cannot fix the past without a republished tracking plan, which is rarely worth it. The point is to stop the bleeding.

For the longer rules around naming, casing, and the team-discipline question, the piece on utm naming conventions is the next read.

Frequently filed

Common questions.

Q.01What is the difference between utm_source and utm_medium?+

utm_source is the specific origin of the click, like facebook, mailchimp, or partner-newsletter. utm_medium is the channel category that origin falls into, like social, email, or referral. One source maps to one medium, every time.

Q.02What happens if I put facebook in utm_medium?+

GA4's default channel grouping reads utm_medium to bucket traffic into Paid Social, Email, Organic Search, and so on. If utm_medium contains a source name like facebook, your traffic falls into the Other channel group and disappears from the report you actually look at.

Q.03Should utm_medium be lowercase?+

Yes. Always. utm_medium=Email and utm_medium=email are two different rows in GA4. Pick lowercase as a team convention and enforce it everywhere your team builds links.

TT

By the byline

Trakl Team

Editorial team

We build Trakl, a link shortener and UTM tracker for marketing teams. We write here from the cleanup work, support tickets, and campaign reviews that fill the rest of our week. Specifics over slogans, and we cite the source.

Photo: 1981 Digital on Unsplash