UTM Parameters: How to Build a Tagged Link and Read the Reports
You send a campaign email to four thousand subscribers, the traffic lands on the site, and the analytics report files it all under direct or blends it with a dozen other sources. The campaign worked, but the report cannot prove it. UTM parameters fix exactly this: short labels added to a link that tell Google Analytics 4, Yandex Metrika or any other analytics tool where a visit came from. This guide covers what the five parameters mean, how to build a tagged link correctly, and how to read the reports without the usual mess.
What a UTM parameter actually is
A UTM parameter is an ordinary query parameter appended to a page URL, in the form ?utm_source=newsletter. The name goes back to Urchin Traffic Manager, the product of a small analytics company called Urchin. Google bought Urchin in 2005 and built Google Analytics on top of it, and the naming convention survived: GA4, Yandex Metrika and most web analytics platforms read the same five parameters. Structurally a tagged link is no different from any other URL; the anatomy of protocol, domain, path and query is covered in a separate piece on parsing URLs into components.
- utm_source: where the visit came from, the platform or service. Examples: facebook, linkedin, newsletter, google;
- utm_medium: the channel type, how the traffic was delivered. Examples: social, cpc, email, qr;
- utm_campaign: the campaign name, the promotion or project the link serves. Example: black_friday;
- utm_content: the creative variant, it distinguishes links inside one campaign. Example: banner_a;
- utm_term: the keyword, only relevant for paid search campaigns. Everywhere else it is simply left out.
The source-medium pair decides which row of the report a visit lands in. That is why these values cannot be improvised: linkedin and LinkedIn are two different sources for analytics, and one channel splits into two lines that each tell half the story.
Building a tagged link by hand
A tag attaches to the page address after a question mark, parameters separated by ampersands. The order does not matter: ?utm_source=facebook&utm_medium=social means the same as ?utm_medium=social&utm_source=facebook. A plain text editor is enough to build one:
https://shop.example.com/sale
?utm_source=newsletter
&utm_medium=email
&utm_campaign=november_sale
&utm_content=cta_button
utm_source=newsletter / came from the mailing list
utm_medium=email / channel: email
utm_campaign=november_sale / the November promotion
utm_content=cta_button / the call-to-action button, not the banner- Lowercase everywhere. Newsletter, newsletter and NEWSLETTER are three sources in the report. Pick one spelling and never deviate.
- Latin letters only, no spaces. A space inside a link turns into %20 and quietly splits the campaign in two; separate words with underscores: november_sale.
- Keep a shared dictionary. Decide once: email for mailings, cpc for paid clicks, social for social networks, and write the same value every time.
- Parameters go before the hash. Everything after # is a page anchor; standard UTM reports do not read tags placed after it.
- Open the final link in a browser before publishing. One dropped letter in the address turns a campaign into a 404 page.
What happens to non-ASCII characters
URLs are allowed a limited character set, so anything outside it gets percent-encoded. A tag like sale_кафедра, typed in Cyrillic, reaches the report as unreadable percent soup, and different tools can encode the same text differently, so identical campaigns end up as separate rows. If you want to see how a specific string gets encoded, the URL encoder shows the percent representation instantly. For tags themselves the fix is simple: stay in Latin.
Reading the reports: GA4 and Metrika
In Google Analytics 4 the tagged traffic lives in Reports, Traffic acquisition. Switch the primary dimension to session source / medium or session campaign, and every unique combination of values becomes its own row. Explorations can go deeper and slice conversions by the same dimensions without any extra setup.
Yandex Metrika keeps the same data under Reports, Sources, Summary: enable the UTM tags grouping and visits break down by utm_source, utm_medium and utm_campaign. The interfaces differ, the logic is identical.
Three defects show up in raw tagging data again and again. Mixed case splits one channel into several rows. Spaces and typos multiply the rows further. Double counting is subtler: a person clicks a tagged ad link, saves it to bookmarks or forwards it to a colleague, and every return visit is then credited to the paid campaign long after the budget stopped.
The classic version: three people ran the same campaign, one wrote Telegram, one telegram, one copied Tg from an old template. The report shows three thin lines where one solid row should be, and none of them holds the full picture.
Why internal links must stay clean
A tag overwrites the visit source. Someone finds your site through Google, that is an organic visit. Then they click a banner in your header that happens to carry utm_medium=cpc, and analytics credits the next visit to the banner. The search channel loses a visitor it actually delivered. Tag every internal link this way and the sources report fills with your own labels while organic and referral traffic disappear from view.
This failure pattern is common enough to be a rite of passage: a store tags every menu item and footer link, within a week the sources report consists of internal labels, and the organic search line collapses to zero while search visitors keep arriving. The fix is removal. Analytics distinguishes internal transitions on its own; internal links never need tags.
Five everyday situations
The values below are conventions rather than rules, but they are the conventions most teams converge on:
- A social media post. Source: the platform, facebook or telegram. Medium: social. Campaign: the topic or promotion. Content: the post number or date, content=post_1114. A month later the content value shows which post actually brought customers.
- A newsletter. Source: newsletter or the name of the email service. Medium: email. Campaign: the subject line topic. Content: the element inside the letter, button, banner or text link, so the report shows what subscribers actually click.
- Paid search. Source: google or yandex. Medium: cpc. Campaign: the campaign name from the ads account. Term: the keyword for search campaigns. Ad platforms can auto-tag, but check the output: auto-tagging happily mixes cases.
- A banner A/B test. Two links to the same page, identical except for content: banner_a and banner_b. The report then compares click-through without any dedicated testing tool.
- A QR code on print. Source: the placement, flyer or postercity. Medium: qr. Campaign: the promotion. Offline visits finally get counted. Draw the code from a short link that redirects to the tagged URL: four parameters make a QR dense, and a phone camera at a counter struggles with dense codes. The QR code generator handles the encoding side.
Do you need a UTM on every link?
No, and believing otherwise is a common beginner mistake. Organic search, direct visits and referrals from other sites are classified by analytics without any help. Tags belong on links you control and want to tell apart from the rest: your own posts, emails, ads and printed codes. A returning reader typing your domain, a visitor following a search result, a person clicking a link on someone else's blog: analytics sorts all of these on its own.
- tags on internal links rewrite the source and bury organic traffic in the report;
- one campaign in several spellings (Black_Friday, black_friday, BF) splits visits across rows that will never meet;
- tagged URLs submitted to search engines behave like different pages, and duplicates pile up; crawl rules for parameterized addresses are covered in the robots.txt guide;
- a tagged link saved to bookmarks keeps reporting into its original campaign a year after the campaign ended.
The working rule: a tag lives only on links you placed in outside channels; everything inside the site stays clean.
A checklist before the link goes out
- All values lowercase, Latin letters, no spaces, words joined with underscores.
- Source and medium match previous campaigns character for character.
- Parameters sit before the hash if the address contains an anchor.
- The link opens in a browser and the landing page loads.
- A ready link can be pulled apart in the URL parser to confirm which parameter carries which value.
- For print and QR, a short link sits on top of the tagged URL.
Common questions
Will the visitor see the tag?
Yes. The full address with parameters is visible in the browser bar and travels with every copy of the link. It changes nothing about how the page looks or works: the server ignores unknown parameters unless it was built to read them. Hiding tags is impossible; a short redirect link on top is the accepted workaround.
Do UTM parameters affect SEO?
Not directly: search engines do not penalize pages for carrying UTM parameters. Indirectly they can: links with different tags create multiple address variants of one page, and duplicates dilute signals unless a canonical points to the clean URL. Sitemaps should list untagged addresses.
utm_content or utm_term: which one when?
Content distinguishes creatives inside one campaign: banner A against banner B, button against text link. Term carries the keyword and only makes sense in paid search campaigns. Social posts and newsletters have no keywords, so term stays empty there.
Are all five parameters mandatory?
No. The minimum working set is source, medium and campaign; without them the visit cannot be attributed to your placement. Content joins when creative variants compete, term joins in campaigns built around keywords.
Why do visits keep falling into an old campaign?
Someone saved the tagged link or shared it, and the address keeps its label forever. Every visit through that copy credits the original campaign. This is normal last-click behavior, not a bug, and one more reason to keep campaign names meaningful: a row named promo_2026_11 will still be explaining itself next year.
Tagging is bookkeeping more than marketing: ten minutes of discipline per link buy you reports that answer what worked instead of something arrived. Build the tag, check it against the dictionary, and the analytics does the rest.