UTM Case Sensitivity in GA4: Why Email and email Split
GA4 reads Email, email, and EMAIL as three separate mediums, so one channel scatters into ghost rows. Here is how to fix the case drift and merge the history.
You opened the GA4 source/medium report and your email channel looks wrong. The sessions are too low, and a few rows down you find a second Email line, then an EMAIL line. Nobody changed the campaign. GA4 is just reading three spellings of the same medium as three different channels.
Why GA4 splits Email, email, and EMAIL#
GA4 stores every UTM value exactly as it is written in the link. It does not lowercase, trim, or normalize anything. So the medium Email and the medium email are, to GA4, two unrelated strings — the same way Cat and cat are different keys in most databases. Add EMAIL from a third teammate and you now have three mediums where you meant one.
This is not a tracking failure. It is how the parameter system is designed: faithful, literal, and unforgiving of casing. The drift comes from the humans and tools writing the links — a builder here, a hand-typed link there, an agency template somewhere else. GA4 UTM not working walks the full triage, but case is the single most common cause of duplicate channel rows.
What GA4 stores today
One canonical medium
| UTM parameter | Case-sensitive in GA4? | Typical drift |
|---|---|---|
utm_source | Yes | Google vs google |
utm_medium | Yes | Email vs email |
utm_campaign | Yes | Spring_Sale vs spring_sale |
utm_content / utm_term | Yes | any mixed casing |
3
mediums GA4 records for Email, email, and EMAIL
26%
of conversions can be credited to the wrong channel when UTM data is fragmented
10–20%
of GA4 sessions commonly land in Unassigned
Case drift spreads because most teams never wrote the rule down. 67% of teams use UTMs, but only 58% have a documented strategy (SEMrush, 2024) — and the moment a value like the medium has no agreed casing, every person picks their own. A documented UTM naming convention for teams is what stops the spread.
See the ghost rows in real links#
Here are three links your team might ship in the same week. They point at the same newsletter, the same audience, the same offer. Look only at utm_medium.
In GA4 those resolve to three rows: newsletter / Email, newsletter / email, and newsletter / EMAIL. Your real email performance is the sum of all three, but no single report shows it. Sort by sessions and each fragment looks like a small, underperforming channel.
| utm_medium written | GA4 stores it as | Appears in reports as |
|---|---|---|
Email | Email | separate medium row #1 |
email | email | separate medium row #2 |
EMAIL | EMAIL | separate medium row #3 |
These are ghost campaigns
A "ghost campaign" or ghost row is not a real, separate campaign — it is one campaign split by spelling. Case variants are the most common cause, so clustering the variants back to a single token makes the ghosts disappear.
Fix it going forward: make every value lowercase#
You cannot ask GA4 to be case-insensitive — it has no such setting. So you remove the variable instead: pick lowercase as the only allowed casing for every UTM value, everywhere. Lowercase is the simplest rule that erases the entire class of case drift, because there is nothing to remember beyond "always lower."
- 1
Make lowercase the only rule
Write every
utm_source,utm_medium,utm_campaign,utm_term, andutm_contentvalue in lowercase. No capitals, ever — one rule, no exceptions to argue about. - 2
Stop hand-typing links
Free-typed links are where capitals sneak in. Move link creation into a builder so the value is chosen from a list, not typed from memory.
- 3
Auto-lowercase at the source
Use a governed link builder that lowercases every value as it is written, so a typed
Emailis saved and shipped asemailautomatically. - 4
Lock the approved values
Keep a short list of canonical tokens — one
email, onefacebook, onegoogle— and pick from it. Locked dropdowns beat memory once more than two people build links. - 5
Write the convention down
A documented rule is one people can follow. Capture it next to the builder so new hires and agencies inherit it on day one.
- 1Marketer picks a valuechooses "Email" from a dropdown
- 2Builder lowercases itsaved as email
- 3Clean link shipsutm_medium=email
- 4GA4 stores one mediumno ghost rows
Tip
Lowercase is not the only valid convention, but it is the one that removes the most ambiguity. Whatever you choose, choose exactly one — and let the builder enforce it instead of trusting everyone to remember.
Clean the history you already collected#
GA4 will not rewrite the past
GA4 stores each hit exactly as it arrived and never re-processes it. Fixing your link template only cleans new traffic — the Email and EMAIL rows you already collected stay as they are. To see merged history, you fix the report, not the stored data.
You have two jobs: stop new ghost rows (above) and fold the existing ones together in reporting. The second is a mapping problem — decide which spellings mean the same thing, then tell GA4 to show them as one.
- 1
Export your source/medium
Pull a source/medium or
utm_mediumexport to CSV so you can see every spelling that exists, including the ones nobody remembers shipping. - 2
Cluster the case variants
Group
Email,email, andEMAILunder one lowercase token, and do the same for every other channel. An audit clusters these for you and ranks them by traffic impact, so you fix the rows that matter first. - 3
Merge them in a custom channel group
Create a custom channel group — or an Exploration with a case-insensitive regex match — that maps every case variant to one channel, so reports show a single email row again.
- 4
Lock the canonical taxonomy
Save the cleaned list of values as your approved taxonomy and point the builder at it, so the history you just merged cannot drift apart again.
Merged casing also recovers sessions that were previously scattered or miscounted — the same hygiene that helps with recovering Unassigned GA4 traffic.
The payoff
Standardizing casing is small work with outsized reporting impact. Teams that standardize see a 29% improvement in attribution accuracy (Cometly, 2026) — most of it from no longer splitting real channels into ghosts.
Common mistakes that keep ghost rows alive#
- Fixing one capitalized link by hand and assuming the rest are clean — case drift hides in the links you never opened.
- Using Title Case "because it looks nicer." It reads well and quietly splits every report. Casing is plumbing, not design.
- Trusting a spreadsheet to hold the line. Spreadsheets stop enforcing consistency the moment more than two people touch them — which is why teams move from a spreadsheet to governed links.
- Lowercasing new links but never merging the old rows, so historical reports stay fragmented.
- Letting each tool pick its own casing — a CMS plugin, an agency template, and a hand-typed link will each capitalize differently unless one builder owns the value.
Is GA4 case-sensitive for UTM parameters?
Yes. GA4 stores every UTM value exactly as written, so Email, email, and EMAIL are three different mediums and appear as three rows. The same applies to utm_source, utm_campaign, utm_term, and utm_content. There is no setting to make GA4 ignore case, so the fix is to standardize on one casing — lowercase is the simplest.
Why does my email channel show up twice (or three times) in GA4?
Almost always casing. Different links shipped Email, email, and EMAIL, and GA4 kept each spelling as its own medium. Your true email number is the sum of those rows. Merge them with a custom channel group for history, and lowercase every new link so it stops happening.
What are ghost campaigns in GA4?
Ghost campaigns — or ghost rows — are extra report lines created by inconsistent UTM values, most often case variants like Spring_Sale and spring_sale, or Email and email. They are not real, separate campaigns; they are one campaign split by spelling. Clustering the variants to a single canonical token makes the ghosts disappear.
Should UTM parameters be lowercase?
Yes, as a rule. Lowercase is the easiest convention to enforce because there is nothing to remember beyond "always lower," and it removes case drift entirely. What matters is not which casing you pick but that you pick exactly one and let a builder apply it automatically.
Can I fix UTM casing in data GA4 already collected?
Not in the stored hits — GA4 never rewrites historical data. You fix the report instead: build a custom channel group or an Exploration that maps every case variant to one channel. Going forward, lowercase at the link builder so no new ghost rows are created.
Find every case-split row in your account
Paste a GA4 source/medium export and get an A–F UTM health grade in about a minute — with the case variants clustered for you.