GA4 Troubleshooting

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.

Jun 21, 2026 8 min readBy The UTM Drift Guard team
GA4 Troubleshooting
EmailEMAILe-mailemail

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

EmailemailEMAILE-mail

One canonical medium

email
Four spellings of one email medium collapse into a single lowercase canonical value.
Every UTM parameter is case-sensitive in GA4 — not just the medium.
UTM parameterCase-sensitive in GA4?Typical drift
utm_sourceYesGoogle vs google
utm_mediumYesEmail vs email
utm_campaignYesSpring_Sale vs spring_sale
utm_content / utm_termYesany 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.

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.

Three links, three different mediums — only the casing changes.
https://acme.com/sale?utm_source=newsletter&utm_medium=Email&utm_campaign=spring_sale
https://acme.com/sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale
https://acme.com/sale?utm_source=newsletter&utm_medium=EMAIL&utm_campaign=spring_sale

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.

One real channel, scattered across three report rows by casing alone.
utm_medium writtenGA4 stores it asAppears in reports as
EmailEmailseparate medium row #1
emailemailseparate medium row #2
EMAILEMAILseparate 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. 1

    Make lowercase the only rule

    Write every utm_source, utm_medium, utm_campaign, utm_term, and utm_content value in lowercase. No capitals, ever — one rule, no exceptions to argue about.

  2. 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. 3

    Auto-lowercase at the source

    Use a governed link builder that lowercases every value as it is written, so a typed Email is saved and shipped as email automatically.

  4. 4

    Lock the approved values

    Keep a short list of canonical tokens — one email, one facebook, one google — and pick from it. Locked dropdowns beat memory once more than two people build links.

  5. 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.

  1. 1Marketer picks a valuechooses "Email" from a dropdown
  2. 2Builder lowercases itsaved as email
  3. 3Clean link shipsutm_medium=email
  4. 4GA4 stores one mediumno ghost rows
Lowercasing at the builder means GA4 only ever receives one clean value.

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. 1

    Export your source/medium

    Pull a source/medium or utm_medium export to CSV so you can see every spelling that exists, including the ones nobody remembers shipping.

  2. 2

    Cluster the case variants

    Group Email, email, and EMAIL under 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. 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. 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.

EmailemailEMAILE-mail
email
FacebookfacebookFBMeta
facebook
GooglegoogleGOOGLEgoogle-cpc
google
NewsletternewsletterNewsLetter
newsletter
The canonical map an audit produces: many spellings in, one lowercase token out.

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.
A
B
C
D
F
C
Audit output example: an A–F grade, with the case clusters that are dragging it down.

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.

Run a free audit