Thirteen thousand sessions called Social
An audit of a live GA4 property found 13,494 sessions split across two spellings of one word. Why Tag Docket lowercases every value with no way to turn it off, and the other small things that quietly split a report.
Here is the line from the audit. One live GA4 property, and its medium report showed two rows that were plainly the same thing: social and Social. Between them, 13,494 sessions had been split in two by a capital letter.
Nobody did this on purpose. At some point a link went out tagged Social instead of social, probably typed by hand into a spreadsheet, and GA4 did exactly what it is designed to do. It treats Social and social as two different values. It treats Facebook and facebook as two different sources. It does not guess what you meant, and it does not go back and merge them later.
So the report that should have answered “how did social do this month” answered a slightly different question, and nobody could see the difference from the top line.
Why we lowercase everything, with no setting
Tag Docket lowercases every value, unconditionally. There is no setting to turn it off.
The reason there is no setting is that the setting would be the bug. A toggle for case sensitivity is a toggle for producing the report above. It only takes one account where somebody switched it on for a client who “likes it capitalised”, and that client now has two rows for every source their previous agency tagged in lowercase. Nobody reading the report later will know the toggle existed.
Lowercase is not a matter of taste here. It is the only spelling that cannot collide with itself.
The other things that split a report
Case is the famous one. It is not the only one, and most of the rest are just as small.
Two names for one source. fb and facebook. ig and instagram. google and adwords, left over from a template somebody wrote years ago. A spreadsheet lets every buyer type what they remember. Tag Docket offers the values the agency has approved and nothing else, so there is one spelling of each source because there is only one available to pick. The agency edits that list; the builder enforces it.
Combinations that cannot be true. utm_medium=email with utm_source=facebook is not a typo in either field, which is why no spelling check catches it. The agency can record which values go together — “email comes from Mailchimp or HubSpot” — and the builder narrows the choices once a medium is picked, saying which selection narrowed the list. When a combination arrives some other way, through bulk paste or an import, it is warned about rather than refused, because an old link that breaks a rule written last week is exactly the thing you want recorded.
A separator hiding inside a value. Plenty of agencies compose a campaign string like spring26_freeinspect_cedarrapids, and that is a good habit. It lets the string be read back into its parts later. It also stops working the first time a value contains the separator itself. If an offer could be free_inspect, the string can no longer be taken apart with any confidence. Tag Docket refuses a value containing the org’s separator at the moment it is saved, not when a link is minted, so the registry can never hold a value that would produce an unreadable string months from now.
A macro that got “tidied”. Ad platforms fill in their own tokens when an ad serves: {campaignid} on Google, {{campaign.name}} on Meta and Snapchat, __CAMPAIGN_NAME__ on TikTok. A tool that helpfully lowercases or URL-encodes one of those has broken it, and the link will look perfectly correct right up until the ad runs. This is the one place the lowercase rule stops. Anything Tag Docket does not recognise as one of the agency’s own dimensions passes through byte for byte, and unresolved tokens are checked against the platform’s pack so a typo that no platform would recognise either gets flagged.
A renamed slug. Sometimes the agency really does want to change a value, say cedarrapids to cedar-rapids. That change is the one edit that splits future reporting from past data, and in a settings screen it looks completely harmless. So before the change lands, Tag Docket shows inline how many links carried the old value. The existing links keep the value they were minted with, because GA4 already recorded it. The count is there so the person making the change knows what they are about to split.
What this does not fix
None of this repairs the 13,494 sessions that were already split. GA4 recorded what it was sent. A link that has already shipped stays exactly as it shipped, which is also why Tag Docket never rewrites one after it is minted.
What it changes is next month. Every link from here on is spelled the only way it can be spelled, from values somebody chose deliberately, and it is recorded in one place along with who made it and what it points at. The old spreadsheet can come in too. An import keeps the strings exactly as they were served, including the capital S, and flags anything the taxonomy cannot read rather than refusing it. That flagged row is usually the most useful one in the file.
The cheapest fix in analytics
Case drift is one of the few data-quality problems with no judgement call in it. There is no argument for Social being a different medium from social. The only question is whether the tool that makes the links is allowed to produce both.
If your agency’s links are still made in a spreadsheet, it is worth ten minutes in GA4 sorting your source and medium reports alphabetically and reading down the list. Anything that appears twice with different capitals is a report that has been quietly wrong.
If you would rather that could not happen again, this is what Tag Docket is for. We are onboarding agencies directly, and you can request access whenever it suits.