100% Private & Browser Based

Why GA4 Shows Unassigned Traffic

Unassigned is not a channel. It is what GA4 writes down when a session matches none of its channel rules, and in a paid media account the trail almost always starts at the same field, utm_medium, sent together with a utm_source that GA4 does not recognise either.

The link still works. The click still lands. The revenue still happens. It simply gets filed under a bucket nobody reports on, which is why the campaign looks like it delivered nothing.

What Unassigned actually means

GA4 assigns every session a default channel group by running its source, its medium and, for a few channels, its campaign name through a fixed set of rules that Google publishes as the default channel group definitions. The rules are not fuzzy and GA4 does not guess, although they do ignore case. A session lands in Unassigned only when it falls through every rule: the medium is not one GA4 maps on its own, and the source is not on the list of search, social, video and shopping sites that Google maintains alongside the rules.

Three things follow from that:

The rules that decide the channel

Paid channels need both halves of the pair: a source on the right list, and a medium that matches GA4's paid pattern. A medium counts as paid when it contains cp, starts with paid, or is exactly ppc or retargeting. The other channels in the table are decided by one field on its own, as each row shows.

Channel groupWhat GA4 checks, and values that workSeen in the wild instead, and where it lands
Paid SearchA search source such as google or bing, plus a paid medium: cpc, ppc, paidgoogle_ads, sem: Organic Search with utm_source=google
Paid SocialA social source such as facebook, instagram, tiktok or linkedin, plus a paid medium: paid_social, cpc. paidsocial works too, because it starts with paid.facebook_ads, social_paid, meta: Organic Social with utm_source=facebook, because none of them matches the paid pattern
Paid VideoA video source such as youtube, plus a paid medium: paid_video, cpcyoutube_ads: Organic Video with utm_source=youtube
DisplayThe medium alone: display, banner, expandable, interstitial, cpmprogrammatic: Unassigned from a source GA4 does not list
Organic SocialA social source, or the medium alone: social, social-network, social-media, smsocial_network with an underscore: Unassigned unless the source is a listed social site
Emailemail, e-mail, e_mail or e mail as the source or as the mediummailchimp, edm, klaviyo: Unassigned unless the source is email
ReferralThe medium alone: referral, app, linkref: Unassigned from a source GA4 does not list
AffiliatesThe medium alone, exactly affiliateaffiliates, partner, referral_program: Unassigned from a source GA4 does not list

Two details deserve a second look. cpm is on the Display list, but it also contains cp, so with a search, social or video source it meets the paid rule for that source as well, which Google lists ahead of Display. If a programmatic buy must land in Display, use display or banner. And a paid medium from a source on none of the lists, such as the name of a DSP or a publisher, is reported as Paid Other, not as Unassigned.

The pattern in the right hand column is almost always the same mistake: somebody put the platform in the medium field. The platform belongs in utm_source. The medium says what kind of marketing it was.

Rule of thumb: source answers where the click came from, medium answers what you paid for. Facebook is a source. Paid social is a medium.

How to find the broken links

In GA4, open Reports, then Acquisition, then Traffic acquisition. Set the primary dimension to Session default channel group and find the Unassigned row. Then add Session source / medium as a secondary dimension. Every offending value is now listed in front of you, with the sessions each one cost.

What you usually see is a short list: two or three wrong mediums that account for most of the volume. Those are the links to fix first, and they are usually pasted into an ad platform in one place, which means one edit fixes thousands of clicks.

Then repeat the check on the Organic Social, Organic Search and Organic Video rows. A paid looking medium there, such as facebook_ads or google_ads, is spend that a listed source kept out of Unassigned and GA4 filed as organic instead.

The five causes, in the order they show up

  1. A medium GA4 does not map, from a source it does not list. The table above. This is the majority of cases. From a listed source the same medium lands in an organic channel instead, which is harder to spot.
  2. No medium at all. A link built with only utm_campaign, which happens when somebody copies a URL from a report and edits the campaign name. Google documents that a missing parameter is reported as (not set), and unless the source is one GA4 lists, nothing else can place the session in a channel.
  3. Parameters stripped by a redirect. The click goes to a shortener or a redirect chain that drops the query string. Test the final landing URL, not the one you pasted.
  4. A macro that never resolved. The report literally shows {{campaign.name}} as the campaign. The link reached the browser with the placeholder still in it, which means the macro was encoded, misspelled, or placed where the platform does not substitute it. When the placeholder sits in utm_source or utm_medium, that literal text is also what the channel rules see. It matches nothing, so the session keeps only the channel the other field can earn on its own.
  5. Casing drift. The channel rules ignore case, so CPC still counts as paid. The reports do not: Google treats parameter values as case sensitive, so CPC and cpc, or Spring_Sale and spring_sale, appear as separate rows even when the channel is right.

Fixing it without repeating it

Fixing the live links is the easy half. Keeping them fixed is the half that fails, because tagging is done by whoever happens to be launching, in whatever tool they have open.

Three things make it stick:

The UTM builder on this site does all three. It builds one link or one row per channel, it flags a medium that would land in Unassigned and a paid medium GA4 would not count as paid, and its Check a URL tab takes a finished link somebody else built and tells you exactly what is wrong with it. Nothing is uploaded, so it is safe to paste client URLs into.

What Unassigned is not

Two things get blamed for Unassigned that are usually innocent. Consent mode is one: when a visitor refuses cookies the session is modelled, not misfiled, and modelled sessions still carry a channel. Cross domain tracking is the other: a broken cross domain setup shows up as a self referral, not as Unassigned.

If Unassigned appears next to a real source and medium pair in the secondary dimension, the tagging is the problem. If it appears next to (not set), first check whether the links carry utm_source and utm_medium at all, because a missing parameter is reported exactly that way. If they do, look at your consent and data collection setup instead.

Related reading

For what each parameter does and a naming convention worth adopting, read UTM parameters explained for paid media. For the placeholder syntax each ad platform substitutes at click time, read ad platform URL macros for UTM tracking.