← All Guides

GA4 Data Quality: Fixing Unassigned Traffic, (not set), Referral Leakage, Internal Traffic, Bots and Thresholding

The recurring causes of messy GA4 reports and how to fix each: Unassigned channel traffic, (not set) in landing page and source, payment and SSO referrals, internal and developer traffic, bot sessions, duplicate page views, and thresholded rows from Google Signals.

Atiqul Islam
Written by Atiqul Islam

Tracking & analytics specialist. 278+ GTM, GA4 and server-side tracking projects for clients in the US, UK and Australia.

Rather not do this yourself? I set this up for clients every week. Free 15-minute audit, no obligation.

Book a Free Audit

Dirty data makes every decision harder. A quarter of traffic Unassigned, landing pages full of (not set), the payment gateway as the top referrer, and the agency's own visits inflating sessions. Each has a specific cause and a specific fix. This guide goes through them in the order I check them on a new property.

1. Unassigned Traffic

Open Reports, then Acquisition, then Traffic acquisition, and look at the Unassigned row. Add source and medium as a secondary dimension to see which combinations fall in.

Causes and fixes:

2. (not set)

Landing page (not set): the session's first event was not a page_view. Confirm the Google tag fires first and page_view is sent, including in single page apps where the first route must send one.

Source and medium (not set): typically Measurement Protocol events or sessions created by late-arriving events with no attribution. Same fixes as above.

Country or device (not set): small volumes from privacy proxies and bots; ignore unless large.

Item name (not set): purchases with items missing item_name; fix the dataLayer.

3. Referral Leakage

Open Traffic acquisition with session source. If you see your payment provider, your own domain, an SSO provider or a booking vendor as a referrer, the session restarted when the visitor returned.

Fix: in the data stream, Configure tag settings, then List unwanted referrals, add each domain. For domains you also run tags on, configure cross-domain measurement instead; the Cross-Domain guide on this site covers it. Self-referrals from your own domain usually mean two Google tags or a misconfigured cookie domain.

4. Internal and Developer Traffic

In the data stream, Configure tag settings, then Define internal traffic, add rules for your office IP, home IPs of frequent testers, and the agency. Then in Admin, Data settings, Data filters, set the internal traffic filter to Active. Until it is active, the traffic is only flagged, not excluded.

For developers with dynamic IPs, a Chrome extension that sets a traffic_type parameter, or a GTM variable that sets it when a specific cookie is present, lets you filter without IPs. Create a filter for that traffic_type value.

Also exclude staging and development hostnames: either a separate GA4 property for staging, which is cleaner, or a GTM exception on hostname so no tags fire there.

5. Bots and Spam

GA4 excludes known bots automatically. What remains:

6. Duplicate Page Views and Events

Engagement rate near 100 percent and page views per session double what makes sense usually means two Google tags. In Preview, load a page and count page_view fires. Check the page source for a hard-coded gtag snippet or a plugin sending to the same measurement ID. Remove one.

Duplicate purchases: missing transaction ID or a push that repeats on refresh. The Ecommerce Specification guide covers the guard.

7. Thresholding From Google Signals

With Google Signals on, small reports show a warning and hide rows. Options: turn Signals off if you do not use demographics or cross-device reporting from it; set Reporting identity to Device-based; or accept it and widen date ranges. For most small sites, Signals off is the right call.

8. Session Counting Oddities

Sessions spanning midnight split in two. Sessions longer than the timeout restart. Reloaded pages with _gl parameters re-stitch oddly. These are expected GA4 behaviours; document them for stakeholders rather than fixing them.

9. Data Retention and Reporting Gaps

Explorations that end abruptly in the past are hitting the retention limit. Set retention to 14 months and link BigQuery for anything longer.

A Monthly Hygiene Routine

  1. Traffic acquisition: Unassigned share below 5 percent.
  2. Source and medium: no own domains, payment or SSO providers.
  3. Landing page: (not set) below 2 percent.
  4. Events: no unexpected spikes, no duplicated purchase events.
  5. Data filters: internal filter active, test visits absent from reports.
  6. Realtime: a quick check from a work device that your session is excluded.

Outcome

Channel reports that reflect where visitors really came from, landing pages that are set, sessions that are human and external, and conversion counts that match the business. Clean data is not glamorous, but every decision built on it is better.

Frequently Asked Questions

What does Unassigned mean?

The session's source and medium did not match any of GA4's default channel rules. Almost always a UTM medium that is not a recognised value, or events arriving without session attribution such as Measurement Protocol hits or late-firing tags.

Why is landing page (not set)?

The session started without a page_view event: a non-page event fired first, the Google tag loaded after an event tag, or a session was stitched from a Measurement Protocol event. Make sure the Google tag fires on Initialization and page_view is the first event.

How do I stop my own visits counting?

Define internal traffic by IP in the data stream settings, then activate the internal traffic data filter. Filters only apply from activation onward, and the IP must be the public IP of your office or home.

What is thresholding?

When Google Signals is on, GA4 withholds rows that could identify individuals in small segments, shown by an orange icon on the report. Turn Signals off, change the reporting identity to Device-based, or widen the date range to see full data.

Why does my page view count double?

Two Google tags on the page, or the Google tag plus a hard-coded gtag snippet. Check in Preview and in a tag debugger for two page_view requests per load.

Want This Done Right the First Time?

Book a free 15-minute audit call. I'll review your setup, show you what is broken, and tell you exactly what it takes to fix it.

Chat Now