How do you build a UTM naming convention that keeps GA4 reports clean?
You decide the allowed values before anyone tags a link, write them into a spreadsheet that generates the URLs, and make that spreadsheet the only place links get built. The convention is not the hard part. Making it the path of least resistance is the hard part, and that is what the spreadsheet does.
This guide is for a specific situation. You are a founder or a small marketing team running a handful of channels, your GA4 acquisition reports have turned into a list of near-duplicates, and you suspect the numbers are wrong but cannot prove which ones. That is a tagging discipline problem rather than an analytics problem, and it is fixable in an afternoon.
What you will end up with is a short list of approved values, a sheet that builds correct links from dropdowns, and a way to check in GA4 that the tags are landing. No code, no new tool.
What do the UTM parameters actually do in GA4?
They tell Google Analytics where a visit came from, in your words rather than its guesses. Google documents nine of them, and five carry most of the weight: utm_id for the campaign ID, utm_source for the referrer, utm_medium for the marketing medium, utm_campaign for the product or promo, and utm_source_platform for the platform directing traffic.
The single most important thing to understand before you write a convention is that, in Google's words, "parameter values are case sensitive, e.g. utm_source=google is different from utm_source=Google." That one line explains most broken acquisition reports I have ever looked at. Two people tagged the same channel with different capitalisation, and the report now shows two channels.
Google also warns about what happens when you leave parameters off, stating plainly that "missing UTM parameters will result in (not set) values being present in reporting." If your reports are full of (not set), that is not a GA4 bug. It is a description of links that went out untagged or half tagged.
Which parameters should you actually set?
Google's own guidance is unambiguous. It says that "if you're setting one UTM parameter, we strongly recommend that you set all relevant UTM parameters, especially utm_source, utm_medium, utm_campaign, utm_id, and utm_source_platform." That is the five to standardise on, and everything else is optional depth you add when a channel needs it.
In practice, for a small team, I would treat source, medium, and campaign as mandatory on every single link, with no exceptions and no judgment calls. Those three answer where it came from, what kind of thing it was, and which push it belonged to, which covers the majority of questions you will ever ask of the report.
The other four Google documents are utm_term for paid keyword, utm_content to differentiate creatives, utm_creative_format for the type of creative, and utm_marketing_tactic for targeting criteria. Add utm_id when you are running paid activity you need to reconcile against spend, and utm_content when you are testing two versions of the same thing. Resist adding parameters you do not have a question for, because every optional field is another place for two people to disagree.
How do you write a naming convention that survives contact with reality?
Start with the rule that makes everything else enforceable: everything is lowercase, always, with no exceptions. Because values are case sensitive, lowercase is the only convention that cannot be accidentally violated by someone typing naturally. Pair it with hyphens rather than spaces or underscores, and use one separator everywhere.
Next, fix the vocabulary rather than the format. Medium should be a closed list of maybe six values that describe the kind of channel, such as email, social, cpc, referral, affiliate, and qr. If you find yourself wanting a seventh, that is worth ten minutes of thought rather than a quick addition, because every value you add is a row in a report someone will have to interpret later.
Source should name the specific place, not the kind of place, so linkedin rather than social, and newsletter-weekly rather than email. Campaign should name the push rather than the asset, so that everything belonging to one launch shares a campaign value no matter which channel carried it. A good test is whether you could read the three values aloud and reconstruct what you were doing that week.
How do you build the spreadsheet that generates the links?
Create a sheet with three tabs. The first is the reference tab holding your approved values, one column per parameter. The second is the builder tab where a person picks values from dropdowns and gets a finished URL. The third is the log, which is simply every URL you have generated, appended over time.
On the builder tab, make each input cell a dropdown that reads from the reference tab, so nobody can type a free-text value. Then build the URL in a formula cell that concatenates the destination with a question mark and the parameters joined by ampersands. Wrap the whole thing in a lowercase function so that even a pasted value gets normalised before it goes out. That single wrapper prevents the most common failure.
The log tab matters more than it looks. Six months from now, when a report shows a campaign value nobody recognises, the log is how you find out what it was and who sent it. Timestamp each generated row and add a column for who it was for. This is the part people skip, and it is the part that turns a spreadsheet into an institutional memory.
How do you stop people from bypassing the spreadsheet?
By making it faster than the alternative, and by removing the alternative where you can. If building a tagged link takes four clicks in a sheet somebody already has open, most people will use it. If it takes finding a document, reading a policy, and typing carefully, they will paste a raw URL and move on.
The enforcement that actually works is social rather than technical. Agree that any link in an email, ad, or post gets built in the sheet, and when somebody sends an untagged one, fix it rather than complaining about it. Two or three friendly corrections establish the norm faster than any written policy. I have watched teams write elaborate tagging guidelines that nobody read and a shared sheet that everybody used.
Where a platform builds links for you, decide deliberately whether to let it. Some tools append their own parameters and some replace yours. Check what actually arrives rather than what you intended, which brings us to the part everybody skips. If you are tagging links that point at a Webflow site, I have covered the setup side of UTM tracking for Webflow campaigns separately.
How do you check it is working in GA4?
Send yourself a tagged link, click it, and look for your own visit in the realtime report with the source and medium you expect. Do this before the campaign goes out, not after. It takes two minutes and it catches the case where a redirect or a link shortener quietly strips your parameters.
Once traffic is flowing, the check that matters is looking for near-duplicates in your acquisition report. Two rows that differ only by capitalisation, a trailing space, or a singular versus plural word are the symptom of convention drift. Google's case sensitivity rule means these will never merge on their own, so you catch them by looking rather than by waiting.
Then look at how much of your traffic is landing as (not set), because Google tells you directly that this is the signature of missing parameters. A large (not set) share is a map of where your tagging discipline is leaking, usually a specific channel or a specific person. If you want the broader picture of how this fits into measurement for a small team, I have written about attribution for a small B2B team.
What do you do about the mess already in your reports?
Leave it alone and draw a line. Historical UTM values are baked into data that has already been collected, and no amount of cleanup will retroactively merge Google and google in reports that already exist. Trying to fix the past is how this project dies before it fixes the future.
What you can do is annotate. Write down the date you adopted the convention and keep that note where anyone reading a report will see it. When somebody compares this quarter to last quarter and the channel names changed, the note is the difference between a five minute explanation and an hour of confusion.
If a particular historical comparison genuinely matters to a decision, handle it once, manually, by grouping the variants yourself in a spreadsheet for that specific question. That is a one-off analysis rather than a cleanup project, and treating it that way keeps it from expanding.
What should you do next?
Open your GA4 acquisition report and look at the source and medium values from the last ninety days. Count how many rows are really the same channel spelled differently, and note how much traffic sits in (not set). Those two numbers are your baseline and they are usually worse than people expect.
Then build the reference tab before anything else. Six mediums, your actual sources, all lowercase, all hyphenated. The builder formula takes ten minutes once the vocabulary is settled, and the vocabulary is the part that needs a real decision. Send one tagged test link to yourself, confirm it arrives correctly, and only then roll it out to whoever else sends links. If you also need tagged links to tie back to form submissions, my walkthrough of tracking Webflow form conversions in GA4 covers that side of the loop.
If your reports are messy enough that you are not sure where to start, or you want a second opinion on a convention before you commit a team to it, reach out. It is a quick conversation and it saves a lot of retroactive squinting.
Get found, cited and the back office automated
Let's make your site the source AI engines quote and wire up the systems behind it.
Read more blogs
Let's get your website found and cited by AI
Tell me what you're working on, whether AI search is skipping your product, your back office is buried in manual work, or you need a build that does both.