UTM parameters: use them without breaking your search data
You use UTM parameters to label visits from links you placed elsewhere. Do it right and your analytics tell a clear story. Do it wrong and you break attribution and pollute search data.
By Théophile Louvart, founder of Porteur · Updated 14 September 2026 · Markdown
The five UTM parameters and how tools read them
There are five standard UTM parameters: utm_source, utm_medium, utm_campaign, utm_term, utm_content.
- utm_source: who sent the traffic, for example newsletter, twitter, partner-x
- utm_medium: the channel type, for example email, social, referral
- utm_campaign: the label for the push, for example launch-2026-q3
- utm_term: the keyword label you choose, or a segment label, optional
- utm_content: the creative or link variant, optional
GA4 reads these as the session’s source, medium and campaign. Those visits fall into a default channel group based on source or medium values, for example Organic Search when the medium is organic from a search engine referrer. The Landing page report shows sessions and key events by the first page of the session.
PostHog classifies sessions into channel types from the referrer and UTM values. A $pageview carries $current_url, $pathname and $referring_domain. A person record carries initial referrer and initial UTM properties from their first visit. Funnels run from a landing page path to a product event and can be broken down by the initial referring domain.
Example URL you share in a newsletter:
https://yourproduct.com/guides/getting-started?utm_source=newsletter&utm_medium=email&utm_campaign=launch-2026-q3&utm_content=cta-topWhen to use UTM parameters, and when never to
Use UTMs on links you place outside your site: newsletters, social posts, partner sites, QR codes, a founder’s profile link. You are labelling that session’s origin.
Never use UTMs on internal links. An internal UTM starts a new session and steals credit from the actual source. It also makes paths and funnels noisy.
Do not add UTMs to links you want counted as referrals. For example, a partner’s blog links to your /pricing page. Leave their link clean so analytics treat it as referral from that domain. If you add UTMs, you overwrite the true referrer and lose the partner view in reports.
Bad: internal UTM on your own nav
<a href="/pricing?utm_source=navbar&utm_medium=internal&utm_campaign=summer">Pricing</a>
Good: clean internal link
<a href="/pricing">Pricing</a>Build UTM links without mistakes
Use Google’s Campaign URL Builder. It is the standard form. Fill in your clean URL and the five fields. Copy the generated link and paste it where you control the placement, not on your own site’s internal links.
Pick the landing page
Choose the clean URL people should land on, for example https://yourproduct.com/guides/getting-started.
Set source, medium, campaign
Use lowercase and hyphens. For a newsletter, source=newsletter, medium=email, campaign=launch-2026-q3.
Add content or term if useful
Use content for link variants, for example cta-top or body-text. Use term for a keyword label you choose, for example onboarding-guide. Both are optional.
Generate and test
Build the URL, click it, and check the page loads. Check your analytics receive a session with the exact source and medium.
Keep values consistent across the team. Lowercase only. No spaces. Hyphens over underscores. Decide a short list of mediums you will use and stick to them. This keeps channel grouping stable in GA4 and neat in PostHog breakdowns.
Keep your search data clean
A UTM URL can be indexed if others share it. You do not want /guides/getting-started?utm_source=newsletter in Google’s index. A canonical tag on that page pointing to the clean URL prevents duplicate indexing.
Set a canonical to the clean URL
On /guides/getting-started, add <link rel="canonical" href="https://yourproduct.com/guides/getting-started"> in the head. This covers any UTM version that lands there.
Avoid UTMs on links you want as referrals
If you want to see referring domains in analytics, let their clean links speak. Do not overwrite them with UTMs you provide.
Watch Search Console for duplicates
If you see parametered URLs in Indexing, ensure your canonical is present on the landing template and returns 200.
What a fixed page looks like: /pricing renders a single canonical to https://yourproduct.com/pricing. Whether the visitor arrives with or without UTMs, the canonical is the same clean URL, and internal links are clean.
Check your work in GA4
You care about two things. First, Organic Search stays clean. Second, your UTM-tagged pushes show as the right source or medium and campaign. Use standard GA4 reports for both checks as of 2026.
Open Engagement, Landing page
Add a secondary dimension for Session source / medium. Your search traffic will show sources like google / organic and bing / organic. Your pushes show as newsletter / email or twitter / social.
Check key events by landing page
Confirm that sessions with utm_source=newsletter land where you expect. Key events replaced conversions in 2024. Mark signups as key events to see them here.
Spot internal UTM mistakes
If you see a spike of sessions with source=navbar or medium=internal, someone added UTMs to internal links. Fix the links and annotate the date.
Use comparisons for attribution views
Switch the attribution model to first click or last click in comparisons to see how key event credit shifts. Data-driven is the default setting.
Sessions and Search Console clicks never match row by row. A click can start no session, a session can trail several clicks, and consent tools drop sessions. Look for trends, not perfect totals across products.
Join Search Console and analytics by landing page
Search Console shows queries, pages, impressions and clicks. Analytics shows what visitors did after the click. Joined by landing page, they show the pages that win clicks and the pages that convert. You fix the gap where either side is weak.
Link Search Console to GA4
In GA4 Admin, Product links, Search Console. This adds two reports in the Library: Google organic search queries and Google organic search traffic.
Read clicks with sessions
Use the Google organic search traffic report. It joins clicks and impressions to landing pages with Search Console’s lag and anonymisation rules.
Find weak pages
Sort by clicks then scan key events. A page like /guides/getting-started might get clicks but no signups. Improve the call to action or the next step.
UTMs do not touch Organic Search classification. They label your pushes. This split lets you see which landing pages work for search, and which pushes send qualified traffic that later signs up.
Use product analytics to answer the revenue question
First touch credits the visit that brought the person. Last touch credits the visit before the conversion. For a product site the useful question is which landing pages bring people who later sign up. You need the first landing page joined to a later event to answer it.
Capture landing and signup
Send pageview events with paths. Send product events like signup and activation. Mark signup as a key event in GA4. In PostHog, you will see $pageview and your product events.
Break down by first touch
In PostHog, build a funnel from a landing page path, for example /pricing, to signup. Break it down by initial referring domain. Add initial UTM properties if you want to compare pushes.
Join payments to people
To attribute revenue to search, join the payment event to the person and their first landing page. Build a report from that. It answers what a search click earns.
Rates from consented sessions undercount in the EU when cookies need consent. Treat them as directional. Cookieless and server-side options exist, but compare like with like when you judge a change to a page or a push.
Common mistakes and quick fixes
- Internal links with UTMs. Fix by removing the parameters and letting the original session continue.
- Uppercase or spaces in values. Fix by standardising to lowercase and hyphens. Update your builder template.
- Inconsistent mediums. Fix by picking a short list and rejecting new ones in review.
- UTM links indexed. Fix by adding a canonical to the clean URL on the landing template.
- Overwriting referrals. Fix by not forcing UTMs onto partners whose referral you want to see.
- Unclear campaigns. Fix by using a readable campaign label with a date or sprint tag, for example launch-2026-q3.
Quick checklist before you ship a link:
[ ] Clean landing page URL chosen
[ ] utm_source set to the channel or site name
[ ] utm_medium set from your short list
[ ] utm_campaign readable and dated
[ ] utm_content or utm_term only if useful
[ ] Values are lowercase, hyphenated, no spaces
[ ] Link tested and page loads fast
[ ] No internal UTMs added on your siteQuestions
They are utm_source, utm_medium, utm_campaign, utm_term and utm_content. Source, medium and campaign label the session’s origin. Term and content are optional labels for keyword or creative variants.
UTM is the common name for these tracking parameters. In practice, you only need to know the five names and how your analytics read them into source, medium and campaign.
Pick the landing page. Use Google’s Campaign URL Builder to set source, medium and campaign. Keep values lowercase with hyphens. Add content or term only if they will answer a real question later. Share the generated URL in the channel you control.
Use three as your default: source, medium and campaign. Add content when you truly compare link variants. Add term if you have a clear label that will be analysed. More fields without a plan slow you down and clutter reports.
They should not, if your landing page has a canonical to the clean URL. A UTM link can be shared and crawled, so the canonical prevents duplicate URLs from sitting in the index. Never add UTMs to internal links, which also keeps crawl paths clean.
It is fine. Your analytics still read the UTM values. Add a canonical on the landing page to the clean URL so search treats all variants as the same page. If you want that site to count as a referral, give them a clean link instead of a UTM one.
Sources
Check my site, free
Want to see if your landing pages and pushes play nicely with search, and where rivals win clicks, from your URL in about thirty seconds, free, with three findings shown whole? Try Porteur’s check.
- Free check, no card
- Read-only, your own accounts
- Readable by your agent
Read next
- GuideCanonical tags: what they do and the mistakes that cost rankings
- GuideThe GA4 landing page report: the pages that bring people, and what they do
- GuideOrganic search traffic in GA4: where it is and how to read it
- GuideLinking Search Console to GA4: what you get and what you do not
- GuidePostHog for search traffic: from a landing page to the signup
- GlossaryURL parameters
- GuideWhat AI SEO means, and the three things it can refer to
- GuideSEO for sites built with AI app builders: Lovable, Bolt, v0 and Replit