Email Traffic in GA4: Why It Looks Broken and How to Fix It
A retail client sent one number to their board and a different one to their agency. The email platform reported 12,400 clicks on last quarter's campaigns. GA4 reported 3,900 sessions where the channel was Email. Both figures came from the same sends, and neither system was malfunctioning. The gap was made of four separate mechanics that nobody had checked.
Email is the channel where GA4 disagrees with the source system most often, because the click happens outside the browser, through a redirect, on a device the person may not finish the journey on. This piece covers what decides whether a click becomes an Email session, where the traffic goes when it does not, and how to reconcile the two systems without pretending one of them is lying.
What the Email channel actually matches
GA4 does not read your intent. It reads the parameters on the landing URL and compares them against a fixed list of rules. For the Email channel the rule is short:
- Source matches email, e-mail, e_mail or e mail, or
- Medium matches email, e-mail, e_mail or e mail.
Either side is enough. The comparison is not case sensitive, and the definitions themselves cannot be edited. Traffic that arrives with utm_medium=email lands in Email. Traffic that arrives with utm_source=email and no medium at all also lands in Email, which is a common way for a badly tagged paid placement to be counted as owned email.
Everything else falls through the rest of the rule list, and if nothing matches, the channel group shows Unassigned. That single word explains a large share of the tickets agencies receive about email reporting. If your email platform writes utm_medium=campaign or utm_medium=flow, GA4 has no rule that accepts it. The click happened. The channel did not.
This is not hypothetical. Klaviyo changed its default medium values on 2 June 2025, from campaign and flow to message type. Accounts that saved custom UTM settings before that date keep the old values. Two brands on the same platform can therefore produce different channel reports from identical send behaviour, and the difference is a setting nobody has opened since 2024.
Message type also splits channels by itself. utm_medium=sms matches nothing in the default group, so SMS traffic sits in Unassigned until you build a custom channel group for it. Decide the medium taxonomy once and apply it everywhere.
Four tagging rules that decide whether any of this works
Google's URL builder documentation is specific about a few points that get skipped in implementation.
Set source, medium and campaign together. Google's guidance is that if you set one parameter, you should set all the relevant ones, especially those three. A URL carrying only a source creates a row that cannot be grouped with its siblings.
Parameter values are case sensitive. utm_source=Klaviyo and utm_source=klaviyo are different values. The recommended pattern is lowercase throughout, one source per platform, one medium per channel, and a campaign value matching the real campaign name, ideally filled from a dynamic parameter. That consistency is what stops one send appearing as three rows.
Use utm_content for links inside the same email. Google names this case directly: two call to action links in one message can carry different values so you can tell which one earned the click. That is the only reliable way to compare a hero button against a footer link without building custom events.
Know where the parameters survive. UTM values are omitted from the Landing page plus query string and Page path plus query string dimensions, and live in Page location instead. Report on a landing page without the query string and a tagged URL looks identical to an untagged one.
Where email goes when it does not become Email
The most common destination is referral traffic from the email platform's own click domain. Most senders wrap links in a tracking redirect, the recipient clicks the wrapper, and it redirects to your page. If parameters are dropped or rewritten in that hop, GA4 sees a referral from a domain you do not recognise, because no other rule fits.
GA4 handles some of this automatically. Self-referral detection stops your own domain or subdomains being treated as a new referrer, and the same applies to traffic arriving through the cross-domain linker. It does not know that a third party's redirect domain is an aspect of your business.
That is what the unwanted referrals list is for. You can add up to 50 conditions per data stream, they are evaluated with OR logic, and you need Editor or above at property level to configure them. When a URL matches, GA4 appends ignore_referrer=true to every event it sends from that page, which tells Analytics not to display that referrer as a traffic source.
Google's own example of a legitimate use describes email almost exactly. A password recovery operation sends an email, the user clicks back to the site, and the email domain appears as a traffic source. In Google's words, the email domain is acting as an aspect of your business rather than as a source of traffic. Excluding a click wrapper is the same judgement.
Two cautions. Do not exclude your own domain, because self-referral detection already covers it. And an exclusion is not retrospective. Google documents the case where a user arrives from the excluded domain, then returns directly: attribution uses the last non-direct click, so the later session is still credited to it. Expect a tail of old referral sessions and do not read the tail as failure.
Why the click does not always create an Email session
This is the part that makes the reconciliation argument hard, and it is a matter of scope rather than a bug.
GA4 stores traffic source values at three scopes. Event scoped dimensions describe the event that just happened, session scoped describe the session's start, and first user scoped describe the person's first acquisition. Source, medium and campaign exist at all three, and so do the manual equivalents.
A session begins when session_start fires, and its source is fixed at that moment. If someone already has an active session and clicks an email link, the click and the landing page are recorded and the event scoped source can carry the email values, but the session may still belong to whatever brought them in twenty minutes earlier. Session source then reads Organic or Direct while the email landing page shows the click plainly.
Test it rather than taking it on trust, because it interacts with session timeout, open tabs and the back button. In DebugView, click a tagged link inside an open session and watch whether session_start fires. If it does not, you have a real mechanism behind the gap.
The consequence is a reporting choice. For credit on the click, use event scoped source or sessions that started on an email landing page. For credit on the journey, use session source. Both answer different questions, and the argument ends once the report names its own.
Opens are not a measurement, and clicks are not clean either
Any metric that depends on a tracking pixel being fetched is no longer a measure of human attention. Apple's Mail Privacy Protection documentation is explicit: when the feature is on, Mail downloads remote content in the background by default, regardless of whether the person engages with the email. The download is routed through two separate relays, one that knows the IP address but not the content and one that knows the content but not the IP address. Apple's date on that page is 12 December 2025, and the behaviour has not changed since the feature shipped.
A pixel fetched at delivery is an open. It is not interest, not a read, and it cannot trigger a lifecycle stage or prove a subject line worked. If your platform still leads with open rate, treat it as a deliverability signal rather than a behavioural one.
Clicks are better but not perfect. Link scanners in corporate mail security prefetch URLs before the recipient sees the message, and some of those fetches execute the redirect. That noise is small compared with the open problem, and it is the reason to reconcile clicks against on-site behaviour rather than trusting the click count as revenue intent.
How to reconcile the two systems honestly
Pick one source of truth per question before comparing anything. The platform owns sends, bounces, complaints and clicks. GA4 owns on-site sessions, engagement and the conversion event. Where they overlap, expect a gap and explain it rather than averaging it away.
Three factors set the size of that gap. GA4 processing takes 24 to 48 hours and attribution credit can keep moving for up to 12 days, so a same day comparison measures the pipeline. The systems count different things: a click is a redirect, a session is a browser with consent and a working tag. And the platform's conversion figure comes from its own database, which is why Klaviyo states in its documentation that its conversion tracking is generally more accurate than Google Analytics. That is a vendor claim, and it is directionally fair, since the platform can see the order without the browser cooperating.
Instead of a single reconciliation number, build one control: sessions that began on a tagged email landing page, compared against the platform's click count for the same dates and campaign. That view absorbs the wrapper domain, the Unassigned rows and the open problem together, and what is left is usually small enough to name.
The consent question does not go away
None of this changes the legal position on the send itself. The ICO is direct: you must not send marketing emails to individuals without specific consent, there is a limited exception for your own previous customers known as the soft opt-in, and you can send marketing emails to companies. The measurement setup does not create consent, and it cannot substitute for a record of one.
On the landing page the usual rule applies. Analytics storage needs a consent choice before the tag does its work, and an email click is not consent for anything. If email converts at half the rate of paid search, check whether the tag fires before the banner is answered. That reads as a channel difference when it is a timing difference.
What to change this week
- Open the Traffic acquisition report and filter source medium for your email platform's click domain. If it appears, add it to unwanted referrals and recheck next week.
- Check what your platform actually writes into utm_medium. Anything other than email will not reach the Email channel.
- Standardise to lowercase, one source per platform, one medium per channel, and a campaign value that matches the real campaign name.
- Add utm_content to the second and third links in every template so you can compare them later.
- Build one exploration on event scoped source and one on session source, then decide which one your monthly report uses and write that down.
- Stop reporting open rate as engagement. Report clicks, landing sessions and the conversion event, and say which system produced each.
The client at the start of this article had no tracking failure. They had two systems answering two different questions and a report that mixed the answers. Name the question and the argument becomes a five minute conversation about definitions, which is the only kind worth having.
Email Numbers Not Matching GA4?
North Digital audits email attribution end to end: UTM taxonomy, channel group rules, referral exclusions and the reporting definitions behind them, so the platform figure and the analytics figure can be explained in one page.
Talk to North Digital