utm_medium Parameter: How to Categorize Traffic Channels in GA4

The utm_medium parameter is the channel category — the how of your traffic. Where utm_source names who sent the traffic (linkedin, google), utm_medium classifies the mechanism: cpc, email, social, referral. GA4 uses utm_medium — in combination with utm_source — to route sessions into its default channel groups (Paid Search, Email, Organic Social, etc.). A wrong medium value doesn't just misclassify one session: it shifts all of that channel's traffic into the wrong bucket in every acquisition report, inflating some channels and deflating others.

Four medium value blocks (cpc, email, social, referral) connected by dashed lines to a central utm_medium label, showing how each value maps to a different GA4 channel group.

What utm_medium is for

utm_medium classifies the marketing channel type — the category of how a link was distributed. It answers: "what kind of channel is this?" It's the second parameter GA4 evaluates when assigning channel groups, after utm_source. Getting it right is what makes GA4's Traffic Acquisition report actually reflect your real channel mix.

The three required UTM parameters each occupy a different level of specificity:

utm_source — who sent it (specific)
Names the exact referring platform or publisher: linkedin, google, newsletter. See the utm_source parameter guide for the full breakdown.
utm_medium — how it was sent (categorical)
Names the channel category: cpc, email, social, referral. This is the classification that GA4 uses for channel group routing. Multiple sources can share the same medium (both google and linkedin can have utm_medium=cpc).
utm_campaign — why it was sent (initiative)
Names the marketing initiative the link belongs to. Shared across all channels in a campaign. See the utm_campaign parameter guide.

A useful mental model: utm_source=linkedin + utm_medium=cpc tells GA4 "this was a paid ad on LinkedIn." Either parameter alone is ambiguous — LinkedIn also has organic posts and InMail, and cpc could be Google or Bing. The combination is what makes the attribution specific enough to route correctly.

utm_medium values and GA4 channel groups

GA4's default channel groups use a set of conditions based on utm_source and utm_medium to classify sessions. These are the medium values that map cleanly to each standard channel group:

utm_medium value Example utm_source GA4 default channel group
cpc google, bing Paid Search
cpc or paid-social linkedin, facebook, tiktok Paid Social
email newsletter, mailchimp Email
social twitter, linkedin, reddit Organic Social
referral Partner site, blog name Referral
affiliate Affiliate network name Affiliates
display google, ad network name Display

GA4 evaluates these conditions in priority order — Paid Search is evaluated before Organic Search, for example. If utm_medium doesn't match any condition for a given source, the session may fall into "Unassigned." This is why using non-standard values like utm_medium=paid or utm_medium=ad can lead to misclassified sessions even when the source is correct.

Common utm_medium mistakes

Using "paid" instead of "cpc"
utm_medium=paid is intuitive but not a standard value GA4 recognises for Paid Search or Paid Social channel routing. Use cpc for cost-per-click paid channels (Google Ads, LinkedIn Ads, Facebook Ads). Some teams also use paid-social specifically for social ad campaigns — this is increasingly common and GA4's channel conditions have been updated to recognise it alongside cpc for social sources.
Using the platform name as the medium
utm_medium=linkedin confuses source and medium. The medium should classify the channel type, not name the platform. utm_source=linkedin&utm_medium=social for organic LinkedIn posts, or utm_source=linkedin&utm_medium=cpc for LinkedIn Ads, is correct. Putting the platform in both parameters causes GA4 to misclassify the channel group.
Leaving utm_medium blank on email sends
Email clicks without UTM parameters show up as "Direct" in GA4 — the email client strips the HTTP referrer. Email is one of the highest-volume UTM use cases precisely because the referrer is unreliable. Always tag email links with utm_medium=email.
Inconsistent paid social medium values
Teams often mix utm_medium=cpc and utm_medium=paid-social across different campaigns or team members. Both can work for Paid Social routing in GA4 when paired with a social source, but mixing them produces two separate rows in reports for what is effectively the same channel. Pick one and enforce it across the team.

Building utm_medium links from the CLI

The mlz build command takes a --medium flag. It normalises the value to lowercase and appends it correctly in the output URL. Here are examples for the four most common channel types:

mlz build — four channel types with correct medium values
# Paid search (Google Ads)
$ mlz build \
  --url "https://example.com/landing" \
  --source "google" \
  --medium "cpc" \
  --campaign "q2-launch-2026"

{
  "tracked_url": "https://example.com/landing?utm_source=google&utm_medium=cpc&utm_campaign=q2-launch-2026",
  "params": {
    "utm_source": "google",
    "utm_medium": "cpc",
    "utm_campaign": "q2-launch-2026"
  }
}

