UTM Naming Conventions: Rules and a Copyable Template
A convention you can adopt as it stands: the rules that keep reporting consistent, a controlled vocabulary, a campaign name structure, and a template you can copy into a shared doc today.
Why a convention beats a tool
Building a tagged link is easy. Building the ten thousandth one the same way as the first is the hard part, and it is the part that decides whether your reports are readable. Nothing enforces UTM values: the analytics tool records exactly what is in the link, so Email, email and e-mail become three separate channels, and a campaign spelled two ways becomes two campaigns that never add up.
A convention is just a small set of decisions made once, so nobody has to make them again per link. It costs a few minutes to agree and seconds to follow. This page gives you one you can adopt as it stands, or adjust to fit how your team already thinks. None of it requires buying anything.
The rules that keep reporting consistent
Five decisions. Make them once, write them down, and every link after that is mechanical.
1. Lowercase everything, always
Analytics tools are case-sensitive, so one capital letter creates a second version of the same value. Lowercase every source, medium and campaign without exception. It is the single rule that prevents the most common split.
2. One separator, and it is a hyphen
Spaces are not legal in URLs and turn into %20; underscores are easy to miss and get confused with the parameter names. Pick the hyphen for spaces inside a value (spring-sale-2026) and never mix separators.
3. A fixed vocabulary for medium and source
Medium should be a short, closed list everyone knows by heart. Source is more open, but the ones you use often should also be agreed, so google is never also written adwords or google-ads.
4. No duplicate spellings, ever
paid-social, paidsocial and paid_social are three mediums to your analytics and one channel in your head. Agree the exact string and keep to it. This is what a naming template enforces automatically.
5. A campaign name with a fixed shape
Decide the pieces a campaign name contains and the order they go in, so two people naming the same campaign independently arrive at the same string. The structure below is a starting point.
A starting vocabulary for medium
Keep medium to a short closed list. These map cleanly onto the GA4 default channels, so your channel grouping works without custom rules. Add to it deliberately, not per campaign.
| utm_medium | Use it for | GA4 channel it feeds |
|---|---|---|
| Any email you send: newsletter, lifecycle, transactional | ||
| cpc | Paid search clicks you tag by hand | Paid Search (with a search source) |
| social | Unpaid social posts and bios | Organic Social |
| paid-social | Paid social ads | Paid Social (with a social source) |
| referral | Links from partner sites and directories | Referral |
| affiliate | Affiliate and partner-commission links | Affiliates |
| display | Banner and display buys | Display |
Source is the specific place inside the medium: google and bing for cpc; linkedin, x and instagram for social; the partner's own name for referral and affiliate. The point is not this exact list, it is that your team has one list and uses it.
A campaign naming structure
A campaign name reads best when its pieces are in a fixed order, separated by hyphens, going from broad to specific. Include only the pieces you will actually filter or group by. A common, reliable shape:
[theme]-[product-or-audience]-[region?]-[yyyymm?]
The last two pieces carry a question mark because they are optional: add region only if you run the same campaign in more than one, and add a date only if you run the same campaign more than once and need to tell the runs apart. A date on a one-off campaign is noise. Worked examples:
Everything in one campaign shares this exact string, on every link, in every channel. That is what lets a report add an email, an ad and a social post back into one campaign total.
The copyable convention
Here is the whole thing in one block you can paste into a shared doc, a wiki page or a team channel and start using today.
UTM naming convention Rules - Lowercase everything. No capitals, anywhere. - Hyphens for spaces inside a value. Never underscores or spaces. - Medium comes from the agreed list only (below). No new mediums per campaign. - One agreed spelling per source (google, not adwords/google-ads). - Campaign name shape: [theme]-[product-or-audience]-[region?]-[yyyymm?] - Never tag internal links (links between pages of our own site). utm_medium (closed list) email | cpc | social | paid-social | referral | affiliate | display utm_source (agreed spellings for the common ones) search: google | bing social: linkedin | x | instagram | facebook | youtube email: newsletter | lifecycle partners: [use the partner's short name] utm_campaign [theme]-[product-or-audience]-[region?]-[yyyymm?] e.g. spring-sale-2026, webinar-security-emea, black-friday-us-202611 utm_content (optional) Only when one campaign has several links to tell apart. e.g. header-cta | footer-cta | variant-a | variant-b utm_term (optional) Paid search keywords. Usually set automatically by the ad platform.
Adjust the vocabulary to match how your team already talks. The rules above the vocabulary are the part that should not change.
Good vs bad, and why
The bad column is not wrong syntax. Every one of these works technically and still breaks the report.
| Bad | Why it breaks | Good |
|---|---|---|
| utm_medium=Email | A capital creates a second medium. Email and email never add up. | utm_medium=email |
| utm_campaign=Spring Sale 2026 | Spaces encode to %20 and the capitals split it from the hyphenated version. | utm_campaign=spring-sale-2026 |
| utm_source=email&utm_medium=newsletter | Source and medium are reversed, so the traffic lands in the wrong channel. | utm_source=newsletter&utm_medium=email |
| utm_medium=paidsocial | A one-off spelling of an existing medium fragments the channel. | utm_medium=paid-social |
| utm_source=google-ads | A second spelling of a source you already use elsewhere as google. | utm_source=google |
When a document is not enough
A convention in a shared doc works right up until the team grows. Then someone new has not read it, someone in a hurry guesses, and the report drifts one misspelled campaign at a time. A document cannot stop that, because it is not present at the moment the link is made.
The version that holds is one where the rule runs when the link is created: the fields are required, an unknown medium is refused, and a duplicate is caught before it is saved. That is what Relay's UTM governance does inside TagPipes. This guide is how you design the convention; Relay is how you enforce it once designing it by hand stops scaling. You do not need it to start: adopt the template above first.
Frequently asked questions
Build one link by the convention, free.
The free builder lowercases and hyphenates for you and keeps any parameters already on the destination. When one convention has to hold across a team, Relay applies it at the moment a link is created.
Keep going
Understand the parameters, build the links, and enforce the convention.