Tag every campaign link the same way, every time
Inconsistent tags split one campaign into many rows in Google Analytics, and an unknown medium sends visits to Unassigned. Presets, lowercasing and warnings keep every link clean.
How marketing teams use UTM Builder
- Agree source and medium names once and use the presets (Google Ads, Meta Ads, Newsletter, QR/print and more).
- Paste a CSV with url, source, medium and campaign columns into Bulk and download the tagged list.
- Generate a QR code for flyers and posters from the same tagged link.
- Paste any live link into the decoder to audit its tags.
Bulk mode fills empty cells from your defaults, so one campaign name covers the whole sheet.

Real builder output (lowercase, spaces as hyphens)
| Input | Tagged link | Warnings |
|---|---|---|
| https://example.com/page · Google / cpc / Spring Sale 2026 | https://example.com/page?utm_source=google&utm_medium=cpc&utm_campaign=spring-sale-2026 | none |
| example.com/a?ref=x&utm_source=old#top · newsletter / email / oct | https://example.com/a?ref=x&utm_source=newsletter&utm_medium=email&utm_campaign=oct#top | Added https:// to the URL. Replaced existing utm_source in the URL. |
| https://x.io · news / newsletter / a | https://x.io/?utm_source=news&utm_medium=newsletter&utm_campaign=a | utm_medium "newsletter" isn't one GA4's default channel groups recognise, so these visits may show as "Unassigned". Try cpc, email, social, paid_social, display, affiliate or referral. |
Source: Output of the app's own engine (products/utm-builder/web/utm.js, build) run with node on 10 Oct 2026; the same cases are in tests/utm.test.js.
FAQ
Can a team share naming rules?
Not yet: history and presets live in each browser. Export the history as CSV (Pro) to share a record.
Does it shorten links?
No. Use your own shortener after tagging if you need short links.
UTM Builder: full guide with prices and alternatives · All use cases · Store