{"id":10116,"date":"2026-10-04T07:46:00","date_gmt":"2026-10-04T05:46:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10116"},"modified":"2026-09-27T22:43:56","modified_gmt":"2026-09-27T20:43:56","slug":"tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/","title":{"rendered":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports"},"content":{"rendered":"<p>\u201cUnassigned\u201d in a GA4 traffic acquisition report is not a channel \u2014 it is what remains when a session&#8217;s source and medium match none of the rules in the Default Channel Group. That makes it a symptom with several unrelated causes, which is why the usual advice to \u201cfix the UTMs\u201d resolves some cases and does nothing for others.<\/p>\n<p>The reliable approach is to split the bucket before touching anything: one reading of the report separates a tagging problem from a data-loss problem, and each has its own fix.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/ga4-unassigned-en.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Diagnostic flow: the Unassigned row split by session source and medium into a real value (tagging fault) or (not set) (lost parameter), then fixed at the source and verified\"><figcaption>Unassigned is not one bug: the secondary dimension decides whether it is a tagging fault or a lost parameter.<\/figcaption><\/figure>\n<h2>Step 1: Split the Bucket by Session Source and Medium<\/h2>\n<p>In the Traffic acquisition report, adding <em>Session source \/ medium<\/em> as a secondary dimension to the Unassigned row splits it into two fundamentally different cases:<\/p>\n<ul>\n<li>A <strong>real value<\/strong> appears, such as <code>newsletter \/ october-promo<\/code> \u2014 the data arrived intact, but no channel rule matches it. This is a taxonomy problem, fixable by correcting the tagging.<\/li>\n<li><strong><code>(not set)<\/code><\/strong> appears \u2014 the session started with no source information at all. Nothing is wrong with the channel rules; the campaign data never reached GA4.<\/li>\n<\/ul>\n<p>One more distinction is worth making first: Unassigned in the <em>User acquisition<\/em> report describes first-visit attribution, while Traffic acquisition describes each session. Comparing a user-scoped dimension against a session-scoped metric produces Unassigned rows that reflect the scope mismatch rather than a collection fault, so both reports are worth checking separately before any change is made.<\/p>\n<h2>Step 2: When a Real Value Appears \u2014 the Tagging Case<\/h2>\n<p>GA4&#8217;s Default Channel Group matches specific values, not intent. A medium of <code>newsletter<\/code> does not become the Email channel; the Email rule requires a source or medium of exactly <em>email<\/em>, <em>e-mail<\/em>, <em>e_mail<\/em> or <em>e mail<\/em>. Case does not matter, so <code>Email<\/code> with an uppercase E is fine; <code>newsletter<\/code>, <code>mailing<\/code>, or <code>crm<\/code> do not match. A <code>utm_source<\/code> with no <code>utm_medium<\/code> at all also leaves GA4 unable to classify the session.<\/p>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top\">Intended channel<\/th>\n<th>Medium that matches<\/th>\n<th>Common value that does not<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Email<\/td>\n<td><code>email<\/code>, <code>e-mail<\/code>, <code>e_mail<\/code><\/td>\n<td><code>newsletter<\/code>, <code>mailing<\/code>, <code>crm<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Organic Search<\/td>\n<td><code>organic<\/code><\/td>\n<td><code>seo<\/code>, <code>search<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Paid Search<\/td>\n<td><code>cpc<\/code>, <code>ppc<\/code>, <code>paid<\/code>&hellip; (search source)<\/td>\n<td><code>sem<\/code>, <code>adwords<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Paid Social<\/td>\n<td><code>cpc<\/code>, <code>ppc<\/code>, <code>paid<\/code>&hellip; (social source)<\/td>\n<td><code>social-paid<\/code>, <code>fb-ads<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Referral<\/td>\n<td><code>referral<\/code>, <code>link<\/code><\/td>\n<td><code>partner<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Affiliates<\/td>\n<td><code>affiliate<\/code><\/td>\n<td><code>affiliates<\/code>, <code>partnerprogram<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>&lt;!-- Falls into Unassigned: no rule matches medium=newsletter --&gt;\nhttps:\/\/example.com\/offer?utm_source=mailchimp&utm_medium=newsletter\n\n&lt;!-- Classified as Email: the medium matches the channel rule --&gt;\nhttps:\/\/example.com\/offer?utm_source=mailchimp&amp;utm_medium=email&amp;utm_campaign=october-promo<\/code><\/pre>\n<p>Correcting the tagging only affects traffic collected from that point on; sessions already recorded keep the value they arrived with. A custom channel group can classify the historical values into a named channel for reporting, but that is a relabelling of what was collected, not a repair of it.<\/p>\n<h2>Step 3: When <code>(not set)<\/code> Appears \u2014 Parameters Lost in Transit<\/h2>\n<p>A session that begins with no source at all points at the path the visitor took, not at the campaign tagging. Three mechanisms account for most of it:<\/p>\n<ul>\n<li><strong>A cross-domain hop without the linker.<\/strong> When a visitor moves from one domain to another \u2014 a shop handing off to a payment provider and back \u2014 GA4 carries identity in the <code>_gl<\/code> parameter appended by cross-domain measurement. Without both domains configured under the same data stream, the return visit starts a fresh session whose referrer is the payment provider; if that host also sits in the referral exclusion list, the referral is discarded and nothing remains to attribute the session to.<\/li>\n<li><strong>A redirect that drops the query string.<\/strong> A server-side redirect for language, trailing slashes, or http-to-https that rebuilds the URL without forwarding <code>?utm_&hellip;<\/code> removes the campaign parameters before any tag can read them.<\/li>\n<li><strong>A tag that fires after the URL has changed.<\/strong> In a single-page application, a client-side route change that runs before the GA4 tag loads leaves the tag reading the post-navigation URL, which no longer carries the campaign parameters.<\/li>\n<\/ul>\n<h2>Step 4: The Consent Mode Case<\/h2>\n<p>Consent Mode contributes to Unassigned in a specific way: when advertising or analytics storage is denied, click identifiers and the linker parameter cannot be persisted in cookies across a page transition. Enabling URL Passthrough in the Google tag or the Conversion Linker keeps <code>gclid<\/code> and <code>_gl<\/code> in the URL instead, so the source survives navigation even without storage.<\/p>\n<p>The heavier cause is hard-blocking. Preventing Google tags from firing at all until consent is granted \u2014 using a blocking trigger rather than the built-in consent checks \u2014 means the landing page view is never measured; the first event GA4 sees arrives after the visitor has navigated onward, without the original campaign parameters. Using the tags&#8217; own consent settings keeps that first hit as a cookieless ping that still carries the source, which is also what makes behavioural modelling possible.<\/p>\n<h2>Step 5: Quantifying It in BigQuery<\/h2>\n<p>The GA4 interface shows the proportion; the BigQuery export shows the source and medium combinations sessions arrive with, which is what makes a fix measurable. It contains no channel group, and according to Google&#8217;s export schema <code>manual_source<\/code> and <code>manual_medium<\/code> in <code>collected_traffic_source<\/code> hold not only UTM values but also values parsed from referral parameters, so the list has to be checked against the channel rules:<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SELECT\n  IFNULL(collected_traffic_source.manual_source, '(not set)') AS source,\n  IFNULL(collected_traffic_source.manual_medium, '(not set)') AS medium,\n  COUNT(*) AS sessions\nFROM `project.analytics_XXXXXXXXX.events_*`\nWHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260930'\n  AND event_name = 'session_start'\nGROUP BY source, medium\nORDER BY sessions DESC\nLIMIT 50;<\/code><\/pre>\n<p>Rows with real but unmatched mediums quantify the tagging half of the problem. Rows where both fields read <code>(not set)<\/code> are only an upper bound for the data-loss half: they also contain direct entries that bring neither UTM parameters nor a referrer and that GA4 assigns to the Direct channel as <code>(direct) \/ (none)<\/code>. Re-running the query after each change shows which of the two actually moved.<\/p>\n<h2>Staying Inside the Guardrails<\/h2>\n<p>Some missing campaign data is irreducible. Visitors who decline analytics storage send nothing at all under hard-blocking; with the tags\u2019 consent settings their cookieless pings do carry the source, but they appear in reports only through behavioural modelling, not as sessions of their own, and no configuration recovers what was never collected. Genuine direct entries and visits from app or browser environments that strip referrers do not belong here: without any source, GA4 assigns them to the Direct channel as <code>(direct) \/ (none)<\/code>. A realistic target is a small, stable share \u2014 a rising one signals a new fault, which is the reading worth monitoring rather than the absolute number.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>How can a redirect that drops the UTM parameters be found?<\/h3>\n<p>By requesting the landing page with test parameters and looking at every stop in the redirect chain, for example in the network tab of the developer tools or with <code>curl -sIL<\/code>. The Location header of each response is what counts: if the query string that was still in the request is missing there, that stop is the cause. Variants without a trailing slash, with http and with a language prefix belong in the test, because each of them can trigger a rule of its own.<\/p>\n<h3>How do campaign parameters survive in a single-page application until the tag reads them?<\/h3>\n<p>The article names the mechanism: if the router changes the address before the GA4 tag has loaded, the tag reads an address without parameters. Three measures keep the parameters in place:<\/p>\n<ol>\n<li>Loading the Google tag early, in the head of the page and before the router\u2019s code, so that the first page view still sees the original address.<\/li>\n<li>Saving the landing address in a variable immediately on load and passing it as <code>page_location<\/code> with the first page_view. GA4 reads the campaign parameters from that value, so a later change of address no longer affects it.<\/li>\n<li>Deferring the URL clean-up. Some applications remove query parameters with <code>history.replaceState()<\/code> to make the address look tidy; that should only happen once the first hit has been sent.<\/li>\n<\/ol>\n<p>A consent banner makes the problem worse if it delays loading the tag until a choice has been made: by then the router may long since have changed the address. The same saved landing address helps here too.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\" target=\"_blank\" rel=\"noopener noreferrer\">Google Analytics 4 developer guide<\/a><\/li>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/13504892\" target=\"_blank\" rel=\"noopener noreferrer\">Why (not set) appears in GA4 reports<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/security\/guides\/consent\" target=\"_blank\" rel=\"noopener noreferrer\">Consent Mode for websites<\/a><\/li>\n<\/ul>\n<\/div>\n<p><!-- lw-analytics-acquisition-guide:start --><\/p>\n<h2>Practical check: audit real acquisition rows<\/h2>\n<p>The <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-channel-grouping-debugger\/#lw-analytics-workbench\">Acquisition Audit in the Channel Debugger<\/a> adds a report-based check to the individual channel-rule examples. After Google authorization, a property and an explicit date range determine the query. The tool reads session source, medium, campaign and default channel group together with sessions. It does not mix first-user acquisition with session acquisition.<\/p>\n<ol>\n<li>Select a completed reporting period. Recent data may still change.<\/li>\n<li>Review rows in Unassigned, starting with the largest session values. Compare their source and medium with the channel rules described above.<\/li>\n<li>Inspect spelling candidates such as <code>Email<\/code> and <code>email<\/code>, or campaign names with extra spaces. A candidate is a naming inconsistency to investigate, not an automatic correction.<\/li>\n<li>Inspect the returned metadata before interpreting the result. Thresholding, sampling and an <code>(other)<\/code> row can hide detail.<\/li>\n<li>Export the findings as CSV and correct future campaign links or tracking configuration where the evidence supports it.<\/li>\n<\/ol>\n<p>The displayed Unassigned percentage uses the sum of the returned session values. It is not an independently retrieved property total. The tool rejects incomplete pagination and does not rewrite historical attribution. A row containing <code>(not set)<\/code> alone cannot establish whether consent, redirects or tagging caused the missing value.<\/p>\n<p>Technical references: <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/api-schema\" target=\"_blank\" rel=\"noopener noreferrer\">Data API dimensions and metrics<\/a> and <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/rest\/v1beta\/ResponseMetaData\" target=\"_blank\" rel=\"noopener noreferrer\">response metadata<\/a>.<\/p>\n<p><!-- lw-analytics-acquisition-guide:end --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Diagnosing the Unassigned bucket in GA4 traffic acquisition by splitting it on session source and medium first, then fixing the actual cause: non-standard UTM tagging, campaign parameters lost across domains or redirects, or a consent gate that fires the tag too late.<\/p>\n","protected":false},"author":1,"featured_media":13827,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[113],"tags":[91383,91297,91258,91219,91252],"class_list":["post-10116","post","type-post","status-publish","format-standard","hentry","category-tutorials","tag-attribution","tag-data-quality","tag-google-analytics-4","tag-tutorial","tag-web-analytics"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-04T05:46:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports\",\"datePublished\":\"2026-10-04T05:46:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/\"},\"wordCount\":1453,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png\",\"keywords\":[\"Attribution\",\"Data Quality\",\"Google Analytics 4\",\"Tutorial\",\"Web Analytics\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/\",\"name\":\"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png\",\"datePublished\":\"2026-10-04T05:46:00+00:00\",\"description\":\"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik","description":"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik","og_description":"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-04T05:46:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports","datePublished":"2026-10-04T05:46:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/"},"wordCount":1453,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png","keywords":["Attribution","Data Quality","Google Analytics 4","Tutorial","Web Analytics"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/","name":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png","datePublished":"2026-10-04T05:46:00+00:00","description":"Splitting the Unassigned bucket on session source and medium, then fixing the cause: UTM tagging, parameters lost across domains, or a late consent gate.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10116-tutorial-fixing-unassigned-traffic-i-g.png","width":1200,"height":630,"caption":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-fixing-unassigned-traffic-in-ga4-acquisition-reports\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Fixing \u201cUnassigned\u201d Traffic in GA4 Acquisition Reports"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10116"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10116\/revisions"}],"predecessor-version":[{"id":20731,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10116\/revisions\/20731"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13827"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}