What (not set) means in Google Analytics 4 and how to fix it

(not set) is the placeholder Google Analytics 4 shows when it received no value for a dimension. It is not an error in the report and it is not a traffic source. The event arrived, but the field the report groups by was empty, so GA4 has nothing to print in that row.
The cause depends on the dimension. This guide goes through the dimensions where (not set) shows up most, with the reason Google documents for each and the fix. The last two sections cover what the GA4 interface cannot show you: which sessions are behind the row, and how to find them in the BigQuery export.
What (not set) means in GA4
Google’s help page defines it in one line: (not set) is “a placeholder name that Analytics uses when it hasn’t received any information for a dimension” (Google Analytics Help, checked October 2026). Every row in a GA4 report is a dimension value with metrics next to it. When the value is missing, the metrics still have to go somewhere, and they go to (not set).
Two things follow from that definition:
- The sessions and revenue in the row are real. They belong to some source, page or campaign that GA4 could not name.
- There is no single fix. A missing landing page and a missing campaign name have different causes, so start from the dimension, not from the label.
Find the cause by dimension
| Dimension showing (not set) | Documented cause | Where to fix it |
|---|---|---|
| Session source / medium | The session has no session_start event |
Tag trigger, consent mode setup |
| Session campaign, Google Ads dimensions | Unlinked Google Ads account, auto-tagging off, incomplete UTM tags | Google Ads link, URL tagging |
| Landing page | The session has no page_view event |
Tag setup, session timeout |
| Content group | Combined with session_start or first_visit, or sent empty |
Report setup, content_group parameter |
| Custom dimensions | Registered less than 24 hours ago, or the parameter is not sent | Wait, then check the event |
| User ID as a custom dimension | Google recommends against registering it | Remove the custom dimension |
The sections below take them one at a time.
OWOX Data Marts
See your first report built in real time. 15 minutes.
- Connect your data warehouse
- Pick your metrics
- Get a live Google Sheets report
In the time it takes to write a ticket. Then imagine never writing that ticket again.
Book a DemoWe'll use your actual use case
Session source / medium is (not set)
Session source / medium is (not set)
This is the one people search for most, because it hides where traffic came from. Google’s explanation is specific: session source / medium reports (not set) for sessions where the automatically collected session_start event is missing.

The usual reason is the tag trigger. If the Google tag in Google Tag Manager does not fire on the Initialization trigger, other tags can send events before the session is registered. Google’s documented fix:
- Open your container in Google Tag Manager and go to Tags.
- Open your Google tag and click the Triggering section.
- Add Initialization - All Pages and remove the previous trigger.
- Save and publish the container.
A session with (not set) as source / medium also lands in Unassigned in the default channel group, because no channel rule matches an empty source. If Unassigned grew at the same time as (not set), you are looking at one problem, not two. The channel rules themselves are covered in the guide to GA4 channel groups.
Google also notes a case you cannot fix: sessions that arrive with an srsltid parameter but without a Google referrer, for example when someone shares a modified URL, can be reported as (not set).
Campaign and Google Ads dimensions are (not set)
Campaign and Google Ads dimensions are (not set)
For Google Ads traffic, Google lists four causes:
- The Google Ads account and the GA4 property are not linked. Check the link under Admin, Product links.
- Auto-tagging is not enabled in the Google Ads account.
- Another Google Ads account advertises your site and is not linked to your property. Its clicks carry a GCLID that GA4 cannot map to a campaign.
- Manually tagged URLs have incomplete or incorrect UTM parameters. This applies to every source, not only Google Ads.

The last cause is the one you control fully. A link tagged with utm_source and utm_medium but no utm_campaign gives GA4 a source and no campaign name. Agree on one tagging scheme and build links from it, as described in the guide to UTM tags.
Landing page is (not set)
(not set) appears for the landing page dimension when a session does not have a page_view event.

The common way a session ends up without a page view is the session timeout. A GA4 session ends after 30 minutes of inactivity by default. If a visitor leaves a tab open, comes back an hour later and scrolls or clicks, those events start a new session on a page that was loaded in the previous one. The new session has engagement events and no page_view.
Two things reduce it:
- Check that
page_viewfires on every page, including single-page application route changes. - Review the session timeout under Admin, Data streams, your stream, Configure tag settings, Adjust session timeout. A longer timeout fits sites where people read or watch for a long time.
Page title and content group are (not set)
Page title and content group are (not set)
A page that sends no title produces (not set) in the Page title dimension. In the report, add Page path and screen class as a secondary dimension and type (not set) into the search box to list the affected pages.

For content groups Google documents two causes. The first is a report artifact: automatically collected events such as session_start and first_visit do not accept the content_group parameter, so combining the content group dimension with those events always gives (not set). The second is real: the event sends content_group with an empty value.

