Open the Traffic acquisition report on a site nobody has audited recently and you will find some mixture of (not set), (direct) / (none), Unassigned and (other).
They look like one problem with four spellings. They are four distinct failures at four different stages of the pipeline, and the fix for one does nothing for the others. Teams lose weeks re-tagging their site to solve something that was a five-minute change in a report setting.
The four, and where each one happens
| Label | What it means | Where it fails | Fix layer |
|---|---|---|---|
(not set) | field never populated | collection | tags / GTM |
(direct) / (none) | no source signal arrived at all | the visit itself | link tagging |
Unassigned | source captured, matched no channel rule | classification | channel grouping |
(other) | row collapsed by cardinality limits | reporting | report design |
Read that column on the right first. It tells you which team even owns the problem.
(direct) / (none) — nothing arrived
The session came in with no UTM parameters, no Google click identifier, no usable referrer, and no first-party cookie from an earlier tagged visit. GA4 is not hiding the source. There was none to record.
Causes, roughly in order:
- Untagged links. Email footers, PDFs, QR codes, partner placements, the link somebody pasted into Slack.
- Redirects that strip query strings. A URL shortener or a security rule drops
?utm_*orgclidbefore the tag reads it. - In-app browsers and iOS privacy features eating the click identifier.
- Consent denied before the hit fired, so no cookie exists to connect this session to a previous tagged one.
- Genuine direct traffic — bookmarks, typed URLs. Some of this is real and always will be.
How much is too much? Ten to twenty percent is normal. Above 20% is worth a look. Above roughly 40%, your channel analysis has collapsed — untagged paid traffic is sitting inside direct, which means your organic looks better than it is and your paid ROAS looks better than it is. That second one costs real money.
(not set) — arrived, but blank
Different failure. The hit reached GA4; the dimension was empty when it did.
The classic version is a tag firing before the URL resolves in a single-page app, so the page path or the campaign parameters are not there yet at read time. Over-broad referral exclusions, consent blocking the cookies GA4 needs, and Safari’s privacy limits produce the same symptom.
This one is genuinely upstream. It lives in GTM or in the site, and no report configuration will fix it.
(direct) / (none) at 13,601 sessions and (not set) / (not set) at 1,591. Same report, different problems, different fixes.Unassigned — the one you can fix this afternoon
This is the most commonly misdiagnosed of the four, and the cheapest to repair.
Unassigned means GA4 did capture a source and medium. It just could not match the pair to any rule in your channel grouping. A campaign tagged medium=paid-social will not match the default Paid Social rule, which expects cpc, ppc, paid and similar. So the traffic is fully attributed and simply has nowhere to sit.
The fix is in Admin → Data display → Channel groups: add the missing source/medium mapping. Do not re-tag anything.
This is the important part: channel grouping changes apply retroactively in most standard reports. Fixing
Unassignedrepairs your history. Nothing else on this list does, because if the signal never arrived it was never stored.
(other) — not an attribution problem at all
(other) is a reporting artifact. When a dimension exceeds GA4’s cardinality limits, the overflow rows are collapsed into a single (other) bucket. Your data is intact; the report simply cannot show that many distinct rows.
If (other) dominates a report, the answer is a narrower dimension, a shorter date range, or BigQuery — not a tagging change. Chasing it as an attribution bug is pure wasted effort.
The order to work in
- Check
Unassignedfirst. It is the cheapest fix, it is retroactive, and it is frequently the biggest single bucket. - Then measure your direct share. Under 20%, leave it. Over 40%, stop other work.
- Audit outbound links — email, ads, partners, social bios. Most direct traffic is a link somebody forgot to tag.
- Only then touch tags, for
(not set). - Treat
(other)as a report design question, never as an attribution one.
Watching the number
Our extension does not fix any of this — attribution is decided long before the Data API is involved.
What it does do is put the source/medium breakdown on the Traffic tab where you will actually look at it, with the previous-period comparison alongside. The useful habit is watching direct traffic as a share, over time: a stable 15% is fine, and 15% becoming 30% in a fortnight means a campaign shipped untagged or a redirect changed. That shift is easy to miss in a monthly export and hard to miss when the comparison column is sitting next to it.
Questions people also ask
Each answer stands on its own, so it still makes sense quoted somewhere else.
What is the difference between (not set) and (direct)/(none) in GA4?
(not set) means GA4 received the hit but the dimension was never populated, often because the tag fired before the URL resolved. (direct)/(none) means the session genuinely arrived with no source signal at all: no UTM parameters, no click ID, no usable referrer and no prior first-party cookie. They have different causes and different fixes.
What does Unassigned mean in GA4?
Unassigned means GA4 captured a source and medium but the combination matched none of the rules in your channel grouping. It is a classification gap, not a collection gap. The fix is to add the missing source and medium mapping to your channel grouping, not to re-tag anything.
How much unknown traffic is normal in GA4?
Direct traffic in the 10 to 20 percent range is typical for most sites. Above 20 percent is worth investigating, and above roughly 40 percent your paid and channel analysis has effectively collapsed, because untagged ad traffic is hiding inside direct and inflating apparent return on ad spend.
Why is my paid traffic showing as direct in GA4?
Usually one of four things: the ad link was never UTM tagged, a redirect stripped the query string before the tag fired, an in-app browser or iOS privacy feature removed the click identifier, or consent was denied so no cookie was available to link the session to its original source.
Does fixing (not set) require changing my tags?
Often yes, and that is what makes it different from Unassigned. (not set) is usually a collection-time problem, such as a tag firing before the URL is available in a single-page app, so the fix is upstream in GTM or the site. Unassigned is fixed purely in the report layer.
Can I recover historical unknown traffic in GA4?
Channel grouping changes apply retroactively to most standard reports, so correcting Unassigned does repair history. Everything else does not: if the source signal never arrived, it was never stored, and no configuration change can reconstruct it later.