Open beta — completely free, no card required.
Diagnostics

Unassigned Traffic in GA4: Two Problems, and Only One of Them Can Be Fixed Backwards

Unassigned is where GA4 files a session when no channel rule matches. A source nobody wrote a rule for can be reclassified for every day already collected. A session with no source at all cannot. How to split the row, the exact rule each value missed, and the primary channel group setting that only fixes the future.

By Ivan Pika

Google defines Unassigned in one sentence: "the value Analytics uses when there are no other channel rules that match the event data." Two different kinds of session fail every rule. One arrives with a source and medium that no rule mentions, say weekly-digest / newsletter. The other arrives with no source at all, and Google's page on (not set) finishes that thought itself: "If the session source / medium is reported as (not set), your traffic will be shown as Unassigned in the default channel group as there are no channel rules that match the event data."

Both land in the same row. Only the first can be reclassified for days GA4 has already collected, because a rule needs a source to read.

Split the row before changing anything

Reports → Acquisition → Traffic acquisition, filter the table to Unassigned, add Session source / medium as the secondary dimension. A store over 30 days: 48,200 sessions, 1,012 purchases, $73,250 in revenue. Unassigned holds 6,140 of those sessions (12.7%), 262 purchases and $18,960, a quarter of the revenue.

Session source / mediumSessionsPurchasesRevenueWhy no rule matched
weekly-digest / newsletter2,31071$5,180Email wants the medium email
(not set) / (not set)1,960158$11,370No source to match against
partner-blog / partnership74012$880Referral wants referral, app or link
podcast-show / audio-ad5209$650Audio wants exactly audio
store-texts / text41011$790SMS wants exactly sms
qr / packaging2001$90No default channel covers print

Five rows are rule misses: 4,180 sessions, 104 purchases, $7,590. One row has no source: 1,960 sessions carrying 60% of the Unassigned revenue and converting at 8.1% against a site rate of 2.1%.

GA4 Unassigned traffic split by cause for one store over 30 days: 4,180 of 6,140 Unassigned sessions carry a real source and medium that no default channel rule matches, while 1,960 are (not set) with no source, and by revenue the split reverses to 7,590 against 11,370 dollars

Why newsletter misses Email by one word

Email, Affiliates, Audio, SMS, Referral and Display all match exact values, and the definitions "aren't case sensitive and can't be edited." Email is "Source = email|e-mail|e_mail|e mail OR Medium = email|e-mail|e_mail|e mail". Email passes. newsletter and email-flow do not. Audio is "Medium exactly matches audio", so audio-ad misses. SMS is "Source exactly matches sms OR Medium exactly matches sms", so text misses. Affiliates is "Medium = affiliate", so the plural misses.

Some misses never reach Unassigned at all. Paid Social needs a source on Google's list of social sites and a medium matching ^(.*cp.*|ppc|retargeting|paid.*)$. A Reddit campaign tagged utm_source=reddit&utm_medium=social_paid fails the regex, then Organic Social takes it on the source alone. The spend lands in a free channel and the Unassigned row never moves.

Why common UTM mediums fall into GA4 Unassigned: newsletter misses Email, partnership misses Referral, audio-ad misses Audio, text misses SMS, affiliates misses Affiliates, and a paid Reddit campaign tagged social_paid misses Paid Social and lands in Organic Social

A custom channel group reclassifies the days already collected

"Custom channel groups can be applied to your reports retroactively." That is Google's help for the feature, and it covers all five rule-miss rows.

Admin → Data display → Channel groups → Create new channel group, which starts as a copy of the default. Edit the copied Email channel to also accept medium newsletter, then add channels for partnership, audio-ad, text and source qr. Order decides ties: "Traffic is included in the first channel whose definition it matches given the current order of channels in the group." A standard property gets two custom groups of up to 50 channels each, and creating one takes the Editor role. It is the same screen that builds an AI channel from referrer rules.

Pick the new group in the Traffic acquisition dimension picker and the 30 days above read differently. Unassigned drops from 6,140 sessions to 1,960, from 12.7% to 4.1%. Email goes from 3,050 sessions to 5,360 and from 118 purchases to 189. The newsletter had been sending 43% of Email's real sessions into a row nobody credits.

The setting that looks like the fix only works forward

The top of the Channel groups page has a primary channel group switch, and the Data API reference says what it controls: "Primary channel groups are the channel groups used in standard reports in Google Analytics." Google's page for the same feature describes what promoting a group there does: "Data will populate using the new criteria from that point forward."

Picked as a dimension, the group reclassifies history. Promoted to primary, it reclassifies nothing before the day of the switch, and every standard report on the primary group now carries a seam: 12.7% Unassigned before the date, 4.1% after. Compare the quarter across that date and the business appears to have gained 2,310 email sessions a month.

