TL;DR, Quick Answer
7 min read(not set) is Google's placeholder for a dimension that received no value, and Google's help article names a separate cause for each dimension that shows it: unlinked Google Ads accounts, a missing session_start event, a session with no page_view event, an empty content_group, a User ID registered as a custom dimension, a custom parameter younger than 24 hours, and consent mode calling default where it should call update. Google publishes no acceptable percentage of (not set), so measure the share yourself and fix the dimension that owns it.
What does not set in GA4 mean?
Google Analytics writes not set in GA4 into a report row when it received no value for the dimension in that row, and the cause changes from one dimension to the next. Google's definition is one sentence: "(not set) is a placeholder name that Analytics uses when it hasn't received any information for a dimension." Name the dimension first, because the repair for a Google Ads row and the repair for a landing page row have nothing in common.
The same article flags a neighbour: "The '(data not available)' value is a related value that can appear in reports." The two point in opposite directions. (not set) blames your collection setup. (data not available) blames Google holding a figure back.
Is (not set) the same as a blank value?
No. GA4 reserves the placeholder for the case where nothing arrived. Google's dimensions and metrics reference draws the line: "(not set) is a placeholder used when data hasn't been received for a dimension. When you send an empty value to Analytics, you will see a blank value instead of (not set); (not set) appears when no value is sent." A column of blanks means your tag fired and sent an empty string; a column of (not set) means the parameter never reached Google.
Content group breaks that rule, and Google documents the exception itself: "(not set) can also appear when your event sends the content_group parameter but it's an empty value, for example (content_group: "")." Treat the blank rule as the default and content group as the one named exception.
Which dimensions produce (not set), and what causes each one?
Google's help article splits the answer across seven dimensions, each with its own cause. Nothing outside this list is documented, so anything you read elsewhere is somebody's inference.
| Dimension | Google's documented cause | What to change |
|---|---|---|
| Google Ads dimensions | Ads and Analytics are not linked, auto-tagging is off, traffic arrives from unlinked Google Ads accounts, or destination URLs carry "incomplete or incorrect UTM parameters" | Link the accounts, switch auto-tagging on, repair the tags |
| Session source / medium | "sessions where the automatically collected event session_start is missing" | Move the Google tag onto the Initialization - All Pages trigger |
| Landing page | "a session doesn't have a page_view event" | Confirm page_view fires on entry pages |
| Content group | Paired with automatically collected events such as session_start and first_visit, which "don't accept the content_group parameter", or the event sends an empty content_group | Unpair content group from those events, stop sending an empty string |
| Custom defined User ID | A user ID registered as a custom dimension | Use the User-ID feature instead |
| Custom parameters | "the first 24 hours after you register a custom parameter", and values absent from the first event that triggered session_start or first_visit | Wait out the 24 hours, recheck |
| Consent mode | The default command used where update belongs, so "the initial event with the session_start parameter is lost", or events sent with denied consent after consent was granted | Call update after the banner interaction |
Three of those rows are tagging faults, and UTM tagging is the one you can audit today without touching code. The consent mode row is the one to check against your banner, which Google consent mode v2 covers in full.

