UTMs with capitals, accents or spaces: why GA4 splits them into rows
Published by the UTM Builder team at Limner.
To GA4, Facebook, facebook and FB are three different sources, and each one gets its own row in the report. Channel rules, on the other hand, are case-insensitive: all three versions can land in the same channel and still show up separately under Source/medium. Accents and spaces change the text of the value and the way it travels in the URL.
The dimension is case-sensitive, the channel isn’t
Google’s help page on URL builders says parameter values are case-sensitive: utm_source=google is different from utm_source=Google. The same page names "Meta" and "meta" as different values and recommends lowercase as standard practice.
The default channel group page, however, says channel definitions are not case-sensitive. In practice:
utm_medium=Emailandutm_medium=emailboth land in the Email channel, but show up as two rows when you open Session source/medium.facebookandfbare both on the list of social sources Google publishes. Withutm_medium=social, both go to Organic Social, and you have to add them up by hand to know how much Facebook brought in.FBandfbare one value for the channel rule and two values for the source dimension.
That’s why the channel report can look fine while the campaign report is fragmented. Looking only at channels hides the problem.
Accents, spaces, + and &
- Accents.
verãoandverao(Portuguese for "summer") are different strings. Google’s help gives "SpringSale" and "Spring_Sale" as an example of distinct values; the Portuguese version of the same page translates it as "LiquidaçãoDePrimavera" and "Liquidação_de_Primavera", accents included. In the URL, an accented letter travels encoded in UTF-8:ãbecomes%C3%A3. - Spaces. A space can’t travel raw in a URL. It becomes
%20or+, depending on the tool that built the link. The browser’sURLSearchParamsreads+as a space, so a+that was meant to be literal arrives as a space on the other end. - &. In a URL,
&separates one parameter from the next. A campaign written aspais&filhoswithout encoding ends atpais, andfilhosbecomes a stray parameter. - Double encoding. When an already encoded value goes through the encoder again,
%becomes%25.Ver%C3%A3obecomesVer%25C3%25A3o, and after one round of decoding you still get%C3%A3where the letter should be.
Risky: utm_campaign=Promo Verão&Mães
Safe: utm_campaign=promo-verao-maes
The trap in the Portuguese help pages
If you or your team read GA4 help in Portuguese, watch out. The Portuguese version of the Default channel group page shows some rule values translated, such as "afiliados" where the English page says affiliate and "(direto)" where it says (direct). Open the same page in English and the value is different:
| Channel | Portuguese (pt-BR) help shows | English help shows |
|---|---|---|
| Affiliates | afiliados | affiliate |
| Audio | áudio | audio |
| Mobile Push Notifications | dispositivo móvel or notificação | mobile or notification |
| Paid channels (regex) | paga.* | paid.* |
| Organic Search | orgânica | organic |
| Direct (source) | (direto) | (direct) |
The Portuguese page has a footer note saying it may contain content translated with AI and that these translations may contain errors. Neither version says which text GA4 actually applies. Until you confirm it in your property, write the values as they appear in the English version, without accents, and check the channel in the simulator before you launch the campaign. utm_medium=afiliados and utm_medium=áudio are exactly the values at risk of ending up in Unassigned.
How to standardize
- Everything in lowercase, with no accents and no spaces, and hyphens between words:
promo-verao-maes. - A closed list of sources and mediums, written once and used by the whole team. The naming convention tool stores that list.
- Build the link in a tool that encodes the value instead of pasting text by hand, and encode only once.
- With dynamic parameters, the campaign name in the ad platform becomes the UTM value. Google’s own help uses
utm_campaign={{campaign.name}}as an example. Standardize the name there too.
What about data that already came in mixed?
For the channel report, a custom channel group merges the variants, and Google says it works retroactively. A standard property supports 2 custom groups, a 360 property supports 5, and creating one requires the Editor role or higher. For source and campaign, the merge happens in reporting: group the variants in a dashboard or a spreadsheet built from the GA4 export.