GA4 Unassigned share over 12 weeks for one store: the default channel group stays near 12.7 percent, the custom channel group picked as a dimension reads about 4.1 percent for every past week, and the primary channel group drops to 4.1 percent only from week 9 when the custom group is promoted, because the primary group populates forward only

The custom group also stops short in four places. "Custom Channel Groups aren't available in the BigQuery Export Schema." An edited group changes audience eligibility "going forward" and "isn't applied retroactively." Google says "it's not currently possible to use custom channel groups in the Key events paths report." And on 360, expanded data sets keep referring to the earlier definition. Everything downstream of those sees newsletter as Unassigned until the UTM itself changes.

Use the custom group as a picked dimension for anything backward-looking, and promote it to primary only with the switch date written down. Then rename the medium in the sender's UTM template. A renamed UTM works only from the day it ships, and it is the one fix the BigQuery export and audiences can see.

(not set) / (not set) has nothing to reclassify

Every channel rule reads traffic-source fields, and a (not set) session has none to give. Session source / medium "will report (not set) for sessions where the automatically collected event session_start is missing", which "can happen if your Google Analytics config tag trigger isn't set to use the 'Initialization' trigger type."

Two consent mode mistakes produce the same row. Using the default command where update belongs, after which "the initial event with the session_start parameter is lost." And sending events with denied consent after the user granted it: those "are treated as a separate session, which won't have a session_start event."

The Measurement Protocol is a third route, documented on the developer side: "creating a new session_id creates a new session without the need to send session_start." A server that sends purchase with a freshly generated session_id opens a session with no session_start, so no source and no channel. Server-side tagging that forwards events under a session_id the browser never had ends in the same row.

Landing page separates them. Google reports landing page as (not set) "when a session doesn't have a page_view event." In the example, 160 of the 1,960 sessions have a (not set) landing page, and they hold 149 of the row's 158 purchases, close to one purchase per session. A purchase with no page view in its session was sent outside the page flow, by a server or as a denied-consent event after the visitor had granted. The other 1,800 sessions have real landing pages and 9 purchases: the visitor browsed and the start of the session was lost, which is what the Initialization trigger and default command mistakes leave behind. The release log for the week the row started growing says which one shipped.

Either route puts the purchase in a different session from the checkout that led to it. The browser session keeps its real source and shows a checkout that never completed, so whichever channels drove those orders are short 149 purchases and $10,720.

No rule recovers any of it for past days. The server fix is to send the browser's own client_id and session_id, with events "received by Google Analytics within 48 hours of the original client-side event timestamp." The tag and consent fixes are the Initialization trigger and the update command. Each works from its release date and not a day earlier.

Direct and Unassigned break in different places

Direct requires source exactly (direct) and medium (not set) or (none). A Direct session was collected whole and arrived with nothing to attribute, a typed URL or a referrer stripped in transit. A (not set) Unassigned session lost its own start. A jump in Direct is an attribution question, the one behind Direct overreporting and self-referrals. (not set) Unassigned climbing points at the last release that touched collection.

Spikes read by date, and the last two days do not count yet. Google says "data processing can take 24-48 hours", and intraday data carries "temporary gaps in some event-scoped traffic source dimensions, such as source, medium, campaign, and default channel group." Past that window, a new source / medium row appearing on the spike day is a campaign someone tagged by hand, and a custom group recovers it. (not set) climbing with (not set) landing pages points at a server-side release or a consent change. (not set) climbing with real landing pages points at the tag trigger or the consent command. Stores on Google Merchant Center see a fourth pattern: Google notes (not set) "for sessions with the srsltid parameter, when the referrer is not google.com", from shared product URLs that kept Merchant Center's parameter, and "these sessions are not classified as organic." Google's same page lists unlinked Google Ads accounts and missing auto-tagging too, but under the Google Ads dimensions in Advertising reports, not session source / medium.

If total sessions fell rather than shifting between channels, start from a real drop versus a tracking glitch instead. A row named (other) is a different thing again: the cardinality roll-up, one of the edits GA4 makes after collection.

The one table that settles it

Unassigned by session source / medium and landing page, 90 days, with purchases and revenue. That table is one question through a connector. We built ConvRadar as a hosted GA4 MCP server, and it syncs session source / medium alongside landing page and event name every day. It reads the property and changes nothing, so the channel group itself is still yours to build. The prompt: "Break my Unassigned sessions for the last 90 days down by session source / medium and landing page, with purchases and revenue. For each row, name the default channel rule it missed, and mark whether a custom channel group can reclassify it or the session has no source at all."

The top line of that table decides the afternoon. A medium with a word in it is one channel rule, and the history comes back with it. (not set) is a ticket for whoever ships the tag, and every day before their release stays Unassigned.