Open the Traffic acquisition report in most Google Analytics 4 properties and you'll find the same mess: facebook, Facebook and fb as three separate sources, a newsletter that shows up as "Unassigned," and campaigns named test, Spring Sale and spring-sale-final-v2. None of that is GA4's fault. It's what happens when UTM tags are written by hand with no shared rules.
A short naming convention fixes it. Here's how GA4 actually reads UTM parameters, the rules that keep reports clean, and a template you can adopt as-is.
The UTM parameters GA4 uses
UTM parameters are added to the end of a link so Analytics knows where a visit came from. According to Google's documentation, you "should always use utm_source, utm_medium, and utm_campaign." The full set:
| Parameter | Answers | Example |
|---|---|---|
utm_source | Who sent the visit? | newsletter, facebook, google |
utm_medium | What kind of channel? | email, social, cpc |
utm_campaign | Why? Which promotion? | spring_sale |
utm_id | Campaign ID, for matching with other data | q2-042 |
utm_term | Paid keyword | running_shoes |
utm_content | Which link or creative? | hero_button |
Google also lists utm_source_platform, utm_creative_format and utm_marketing_tactic, but notes that the last two "isn't currently reported in Google Analytics properties." If a required parameter is missing, Google warns that it "will result in (not set) values being present in reporting."
Rule 1: Use lowercase for everything
Google is explicit: "Parameter values are case sensitive, e.g. utm_source=google is different from utm_source=Google." In your reports, Newsletter and newsletter become two rows, and every total you look at is split.
There's a subtlety here. GA4's default channel group rules are not case-sensitive ("Channel definitions aren't case sensitive"), so Email and email both land in the Email channel. The split shows up as soon as you look at source, medium or campaign. Lowercase everything and the problem never starts.
Rule 2: Pick one word separator
Spaces in URLs have to be encoded, which turns spring sale into spring%20sale or spring+sale depending on the tool (URL Encoding Explained covers why). Avoid the question entirely: choose underscores or hyphens and use the same one everywhere. Mixing them gives you spring_sale and spring-sale as two campaigns.
Rule 3: Use mediums GA4 recognizes
This is the rule that matters most, and the one most often broken. GA4 sorts visits into channels like Email, Paid Search and Organic Social mostly by looking at utm_medium, sometimes together with utm_source. If your medium doesn't match any rule, the visit goes to Unassigned, which Google describes as "the value Analytics uses when there are no other channel rules that match the event data."
Some of the default channel rules, from Google's documentation:
| Channel | Matching rule (simplified) |
|---|---|
Source or medium is email, e-mail, e_mail or e mail | |
| Organic Social | Source is a known social site, or medium is social, social-network, social-media, sm, social network or social media |
| Paid Search | Source is a known search site and medium matches ^(.*cp.*|ppc|retargeting|paid.*)$ |
| Paid Social | Source is a known social site and medium matches the same paid pattern |
| Display | Medium is display, banner, expandable, interstitial or cpm |
| Affiliates | Medium is affiliate |
| Referral | Medium is referral, app or link |
| SMS | Source or medium is exactly sms |
So utm_medium=newsletter doesn't count as Email, but utm_source=newsletter&utm_medium=email does. utm_medium=qr or utm_medium=print match nothing and become Unassigned. Put the detail in the source or campaign instead, and keep the medium generic.
Note the paid pattern: any medium containing cp, such as cpc or cpm, or starting with paid, counts as paid. Don't use a medium like paid-partnership for a free mention, or you'll inflate your paid numbers.
Rule 4: Make campaign names readable a year from now
A good campaign name tells someone who wasn't in the meeting what it was. A simple pattern works well:
[what]_[audience or market]_[period]
spring_sale_us_2026q2
webinar_onboarding_2026-05
black_friday_2026
Avoid names like test, campaign1, final or internal codes nobody can decode later. If you need a code to match a budget line or ad platform, put it in utm_id and keep the name readable.
Rule 5: Use utm_content to compare links
When one email or post has several links, give each its own utm_content: hero_button, footer_link, image. Everything else stays the same, so the campaign totals stay together while you can still see which link people clicked.
Rule 6: Never tag internal links
UTM tags describe how someone arrived at your site. If you put them on links between your own pages, such as a banner on your home page, Analytics reads them as a new campaign. Google's documentation on traffic-source dimensions explains that when UTM parameters are present, Analytics derives the traffic source values from them, so the visitor's real source gets replaced by your internal label. Track internal clicks with events instead.
Rule 7: Keep personal data out
Never put email addresses, names or customer IDs in UTM values. URLs end up in analytics reports, server logs, browser histories and referrer headers, and Google Analytics doesn't allow sending personally identifiable information. Google's guide to avoiding PII calls out URLs as a common way it leaks in.
A naming sheet you can copy
| Where the link goes | utm_source | utm_medium | utm_campaign example |
|---|---|---|---|
| Your email newsletter | newsletter | email | spring_sale_us_2026q2 |
| Organic Facebook post | facebook | social | spring_sale_us_2026q2 |
| Paid LinkedIn ad | linkedin | paid_social | webinar_onboarding_2026-05 |
| Google Ads (if not auto-tagged) | google | cpc | brand_search_us |
| Partner or affiliate site | partnername | affiliate | spring_sale_us_2026q2 |
| Text message | sms | sms | order_ready |
| Printed flyer QR code | flyer | print | store_opening_chicago |
The flyer row is a deliberate exception. No default channel fits print, so print visits land in Unassigned. That's acceptable as long as everyone uses the same value: you can still filter by source and medium, or create a custom channel group in GA4 with a rule for print. Whatever you choose, write it down and use it consistently.
A tagged newsletter link following this sheet looks like:
https://example.com/spring?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale_us_2026q2&utm_content=hero_button
Enforce it with a builder
Conventions only work if nobody has to remember them. Our UTM Builder lowercases values, converts spaces to your chosen separator, keeps a page's existing query parameters, and shows which GA4 channel a link will most likely land in, with a warning when it would end up Unassigned. You can also tag a whole list of URLs at once and export your history as a CSV, which makes a simple shared log of every campaign link.
Two more habits help: keep the convention in one shared document, and click every tagged link once before you send it, so you know it opens the right page. To double-check a link someone else built, paste it into the URL Parser, which lists every query parameter and its decoded value.
FAQ
Are UTM parameters case-sensitive in GA4?
Yes, the values are. Google and google appear as separate sources. The default channel grouping ignores case, but your source, medium and campaign reports don't.
Why is my campaign traffic showing as Unassigned?
Usually because utm_medium doesn't match any default channel rule. Change it to a recognized value such as email, social, cpc or referral.
Do I need UTM tags on Google Ads links?
Not if auto-tagging is on and your Ads account is linked to Analytics. Auto-tagging adds a click ID that GA4 uses instead.
Should I tag links in my social media bio?
Yes. A tag like utm_source=instagram&utm_medium=social&utm_campaign=bio_link separates bio clicks from other social traffic.