TL;DR
The complaint arrives in two forms and they are the same complaint. Either revenue appears in GA4 with no source attached, or a channel called Unassigned starts absorbing paid orders that used to sit under Google or Meta. The revenue is there, which rules out a whole class of tracking failures and narrows the question to attribution. Four causes account for nearly all of it, and none of the four is anything you configure in Magento: one is platform processing, two are environment conditions, and one is your own campaign tagging. This article walks them in the order that costs you the least time, with the check for each rung and the observable that tells you to stop and move on.
Key Takeaways
- Unassigned is GA4's label for events that match no channel rule [1], so a purchase filed there arrived intact and lost its source, not its revenue.
- Check processing first. GA4 documents 24 to 48 hours of processing, during which reports may change [2], and attribution dimensions are applied in processed reports.
- Consent-denied traffic is the largest cause on European stores. With
analytics_storagedenied, no Analytics cookies are set, accessed or read on the device [3], so nothing exists for a server-side purchase to inherit. - The tell for that rung is arithmetic: compare
session_startcounts against session counts. In one investigation, a property showed roughly 1,211 Unassigned or (not set) sessions across 28 days against only 51session_startevents. - The extension captures GA session identifiers from the GA cookies at the moment the order is placed. Where a CDN or hosting setup keeps that cookie from being readable at that moment, the purchase ships without session context and GA4 files it under Unassigned.
- Measurement Protocol events need
session_idto carry session context, sent within 24 hours of the start of that session [4][5]. - Campaign values in the wrong slot, medium set to
banneradorqrcode, match no default channel rule and land in Unassigned by definition [1].
What Unassigned actually means
Start with the definition, because half the confusion comes from reading Unassigned as an error state.
Google's documentation on default channel groups is direct: "Unassigned is the value Analytics uses when there are no other channel rules that match the event data" [1]. GA4 sorts every session into a channel by testing the source, medium and campaign values against a rule set. Unassigned is what happens when no rule matches, including the case where there is nothing to test.
That distinction is the whole diagnostic. A purchase in Unassigned reached GA4. Its value is counted. Your revenue totals are fine, which is why the neighboring complaint, GA4 and Magento reporting different numbers, is a different investigation entirely and lives in our article on why GA4 and Magento sales reports do not match.
What is missing is context: the session the purchase belongs to, and through that session, the source that sent the shopper. Everything below is about where that context goes.
Rule out the clock before anything else
The cheapest check first, because it costs nothing and it is right more often than anyone expects.
GA4 documents that "data processing can take 24-48 hours. During that time, data in your reports may change" [2]. Intraday freshness runs 2 to 6 hours, daily processing 12 to 24 hours or longer, and attribution dimensions are applied to processed data. A purchase from this morning can sit unattributed this afternoon and be correctly attributed tomorrow, with nothing having been fixed.
The signature is easy to read. Realtime keeps showing users and events arriving normally, while the standard reports look wrong. That combination means collection is healthy and processing has not caught up.
Give it a full 48 hours before touching a setting. Merchants who skip this rung change three things during the wait and then cannot tell which one mattered.
Then count session_start against your sessions
This rung is the largest one on any store with a consent banner, and it takes about five minutes to confirm.
When a visitor declines, analytics_storage goes to denied under Consent Mode, and Google's documentation states what follows: "No Analytics cookies are set, accessed, or read from the device" [3]. Advanced implementations still send cookieless pings, which Analytics uses for modeling [3]. What does not exist is a stored client identifier or session identifier for that visitor. If the shopper then buys, the server-side purchase has no session context to attach, no session_start was ever recorded, the source reads (not set), and GA4 files the result under Unassigned.
The arithmetic gives it away. Count session_start events against total sessions for the same period. In one investigation of a store reporting this exact symptom, a 28 day window held roughly 1,211 Unassigned or (not set) sessions and only 51 session_start events. A property that healthy on volume and that empty on session starts is describing declined consent, not a broken tag.
The order of checks that gets there fastest:
- Segment the Unassigned rows by source, host name, landing page and device.
- Count
session_startfor the period and compare it to sessions. - Load the storefront in a clean browser profile and watch whether GA4 sends anything before you interact with the banner.
Then say the honest thing about the result. Declined-cookie traffic is unattributable by design. It is the consent mechanism working. The article on Consent Mode v2 on Magento 2 covers the implementation and the modeling side, and neither ends with a way to recover the source for a visitor who said no.
Then check whether the GA cookie is readable at checkout
If consent is not the answer, the next rung is infrastructure, and it produces a much sharper symptom.
The extension captures the GA session identifiers from the GA cookies at the moment the order is placed, reading _ga_{MEASUREMENT_ID} for the session and the GA cookie for the client identifier. That capture is the join between the browsing session and the server-side purchase, and the Magento 2 GA4 server-side tracking setup guide shows where it sits in the wider server-side flow. Where the hosting or CDN environment prevents that cookie from being readable at that moment, the purchase goes out without session context, and GA4 files it under Unassigned.
Google's Measurement Protocol documentation explains why the parameter matters that much. The reference states that to ensure accurate session and user engagement metrics in your reports, you should include the session_id and engagement_time_msec parameters with your events [4], and the overview adds its timing rule for session-scoped context: include session_id in the event and send it to Measurement Protocol within 24 hours of the start of the session [5]. Without it, GA4 opens a session that has no source, and the definition from the first section takes over.
| What you observe | Which rung |
|---|---|
| Realtime healthy, standard reports wrong, orders under 48 hours old | Processing lag |
High Unassigned session count, very few session_start events |
Consent denied |
| Paid revenue collapsed into Unassigned after an infrastructure change, order counts normal | Cookie not readable |
| Unassigned traffic carries a source and a medium, but odd ones | Campaign tagging |
The check is a test purchase. Place one, and on the checkout and success domains confirm that the _ga_{MEASUREMENT_ID} cookie exists and is readable there. The browser console is worth watching during that order: a cookie rejected for an invalid domain is reported plainly, and that message is the answer. Cookie domain and scope under a proxy or CDN in front of the origin is the usual environment class.
Confirm the send itself separately, so you are not debugging two things at once. The PRO order grid carries a Measurement Protocol column that tells you the purchase left Magento, which is the subject of our guide to verifying GA4 events on Magento 2. An order that shows as sent and still lands in Unassigned is a context problem, not a delivery problem.
The rung that is your own tagging
Worth one paragraph, because it is the one cause on this list that nothing in your stack can fix for you.
Default channel rules test for recognized values. A campaign whose medium is bannerad, forum or qrcode matches no rule, and by the definition quoted at the top, GA4 has one place to put it [1]. This shows up on stores where marketing links are built by hand, by several people, over several years. The fix is a tagging convention that uses standard mediums, or a custom channel group that recognizes yours. Neither is a Magento change.
What you can change on the Magento side
Two settings are worth knowing about, and both are narrower than they first sound.
Client ID Fallback is a PRO option, off by default, that loads a lightweight gtag instance to retrieve the client identifier from the Google tag when the GA cookie is not available in the usual place [6]. It needs a Google tag running in the browser to do its work.
The second shipped in v1.17.4 on September 1, 2026. "Require Visitor Consent for Server-Side Events" gates the GA4 Measurement Protocol and every Conversions API addon on the shopper's Consent Mode v2 choice, and the consent state is stored on the order, so an order sent later by cron is judged on the consent the shopper actually gave at checkout [6]. It is disabled by default. This is the lever for merchants who would rather send nothing server-side for a visitor who declined than send an event that will land in Unassigned anyway. It changes what you send, not how it is attributed.
For the wider recovery question, what server-side tracking does and does not restore when the browser layer is blocked, the ad blockers and browser privacy article draws that line. The Shopify version of this same Unassigned investigation is in our piece on GA4 (not set) and unattributed orders, if you run both platforms.
FAQ
Is Unassigned revenue missing revenue?
No. The purchase reached GA4 and its value counts in revenue reports. What is missing is the channel, because no channel rule matched the event data [1]. Reconciling totals between GA4 and Magento is a separate exercise from reconciling channels.
How long should I wait before treating Unassigned as a real problem?
A full 48 hours, per GA4's documented processing window [2]. If Realtime shows healthy traffic during that wait, collection is fine and you are watching processing.
Why do consent-denied visitors show up at all if no cookies are set?
Because the order still exists. The purchase reaches GA4 from your server carrying no client session context, and advanced consent implementations also send cookieless pings that Analytics uses for modeling [3]. The session has no source to report, so it files under Unassigned.
Can a CDN cause this?
It can, when the cookie's domain or scope under that setup keeps the origin from reading it at order placement. The symptom is distinctive: paid revenue moves into Unassigned after an infrastructure change while order counts stay normal. Test with a real order and check the cookie on the checkout and success domains.
Does sending purchases server-side fix attribution by itself?
Not by itself. A server-side purchase carries the session identifiers captured from the GA cookies at order placement, and the overview's timing rule for session-scoped context asks for session_id within 24 hours of that session starting [4][5]. Server-side delivery makes the event arrive. The session context is what makes it arrive attributed.
Measurement Protocol purchases, the order grid validation column and the consent gating described above are PRO features of the Magento 2 Google Analytics 4 extension, currently v1.17.4, released September 1, 2026.
If you only have time for one thing today, run the session_start count. On stores with a consent banner it settles the question in five minutes, and on stores without one it eliminates the largest cause before you start reading cookies.
Sources
- [GA4] Default channel group, Analytics Help, retrieved September 7, 2026, https://support.google.com/analytics/answer/9756891
- [GA4] Data freshness, Analytics Help, retrieved September 7, 2026, https://support.google.com/analytics/answer/11198161
- Consent mode on websites and mobile apps, Analytics Help, retrieved September 7, 2026, https://support.google.com/analytics/answer/9976101
- Measurement Protocol reference, Google Analytics for Developers, retrieved September 7, 2026, https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference
- Measurement Protocol overview, Google Analytics for Developers, retrieved September 7, 2026, https://developers.google.com/analytics/devguides/collection/protocol/ga4
- WeltPixel Google Analytics 4 User Guide, v1.17.4, September 1, 2026, https://docs.weltpixel.com/GA4/User-Guide-WeltPixel-Google-Analytics-4.html