
London, UK · Serving UK/EU · GBP pricing
UTM Parameters: The Complete GA4 Tracking Guide.
The Complete Guide to using UTM Parameters for Campaign Tracking in GA4.
If your GA4 attribution data is a mess; campaigns showing up as Direct, source and medium values that contradict each other, three different spellings of the same channel across six months of data, UTM parameters are almost certainly part of the problem.
UTMs are the tags you add to the end of URLs to tell GA4 where traffic came from. Done consistently, they give you accurate attribution, reliable channel comparisons, and the confidence to make budget decisions based on what the data actually says.
Done inconsistently, they produce noise that looks like signal and noise that looks like signal is more dangerous than no data at all.
This guide covers everything: what each UTM parameter does, how to name them correctly, channel-by-channel examples, the most common mistakes, and how they appear in GA4 reports.
What UTM parameters actually are.
UTM stands for Urchin Tracking Module, a legacy name from the analytics platform Google acquired in 2005 that has stuck around long after anyone needed to know what it stood for.
In practice, UTM parameters are query string tags appended to a URL. When a user clicks a link containing UTM parameters, GA4 reads those tags and stores the values against that session. They are then available as dimensions across GA4 reports:Traffic Acquisition, User Acquisition, Conversions, and any custom Explorations you build.
A UTM-tagged URL looks like this:
https://www.example.com/sale?utm_source=google&utm_medium=cpc&utm_campaign=brand_search_2026
Everything after the ? is the query string. GA4 reads the UTM parameters from the URL on the first page the user lands on, stores them in the session, and uses them to attribute any conversions that happen during that session.
The key thing to understand is that GA4 does not know where traffic came from unless you tell it. For paid campaigns, social posts, email sends, and any other link you control, UTM parameters are how you tell it.
The five UTM parameters.
There are five UTM parameters. Three are required for useful attribution; two are optional but valuable for granular analysis.
utm_source
What it does: Identifies the specific platform or origin of the traffic. Answers the question: where did this visitor come from?
utm_source is the most granular level of traffic attribution. It should identify the specific platform or publisher, not the category.
Use linkedin not social. Use customer_newsletter not email.
The more specific the source, the more useful the data.
Naming rules: Always lowercase. Use hyphens for multi-word sources. Be consistent: facebook in one campaign and Facebook in another creates two separate source values in GA4 and splits your data.
Approved values by channel type:
Paid media: google, bing, facebook, instagram, linkedin, twitter, tiktok, pinterest, reddit, youtube
Email: customer_newsletter, prospect_newsletter, promotional_email, transactional_email
Referral and partner: partner_[partnername], affiliate_[affiliatename]
Other: sms, push_notification, qr_code, direct_mail
utm_medium
What it does: Identifies the marketing channel type. Answers the question: what kind of marketing activity is this?
Where utm_source tells you the specific platform, utm_medium groups similar sources into channel categories.
This is what powers GA4's Default Channel Grouping: GA4 uses the medium value to decide whether to categorise traffic as Paid Search, Paid Social, Email, Organic Social, and so on.
This is also where the most damage tends to happen. If someone invents a custom medium value like newsletter instead of email, paid instead of cpc, social-paid instead of paid_social, GA4's channel grouping breaks and the traffic lands in Unassigned.
This is one of the most common causes of inflated Unassigned or Direct traffic in GA4 reports.
The rule: Never create custom medium values.
Use the approved list only. Approved values:
Paid channels: cpc (paid search), cpm (display/impressions), display (banner advertising), paid_social (paid social media), paid_video (paid video)
Organic and other: organic (organic search, this is set automatically by GA4 and should not be added manually), social (organic social posts), email (all email campaigns), referral (partner or referral traffic), affiliate, sms, push, qr
utm_campaign
What it does: Names the specific campaign or initiative. Answers the question: which campaign drove this traffic?
utm_campaign is where naming conventions matter most, because this is the value teams will filter by in GA4 when trying to understand which campaigns drove results.
A campaign name of campaign1 or test or march tells you nothing when you look back at the data in six months.
Recommended format:
[initiative]_[audience]_[date]_[geo]_[product]
This gives you four dimensions of context baked into a single value. You can filter by any part of it in GA4 Explorations using contains or regex conditions.
Examples:
-
spring_sale_2026_q2_uk_shoes = seasonal sale, UK market, specific product category
-
brand_awareness_prospects_jan2026_global = awareness campaign, prospecting audience, January 2026
-
webinar_customers_2026-03-15_emea = event-specific campaign with an exact date
Naming rules: Always lowercase. Use underscores to separate elements, not spaces or hyphens. Include a date reference in every campaign name — without it, the data becomes impossible to filter historically. Keep it descriptive but concise.
Match the name to whatever you use in your project management or campaign tracking tools so you can join the data later.
utm_term (optional)
What it does: Originally designed to capture the paid search keyword that triggered an ad. Now used more broadly for audience segments, product identifiers, or A/B test variations.
For paid search, use dynamic keyword insertion, utm_term={keyword} so Google Ads automatically populates the actual search term that triggered each ad.
This gives you keyword-level performance data in GA4 without manually maintaining a separate tag for every keyword.
For non-search channels, utm_term can usefully capture audience segment names, product SKUs, or other test variables that do not fit neatly into utm_content.
utm_content (optional)
What it does: Differentiates between multiple links or creative variants within the same campaign. Essential for A/B testing.
Use utm_content to distinguish between creative variants (variant_a, variant_b, carousel_v2), link placements within an email (header_cta, footer_link, body_link), or ad formats within the same campaign and ad set.
Without utm_content, if you run two creative variants in the same campaign, GA4 will group all the traffic under the campaign name with no way to separate which creative drove which result.
Channel-by-channel examples.
Email campaigns
Email is where UTM parameters matter most and are most commonly botched. Every link in every email should be tagged — including transactional emails, which often get overlooked.
?utm_source=customer_newsletter
&utm_medium=email
&utm_campaign=spring_sale_2026_mar
&utm_content=header_cta
-
utm_source identifies which list or send the traffic came from.
-
utm_medium is always email.
-
utm_campaign names the send with a date reference.
-
utm_content tells you which specific link within the email the user clicked, which is useful for understanding whether people click your header CTA or wait until the footer.
If you send to multiple lists in the same campaign, use separate utm_source values for each: customer_newsletter and prospect_newsletter rather than email_list for both.
This preserves the distinction in GA4 without needing a custom medium.
Organic social
Organic social posts are often untagged because they feel informal, but every link in a social post that drives traffic to your site should have UTM parameters.
Without them, GA4 will attribute the traffic to Referral from the social platform or, on mobile apps where the referrer is stripped, to Direct.
?utm_source=linkedin
&utm_medium=social
&utm_campaign=thought_leadership_2026q1
Use the platform name as the source. Use social (not social_media, not organic_social, not linkedin_organic) as the medium.
GA4's Default Channel Grouping maps the combination of social medium with a recognised social platform source to the Organic Social channel. Deviating from social breaks that mapping.
Paid social
?utm_source=facebook
&utm_medium=paid_social
&utm_campaign=lead_gen_2026_q2
&utm_content=carousel_v2
&utm_term=warm_audience
paid_social as the medium maps correctly to GA4's Paid Social channel grouping. Include utm_content to track creative variants. utm_term can usefully capture audience segment names — warm_audience, lookalike_30d, retargeting — giving you audience-level performance data in GA4 that the platform's own reporting may not surface clearly.
Paid search
Paid search has a specific complication: Google Ads has its own auto-tagging system using the gclid parameter, which sends data directly to GA4 via the Google Ads integration. If you have both auto-tagging and UTM parameters on the same URL, auto-tagging takes precedence for most dimensions but UTM parameters still populate the utm_campaign, utm_source, and utm_medium dimensions, which can cause discrepancies.
The recommended approach: enable auto-tagging in Google Ads for the core integration, but also add UTM parameters for dimensions that auto-tagging does not pass, particularly utm_content for ad variant tracking.
?utm_source=google
&utm_medium=cpc
&utm_campaign=brand_search_2026
&utm_term={keyword}
&utm_content=ad_v1
Use {keyword} for dynamic keyword insertion, Google Ads replaces this with the actual search term at the time of the click. cpc as the medium maps to GA4's Paid Search channel grouping.
QR codes and offline
QR codes in print, at events, or on physical materials are a common source of unexplained Direct traffic in GA4. The user scans the code, lands on the site, and GA4 has no referrer so it records the session as Direct.
Adding UTM parameters to the URL behind every QR code turns that Direct traffic into properly attributed campaign data.
?utm_source=qr_code
&utm_medium=qr
&utm_campaign=event_london_2026_q1
&utm_content=conference_badge
This gives you visibility into which physical touchpoints: events, flyers, print ads, packaging are actually driving website traffic.
How UTM parameters appear in GA4.
UTM parameters populate four main areas in GA4:
Traffic Acquisition uses session-scoped UTM data — the source, medium, and campaign of the session in which each visit occurred. Use this to understand which channels are driving traffic volume.
User Acquisition uses user-scoped UTM data — the source, medium, and campaign that first brought each user to the site.
This persists across sessions and tells you which channels are acquiring new users, regardless of what they do on subsequent visits.
Conversions can be broken down by both session and user acquisition dimensions, giving you a multi-touch view of the path from first visit to conversion.
Custom Explorations let you combine any UTM dimension with any other metric — campaign alongside revenue, source/medium alongside conversion rate, utm_content alongside engagement rate to compare creative variants directly.
The key dimensions to know: Session source / medium / campaign for session-level analysis and First user source / medium / campaign for acquisition-level analysis.
GA4 keeps both, which is what makes multi-touch journey analysis possible.
Pre-launch QA checklist.
Before publishing any campaign URL, run through these checks.
All three required parameters are present (source, medium, and campaign) — missing any one of them breaks attribution entirely.
All values are lowercase: GA4 treats Google and google as two completely separate sources, so mixed case silently splits your data.
No spaces in any value: spaces break the URL structure; use underscores instead.
No special characters: characters like &, #, and % will corrupt the URL string if they appear unencoded inside a parameter value.
Campaign name matches your naming convention: inconsistent names make filtering and historical comparison impossible.
Medium value is from the approved list: custom or invented medium values break GA4's Default Channel Grouping and send traffic to Unassigned.
URL loads correctly after parameters are added: UTMs appended to redirect URLs can sometimes break the destination, so always click through and confirm.
Parameters are correctly URL-encoded: any character outside standard alphanumerics should be encoded before the URL goes live.
Campaign name is documented in your tracking sheet: without a record of what each campaign name refers to, historical data becomes uninterpretable within months.
Common mistakes and what they cost you in GA4.
Using capitals or mixed case. GA4 treats Google and google as two separate sources. Email and email are two separate mediums. If your team does not enforce lowercase consistently, your channel data will be split across multiple rows in every report.
Spaces in parameter values. A space in a UTM value gets encoded as %20 or + in the URL, which may or may not be read correctly by GA4 depending on the browser and platform. In GA4 reports, you will see the raw encoded character rather than a clean value. Use underscores instead.
Inventing custom medium values. This is the most damaging mistake. GA4's Default Channel Grouping relies on specific medium values to categorise traffic correctly. paid-social, paidsocial, social_paid, ppc, none of these map to GA4's Paid Social or Paid Search channels. The traffic lands in Unassigned, and your channel comparison data becomes meaningless.
Generic campaign names. Naming a campaign test, email_march, or campaign1 makes the data uninterpretable within weeks. When you are looking at conversion data in Q3 and trying to understand what drove results in Q1, a campaign called email_march tells you almost nothing.
A campaign called reengagement_lapsed_mar2026_uk tells you exactly what it was.
Missing utm_content on creative tests. If you run two ad variants in the same campaign and do not use utm_content to distinguish them, GA4 groups their traffic together under the campaign name. You lose all creative performance data and cannot tell which variant drove results.
Not tagging every link in an email. If an email has five links and only the main CTA is tagged, all traffic from the untagged links arrives in GA4 as Direct. Tag every link, with utm_content to differentiate placement.
Applying UTMs to internal links. UTM parameters should only ever appear on links pointing to your site from external sources. Adding UTMs to internal navigation links, links from one page on your site to another, will override the original session source and attribution data for any session that passes through those links.
This is one of the most damaging things you can do to attribution data and is surprisingly common.
Forgetting to document. UTM parameters only have long-term value if you can look back at a campaign name and know what it was. Maintain a central tracking document, a simple spreadsheet is fine, that records every campaign name, its launch date, the channel, and the associated parameters. Without documentation, your historical data becomes archaeology.
Governance: keeping it consistent across a team.
UTM parameters are only useful if every person building campaign URLs follows the same conventions. One person using paid_social and another using paidsocial on the same campaign produces fragmented data that cannot be reliably reported on.
A minimal governance setup requires three things.
First, a single approved values list for source and medium — this document, or something like it, shared with everyone who builds campaign URLs.
Second, a URL builder tool that enforces naming conventions, either Google's Campaign URL Builder with a saved set of approved values, or a custom spreadsheet that constructs the URL from dropdown-selected inputs.
You can use Marc's UTM Builder Tool by clicking here.
Third, a pre-launch review step where campaign URLs are checked against the approved list before going live.
For larger teams, a formal approval workflow helps: the marketing team submits URLs via a brief, a marketing operations function validates them against the naming convention, and they are approved before launch.
This sounds bureaucratic for small campaigns but quickly becomes essential once more than two or three people are building URLs independently.
Summary.
UTM parameters are the foundation of marketing attribution in GA4. Without them, paid campaigns blend into Direct traffic, email sends are invisible, and social activity disappears.
With them, used consistently, following a clear naming convention — GA4 gives you accurate source and medium data, campaign-level performance analysis, multi-touch journey visibility, and the ability to compare channels against each other on a level playing field.
The rules are not complicated. Lowercase everything. Use only approved medium values. Name campaigns descriptively with a date reference. Tag every external link. Never tag internal links. Document everything.
The hard part is not knowing the rules — it is enforcing them consistently across everyone who ever builds a campaign URL. That is a governance problem, not a technical one.
Related services
-
38-Point GA4 Audit — Comprehensive review of your current setup
-
Expert GA4 Setup — Clean implementation from scratch
-
GA4 Training — Empower your team to use GA4 confidently
-
Connect GA4 to BigQuery — Unlock advanced analysis and data warehousing