What UTM parameters do
UTM parameters are query-string tags you add to a link so your analytics tool knows where a visit came from. When someone clicks example.com/?utm_source=newsletter&utm_medium=email, GA4 and most other analytics tools record the source and medium from the URL instead of guessing from the referrer. Without them, clicks from email apps, some social apps and messaging often show up as direct traffic.
The five parameters, in plain words
- utm_source: who sent the click. The site, app or list:
newsletter,linkedin,producthunt. - utm_medium: the kind of channel:
email,social,referral,cpc. - utm_campaign: why you sent it:
launch-week,2026-pricing-update. - utm_content: which link, when one message has several:
header-button,ps-link. - utm_term: the keyword, mostly for paid search. utm_id is a campaign ID if you import cost data.
A naming convention that survives six months
Messy UTMs are worse than none, because they split one channel into many rows. Three rules cover most of it:
- Lowercase everything. Values are case-sensitive, so “Email” and “email” are two mediums.
- Use hyphens instead of spaces. Spaces get encoded as
%20and are easy to mistype when you reuse a link. - Reuse the mediums GA4 already understands.
emaillands in the Email channel,socialin Organic Social,referralin Referral. Invented mediums can end up as Unassigned.
This builder flags uppercase letters and spaces, and the Clean button fixes them in one click. Presets fill in the source and medium for the channels founders use most around a launch.
Where to use them, and where not to
Tag links you place outside your site: newsletters, social posts, your Product Hunt and LaunchRanked launch pages, directory listings, partner posts. Don’t tag links between your own pages. An internal UTM overwrites the campaign data of the visit and hides where the visitor really came from.
Bulk mode tags a whole list at once, handy when the same campaign links to your homepage, pricing page and a blog post. Existing query parameters are kept as they are, and a #fragment stays at the end, where browsers expect it.