# Email newsletter
$ mlz build \
  --url "https://example.com/landing" \
  --source "newsletter" \
  --medium "email" \
  --campaign "q2-launch-2026"
"tracked_url": "...?utm_source=newsletter&utm_medium=email&utm_campaign=q2-launch-2026"

# Organic LinkedIn post
$ mlz build \
  --url "https://example.com/landing" \
  --source "linkedin" \
  --medium "social" \
  --campaign "q2-launch-2026"
"tracked_url": "...?utm_source=linkedin&utm_medium=social&utm_campaign=q2-launch-2026"

# Partner blog referral
$ mlz build \
  --url "https://example.com/landing" \
  --source "partner-blog" \
  --medium "referral" \
  --campaign "q2-launch-2026"
"tracked_url": "...?utm_source=partner-blog&utm_medium=referral&utm_campaign=q2-launch-2026"

Each combination maps to a different GA4 default channel group. You can validate that the destination is ready for traffic from each channel by adding --validate to any of these commands — it checks SSL, resolution, and redirect chain at build time.

How GA4 evaluates utm_medium for channel grouping

GA4's default channel group conditions check utm_medium against a set of regex-style rules. The conditions run in priority order — if a session matches multiple groups, the first match wins. A simplified view of the most common conditions:

  • Paid Search: utm_medium matches cpc, ppc, paidsearch — and utm_source matches a known search engine (google, bing, yahoo, etc.)
  • Paid Social: utm_medium matches cpc, paid-social, paid_social — and utm_source matches a known social platform (linkedin, facebook, tiktok, twitter, etc.)
  • Email: utm_medium matches email, e-mail, e_mail, newsletter
  • Organic Social: utm_medium matches social, social-network, social_network — and utm_source matches a known social platform
  • Referral: utm_medium matches referral, app, link
  • Affiliates: utm_medium matches affiliate, affiliates
  • Display: utm_medium matches display, banner, cpm

Sessions that don't match any condition are assigned to "Unassigned." If you see unexpected "Unassigned" sessions in your GA4 acquisition reports, the most common cause is a non-standard utm_medium value that doesn't match any channel group condition.

You can define custom channel groups in GA4 to handle non-standard mediums — but it's simpler to use standard values from the start. The mlz build CLI doesn't restrict your input, but a documented taxonomy that enforces standard medium values prevents this problem entirely.

FAQ

Is utm_medium required?
GA4 only strictly requires utm_source for basic attribution, but without utm_medium, GA4 cannot route the session to the correct channel group. Sessions without a medium value are typically assigned to "Unassigned" or attributed to "Direct." For any campaign link, include both utm_source and utm_medium.
Should I use "cpc" or "paid-social" for LinkedIn Ads?
Either can work for routing sessions to the Paid Social channel group in GA4 when paired with utm_source=linkedin. "cpc" is the original standard; "paid-social" is more descriptive and increasingly preferred for paid social campaigns to distinguish them from paid search in the same medium column. Pick one and use it consistently across your team. If you're just starting out, "cpc" has the longest track record with GA4's channel conditions.
Can utm_medium be the same for different sources?
Yes — multiple sources can share the same medium. utm_source=google&utm_medium=cpc and utm_source=linkedin&utm_medium=cpc are both valid. GA4 evaluates the source-medium combination together when assigning channel groups — the same medium routes to different channels depending on which source accompanies it.
What medium value should I use for SMS campaigns?
GA4 doesn't have a built-in "SMS" channel group, but you can use utm_medium=sms and it will appear as a recognisable value in reports. If you want it to route to a specific channel, you'll need to create a custom channel group in GA4 that matches utm_medium=sms. Some teams route SMS traffic to "Email" using utm_medium=email since both are direct push channels — but this muddies the channel split. Better to track SMS distinctly and add a custom channel group.
Does utm_medium affect landing page experience?
Not directly — utm_medium is a tracking parameter and has no effect on page rendering or routing. However, some landing page tools and CMS platforms read UTM parameters to personalise content (e.g., showing different copy to visitors arriving from email vs. paid social). Check your landing page tool's documentation if you're doing UTM-based personalisation.

Build utm_medium links from the terminal

Pass --medium "cpc" (or email, social, referral) to mlz build and get a normalised, validated URL in one command. Values are lowercased automatically so GA4 receives consistent channel category data every time.

npm install -g missinglinkz

Free plan: 50 links/month. No credit card. See the UTM tracking for developers guide for the full programmatic workflow.