How I build UTM links that I can still understand later
· 3 min read
UTM links are normal URLs with tracking parameters added to the end.
A plain URL:
https://example.com/pricing
A UTM URL:
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=launch
The UTM Builder helps build and parse these links without forgetting a parameter or mixing naming styles.
The simple idea
UTM parameters answer this question:
Where did this visitor come from?
Analytics tools can read the parameters and group traffic by campaign.
The common UTM fields are:
utm_source;utm_medium;utm_campaign;utm_term;utm_content;utm_id.
You do not always need all of them.
Step 1: choose the final destination URL
Start with the real page people should visit:
https://example.com/pricing
Make sure this URL works before adding tracking parameters. UTM tags do not fix a broken destination.
Step 2: set utm_source
utm_source says where the traffic comes from.
Examples:
newsletter
google
linkedin
whatsapp
github
If I send a link in an email newsletter, I might use:
utm_source=newsletter
Keep source names consistent. Do not use Newsletter, newsletter, and
email_newsletter for the same thing unless you want messy reports.
Step 3: set utm_medium
utm_medium says the type of channel.
Examples:
email
social
cpc
referral
qr
For a newsletter:
utm_medium=email
For a paid search ad:
utm_medium=cpc
Think of source as “where” and medium as “what kind of channel”.
Step 4: set utm_campaign
utm_campaign names the campaign.
Examples:
product_launch
black_friday_2026
september_newsletter
Pick a name that will still make sense later. A campaign name like test is not
helpful in reports.
I prefer lowercase names with hyphens or underscores, then use the same style everywhere.
Step 5: use utm_content for variants
utm_content is useful when two links point to the same page inside the same
campaign.
Example:
utm_content=top_button
utm_content=footer_link
utm_content=image_banner
This helps answer:
Which link placement got the click?
Do not put everything into campaign names. Use utm_content for variants.
Step 6: use utm_term when it actually means something
utm_term is often used for paid search keywords. If you are not tracking keywords,
you may not need it.
Leaving unused fields empty is better than filling them with random values.
Step 7: build the URL
Open UTM Builder and fill the fields.
Example:
URL: https://example.com/pricing
source: newsletter
medium: email
campaign: september_launch
content: top_button
Result:
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=september_launch&utm_content=top_button
The tool handles URL encoding so spaces and special characters do not break the URL.
Step 8: click-test the final URL
Before sending a UTM link to many people, open it in a browser.
Check:
- does the page load?
- do the parameters stay in the URL?
- does the website redirect and remove them?
- does the page show the correct content?
- is the link too long for the place you are sharing it?
If a redirect strips query parameters, analytics may lose the campaign data.
Step 9: parse links you receive
The UTM Builder can also parse an existing UTM URL. This is useful when someone sends a long link and you want to see what campaign values are inside.
Paste the URL and check whether the naming is consistent with your conventions.
My UTM naming rules
I try to keep UTM values:
- lowercase;
- short but readable;
- consistent;
- free of private information;
- stable across campaigns.
Bad:
utm_campaign=My Big Test Campaign Final FINAL 2
Better:
utm_campaign=pricing_launch_2026
My UTM checklist
Before sharing a tracked link, I check:
- Is the destination URL correct?
- Is
utm_sourceconsistent? - Is
utm_mediumconsistent? - Is
utm_campaignmeaningful? - Do I need
utm_contentfor variants? - Am I leaving unused fields empty?
- Did I test the final URL in a browser?
- Will this still make sense in analytics later?
UTM links are easy to create. The real discipline is naming them clearly enough that future-you can read the report.
Comments
Comments are welcome — please read the comment policy first. Powered by giscus and GitHub Discussions.