Using UTM Parameters Properly: Naming Rules and Pitfalls
How to use utm_source, medium and campaign correctly — naming conventions, GA4 channel mapping and mistakes.
UTM parameters are five query-string parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) you append to a URL to tell analytics tools like GA4 exactly where a visitor came from and through which channel. Without them, clicks from your newsletters, paid ads and social posts collapse into direct or vague referral buckets — and you lose the ability to answer the one question marketing analytics exists for: which channel actually drove conversions.
The catch is that UTMs are unforgiving. A single capital letter or a non-standard medium value will split one campaign into two report rows, or dump your email traffic into GA4's dreaded Unassigned channel. This guide covers the correct semantics of each parameter, the GA4 default channel grouping table, naming conventions that survive team growth, and the four pitfalls that break tracking most often in practice — illustrated with one newsletter link done right and three broken variants. Generate links with the UTM builder and audit URLs you have already shipped with the UTM parser.
What each parameter means: source is “where”, medium is “how”, campaign is “why”
Each of the three required parameters answers a different question. Mixing them up — putting email in source, for instance — corrupts every downstream report.
| Parameter | Question it answers | Example values | Required? |
|---|---|---|---|
utm_source | Where did the click come from — the specific site, platform or sender | google, facebook, newsletter, mailchimp | Yes |
utm_medium | How did it arrive — the channel type; GA4's primary classification signal | cpc, email, social, display, referral | Yes |
utm_campaign | Why did you send it — the promotion or initiative this link belongs to | 2026-07-summer-sale, launch-v2 | Yes (strongly recommended) |
utm_term | Which keyword — the bid keyword in paid search | ssl-checker, utm+builder | Optional (paid search) |
utm_content | Which creative or placement — A/B variants within one campaign | hero-banner, footer-cta, variant-b | Optional |
A one-line mnemonic that prevents most mistakes: source = where, medium = how, campaign = why. For a newsletter, the source is the sender or list name (newsletter), the medium is the channel type (email), and the campaign is that issue's purpose (2026-07-product-update). Swap source and medium and GA4's channel classification falls apart, as the next section shows.
GA4 default channel grouping: your medium value decides the channel
GA4 automatically sorts sessions into default channel groups — Paid Search, Email, Organic Social, Display and so on — and the strongest input to that decision is utm_medium. Here is the mapping that matters in practice.
utm_medium value | GA4 channel group | Notes |
|---|---|---|
cpc, ppc, paid, retargeting | Paid Search / Paid Social / Paid Other | Refined by source: search engines become Paid Search, social platforms Paid Social |
email, e-mail, e_mail | Newsletters and transactional mail alike | |
social, social-network, sm | Organic Social | Unpaid posts only — paid social ads must use cpc/paid |
display, banner, cpm | Display | Banner and programmatic placements |
affiliate | Affiliates | Partner links |
referral | Referral | Plain links from other sites (usually classified automatically without UTMs) |
Anything else (newsletter, eDM, …) | Unassigned | Values outside the rule set fall through — the single most common tagging failure |
This is why medium is not the place for creativity. utm_medium=newsletter looks perfectly sensible, but because it matches no channel rule, those sessions land in Unassigned and your Email channel silently under-reports. Pick medium from the standard vocabulary above and express finer distinctions through source, campaign and content instead. Before a link ships, paste it into the UTM parser to confirm the medium is a value GA4 will recognise.
Naming rules: lowercase, no spaces, one shared taxonomy
GA4 treats UTM values as case-sensitive. Facebook and facebookbecome two separate sources, two report rows, and a recurring manual merge job for whoever builds the monthly dashboard. Three rules keep a team's data clean:
- Lowercase everything.
Facebook≠facebook≠FACEBOOK. No exceptions, ever. - No spaces. Spaces get encoded as
%20or+, look broken in reports, and are parsed inconsistently across tools. Pick one word separator — hyphen (-) or underscore (_) — and use it everywhere (e.g.summer-sale). - Maintain a taxonomy document. Keep a single spreadsheet listing the allowed source and medium values plus a campaign naming pattern (e.g.
{yyyy-mm}-{theme}-{region}), and require every new campaign to pick from it. UTM programs rarely fail for lack of tooling — they fail because five people each invent their own spelling.
Because humans forget conventions under deadline pressure, standardise link creation on a tool. The UTM builder handles URL encoding for you and makes it easy to reuse the same parameter combinations, which is exactly what kills typo-driven data fragmentation.
Four pitfalls that break tracking: internal links, gclid/fbclid, redirects, fragments
- Never tag internal links. Putting UTMs on a banner or menu item that points to another page on your own site makes GA4 treat the click as a new traffic source and overwrite the session's attribution. A visitor who arrived from a paid ad suddenly becomes “internal banner” traffic and your ad ROI evaporates from the report. Track on-site clicks with events, not UTMs.
gclidandfbclidare not UTMs. These are click identifiers appended automatically by Google Ads and Meta. They do not replace UTM parameters, and you should never hand-edit them. Google Ads auto-tagging (gclid) is more precise than manual UTMs; if you run both, check your account settings for which one wins.- Redirects can swallow parameters. Depending on how a URL shortener or an
http→https/non-www→wwwredirect is configured, the query string may not be forwarded to the final URL. Click the link yourself, check the address bar at the destination, and when in doubt decompose the final URL with the UTM parser. - UTMs after a fragment (
#) are dead on arrival. By URL specification, everything after#is a fragment that is never sent to the server. A link likeexample.com/page#section?utm_source=...delivers nothing to GA4. The correct order isexample.com/page?utm_source=...#section— query string first, anchor last.
Worked example: one newsletter link, done right vs three broken variants
Suppose you are tagging the landing-page link in a July promotion newsletter. The correct version looks like this:
https://example.com/promo?utm_source=newsletter&utm_medium=email&utm_campaign=2026-07-summer-sale#pricing
| Variant | What is wrong | What GA4 shows |
|---|---|---|
...?utm_source=Newsletter&utm_medium=Email&... | Capital letters | Newsletter/Email appear as separate rows from their lowercase twins — one campaign's numbers split in two |
...?utm_source=email&utm_medium=newsletter&... | Source and medium swapped | medium=newsletter matches no channel rule, so sessions land in Unassigned and vanish from the Email channel |
...promo#pricing?utm_source=newsletter&... | UTMs placed after the # fragment | No parameters reach GA4 at all — the session shows up as direct / none or as a referral from the mail client |
The cruel part: all three broken links “work” perfectly for the person clicking them, so nobody notices until the monthly report looks wrong. Build the habit of a two-step check — generate with the UTM builder before sending, then reverse-audit shipped links with the UTM parser.
Frequently asked questions
I always mix up utm_source and utm_medium. Is there a simple rule?
Why is utm_medium=newsletter wrong?
Can I put UTM parameters on internal links to track banner clicks on my own site?
If gclid or fbclid is already on the URL, do I still need UTMs?
Does capitalization really create separate entries?
Tools to use with this guide
Related guides
- Setting Up hreflang: Stop Multilingual SEO DuplicationConfigure hreflang correctly for multilingual sites and avoid the x-default and return-tag mistakes.