Custom dimensions are (not set)
Custom dimensions are (not set)
After you register a custom parameter, GA4 can show (not set) for it during the first 24 hours. Wait a day before you debug anything.
After that, (not set) means the event did not carry the parameter. For session_start and first_visit, GA4 keeps the parameters of the first event collected, so a parameter that was not on that first event shows as (not set) there.
Google also recommends that you do not register a user ID as a custom dimension. If you did, (not set) in that dimension is expected. Use the User-ID feature instead.
Consent mode can remove the session start
Consent mode can remove the session start
Google lists two consent mode implementation errors that lead to (not set):
- Using the
defaultcommand to update consent after the visitor answered the banner. Theuser_engagementevent is not sent and the first event with the session start is lost. Use theupdatecommand. - Sending events with denied consent after consent was granted. GA4 treats those events as a separate session, and that session has no
session_start.
If (not set) in source / medium appeared after a consent banner change, check these two first. The setup is described in the guide to GDPR compliance with GA4 consent mode.
(not set), (not provided), (data not available) and Unassigned
(not set), (not provided), (data not available) and Unassigned
These four labels get mixed up, and they mean different things.
| Label | What it means | Can you reduce it |
|---|---|---|
| (not set) | GA4 received no value for the dimension | Yes, by fixing collection |
| (not provided) | The search engine did not pass the organic search query | No. Use Search Console for queries |
| (data not available) | A related placeholder that, per Google, you typically cannot act on | No |
| Unassigned | No rule of the default channel group matched the session | Yes, by fixing source and medium |
What the GA4 interface cannot show you
What the GA4 interface cannot show you
Every fix above works from the day you publish it. GA4 does not reprocess past sessions, so last month’s (not set) row stays in last month’s report.
The interface also shows the row and nothing behind it. You can see that a few thousand sessions have no source. You cannot open those sessions to see which pages they touched, which events they contain or which tag sent them. That is the question you need answered to choose between the causes above.
The answer is in the raw events. GA4 exports them to BigQuery through a free native link, for standard properties too. The setup is three steps in GA4 Admin, covered in the guide to connecting GA4 to BigQuery.
Find the sessions behind (not set) in BigQuery
Find the sessions behind (not set) in BigQuery
The export has one row per event. The two documented causes, a session without session_start and a session without page_view, become two columns you can count. This query runs as written on Google’s public GA4 sample dataset:
SELECT
COUNT(*) AS sessions,
COUNTIF(NOT has_session_start) AS without_session_start,
COUNTIF(NOT has_page_view) AS without_page_view
FROM (
SELECT
user_pseudo_id,
(SELECT value.int_value
FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS session_id,
LOGICAL_OR(event_name = 'session_start')
AS has_session_start,
LOGICAL_OR(event_name = 'page_view')
AS has_page_view
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
GROUP BY user_pseudo_id, session_id
)
On the sample, January 2021 returns 118,380 sessions, of which 1,866 have no session_start and 7,180 have no page_view. Those are the sessions GA4 would report with (not set) as source / medium and as landing page.
To see which pages send no title, list them:
SELECT
(SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location,
COUNT(*) AS page_views_without_title
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20210101' AND '20210131'
AND event_name = 'page_view'
AND (SELECT value.string_value
FROM UNNEST(event_params)
WHERE key = 'page_title') IS NULL
GROUP BY page_location
ORDER BY page_views_without_title DESC
On the sample the first row is one product page with 1,448 page views and no title. That is a page to fix, not a pattern to guess at. Replace the table name with your own export dataset to run both queries on your data. The UNNEST pattern used here is explained in how to unnest GA4 event parameters.
Keep the check instead of rewriting it
Keep the check instead of rewriting it
A query like this gets written once, during an incident, and then lives in someone’s saved queries. The next time a marketer asks why (not set) grew, the analyst writes it again, or writes a slightly different one that counts sessions another way.
OWOX Data Marts is built for that step. The analyst saves the SQL as a Data Mart on the warehouse where the export already is, adds a description and an owner, and publishes it. A report on that Data Mart goes to Google Sheets or Data Studio (the former Looker Studio) on a schedule, so the marketer sees sessions without a source per day without asking for a new query.
Two limits, stated plainly. OWOX Data Marts does not collect GA4 data and does not repair it: it reads the tables the GA4 export wrote to your warehouse. And the SQL stays the analyst’s. What changes is that the definition of “a session without a source” exists once, with a name, and every report uses it. How raw export tables become reporting tables is covered in GA4 export to BigQuery and data modeling.
Turn your data into decisions.
Governed data marts give you the clean foundation ML needs to actually work.
- No AI hallucinations
- Analyst-governed definitions
- Every number traces to SQL
Frequently Asked Questions
What does (not set) mean in Google Analytics 4?
(not set) is the placeholder GA4 shows when it received no value for a dimension. The sessions and revenue in that row are real; GA4 just could not name the source, page or campaign they belong to.
Why is session source / medium (not set) in GA4?
Google documents that session source / medium is (not set) for sessions without the automatically collected session_start event. The usual cause is a Google tag in Tag Manager that does not fire on the Initialization trigger, or a consent setup that loses the first event of the session.
Why is the landing page (not set) in GA4?
The session has no page_view event. A common way this happens is the session timeout: a visitor returns to an open tab after 30 minutes and scrolls or clicks, which starts a new session without a page view.
How do I find the sessions behind (not set)?
Link GA4 to BigQuery and query the raw events. Group events by user and ga_session_id, then count the sessions that have no session_start or no page_view event. The GA4 interface shows only the aggregated row.