Why is session source / medium (not set)?
Session source / medium turns (not set) when the session has no session_start event, which Google traces to a Google tag firing on the wrong trigger type instead of "Initialization". The knock-on effect is the part teams miss: Google states that when session source / medium is (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." Unassigned and (not set) are one failure seen from two reports, which is also why teams confuse both of them with direct / none in GA4.
Google documents one more session-level case: sessions carrying the srsltid parameter without a google.com referrer, which Google attributes to "actions like sharing modified URLs" and states are "not classified as organic." Check your landing page URLs for srsltid before you blame the tag.
How do you calculate the (not set) share of a report?
Divide the rows holding the placeholder by the total for the same dimension over the same date range.
(not set) share = (not set) sessions / total sessions x 100
Take a week with 84,000 sessions where 12,480 sit in the (not set) row for session source / medium. 12,480 / 84,000 = 0.1486, so 14.86 percent of the week has no attributable source. At a 2 percent conversion rate that is 250 conversions with no channel attached, which is the number to take into a budget meeting. Google publishes no acceptable percentage for (not set), so the figure only means something against your own previous weeks.
Do (other) and data thresholds create (not set) rows?
No. Three labels, three mechanisms, and mixing them up sends you fixing the wrong thing. The (other) row appears "when the number of rows in a table exceeds the table's row limit", at which point Analytics "surfaces only the most common dimension values and condenses less common values under the (other) row". Google's cardinality guidance sets the trigger at "more than 500 unique values in one day" and the property ceiling at "a cardinality limit of 50,000 values. Thereafter, cardinality control is implemented."
Data thresholds are the third label. Google withholds rows "to prevent anyone viewing a report or exploration from inferring the identity or sensitive information of individual users", and states that "Data thresholds are system defined. You can't adjust them." Read the mechanics in GA4 data thresholding before you call a shrinking report a tagging bug.

Flowsery
Start Your 14-Day Free Trial
Real-time dashboard
Goal tracking
Cookie-free tracking
What does Google not document about (not set)?
Three claims circulate widely and appear nowhere in Google's documentation. Ad blockers and Safari's tracking protection are not named as causes of (not set) in the help article, so treat that link as an inference, not a documented rule. No acceptable percentage of (not set) is published anywhere in Google's docs, which makes every "under 5 percent is fine" benchmark somebody's house rule. And Universal Analytics' (not provided) for organic keywords is a separate value from a separate product, absent from the GA4 article entirely.
If a cause is not on Google's list, prove it in a debug session before you rewrite your tagging.
How do you stop losing sessions to (not set)?
Fix the dimension that owns the row, then verify against a real session, not a report. Every cause on Google's list is a collection problem, so the evidence you need is what the browser sent, not what the aggregate table shows a day later.
Flowsery records every user session and runs cookie-free and EU-hosted with no data sampling, so a session with a broken source becomes a replay you can watch, not a row you cannot open. It detects JavaScript errors, rage clicks and drop-offs on its own and sends each issue to Slack, Linear or Jira with the replay attached. If the unit itself is still fuzzy, what is a session sets the boundary.
Frequently asked questions
Does (not set) mean my GA4 tracking is broken?
Not on its own. Google defines the value as a placeholder for a dimension that received no information, and several documented causes are configuration choices, not faults, such as a custom parameter registered less than 24 hours ago. Match the dimension to Google's list before you call it a break.
Can I filter (not set) out of a GA4 report?
You can hide the row with a report filter, but the sessions stay in the property and the missing value does not come back. Google warns about the same trap for the (other) row: the data quality warning shows "but no (other) row appears in the report" because a filter hid the grouped results. Hiding a row changes the view, not the collection.
Why does Unassigned appear next to (not set)?
They come from the same gap. Google states that if 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." Fix the missing session_start event and both labels shrink together.
Does consent mode cause (not set)?
Google names two consent mode errors. Using the default command to set all consent values, including updates after the banner interaction, means "the user_engagement event isn't sent, and the initial event with the session_start parameter is lost". Events sent with denied consent after consent was granted are "treated as a separate session, which won't have a session_start event". Use the update command for post-banner changes.
Is (not set) the same as (other)?
No. (not set) means no value was received for the dimension. (other) means values were received but the table exceeded its row limit, so Analytics condensed the least common ones into one row. Google notes both "other" and "(other)" express high cardinality with "no significant difference between them".
How long does a new custom parameter show (not set)?
Google gives a figure for this one: (not set) can appear "during the first 24 hours after you register a custom parameter", after which "you should have the expected parameter values". If the placeholder outlives 24 hours, the parameter is not reaching Google and the fault is in your tag.
What causes (not set) for Google Ads dimensions?
Google Ads dimensions turn (not set) when the two products are not linked, when auto-tagging is switched off, when traffic comes from an unlinked Google Ads account, or when destination URLs carry incomplete or incorrect UTM parameters. Link the accounts, turn auto-tagging back on, and check every landing page URL for a broken tag. Any of the four breaks attribution the same way, so audit all four before you decide which one is at fault.
What is the difference between (not set) and (data not available)?
Google's own article names them as a related pair pointing in opposite directions. (not set) means your collection setup never sent the value, while (data not available) means Google is holding a figure back on its own end. Confusing the two sends you fixing a tag that was never broken.
Why does content group show (not set) even when other dimensions show blank instead?
Google documents content group as the one named exception to its own rule. Every other dimension shows a blank when the tag sends an empty value and reserves (not set) for when nothing arrives, but content group shows (not set) even for an empty string, for example content_group: "". The same row also turns (not set) when it is paired with an automatically collected event such as session_start or first_visit, since those events do not accept the content_group parameter.
Does the srsltid parameter cause (not set) in GA4?
Google documents a separate session-level case for it. A session carrying the srsltid parameter without a google.com referrer traces back to actions like sharing modified URLs, and Google states that traffic is not classified as organic. Check your landing page URLs for srsltid before you blame the session_start tag for a source/medium problem.
Was This Article Helpful?
Let us know what you think!
See us more often in Google
One click marks Flowsery as a preferred source, so our articles sit higher in your Top Stories, AI Mode, and AI Overviews.
Before you go...
Flowsery
Revenue-first analytics for your website
Track every visitor, source, and conversion in real time. Simple, powerful, and cookie-free.
Real-time dashboard
Goal tracking
Cookie-free tracking
Related Glossary Terms


What Unassigned Traffic GA4 Reports Actually Means
A channel with no matching rule, unassigned traffic ga4 shows is not a missing value like (not set). Google's own rules explain the difference.


How to Build GA4 Calculated Metrics Inside a Five-Slot Quota
Google caps GA4 calculated metrics at 5 per standard property. Learn the formula syntax, the units, where they appear and what a formula can't use.


Setting Up GA4 Content Grouping With One Parameter
Set up GA4 content grouping with the content_group parameter in gtag or Tag Manager, read the Content group dimension and keep (not set) rows out.


How to Add Google Analytics Annotations in GA4 and Keep a Change Log
In GA4, Google Analytics annotations pin a dated note to line graphs. Who can add them, the 60 and 150 character limits, the 1,000 cap, and change log use.


What GA4 Custom Dimensions Do, and the Quotas That Cap Them
Registering GA4 custom dimensions turns your event parameters into report fields. See the three scopes, the 50, 25 and 10 quotas and the cardinality trap.


How the GA4 User ID Joins Signed-In Visits Across Devices
Sending a GA4 user ID links one signed-in person's sessions across devices. See the gtag setup, the 256-character rule, sign-out handling and the limits.
Related Articles


What GA4's Average Engagement Time Actually Divides By
GA4's average engagement time is focus time divided by active users, not sessions. How the timer runs, why the monthly figure is higher, and what it misses.


How GA4 Decides Which Visits Are Engaged Sessions
GA4 counts engaged sessions as visits that pass 10 seconds, fire a key event, or record two page views. How each trigger fires and where the count misleads.


How an Event Naming Convention Survives Its First Rename
An event naming convention has to satisfy GA4's reserved names, 40 character ceiling and case sensitivity, because renaming after launch never touches history.

