The UTM builder that shows you how your URLs will be tracked
Every other UTM builder just generates a URL. This one grades it, classifies it into a channel, and reverse-parses existing tagged links. Because a URL you can't read is a URL that breaks your analytics.
Click "Generate QR" to create a scannable code for offline campaigns.
0 URLs
URL
Channel
Grade
Enter values with commas to generate permutations. Example: facebook,linkedin in Source.
Paste a tagged URL
We'll break it down into plain English, grade its hygiene, and show how Clickport would classify it.
Recent builds
Your last 10 tagged URLs will appear here.
Your saved presets
Save your team's source/medium combos for reuse. Stored in your browser, never uploaded.
Why this is not just another UTM builder
Three features no other builder has, because none of them are an analytics tool. Channel classification preview, A to F hygiene score, reverse URL parser. Everything below is depth you can tap into when you need it.
The five UTM parameters
Tap any parameter to see what it does, when to use it, and the mistakes to avoid.
utm_sourcerequired
The platform, site, or newsletter name where the click came from. The most specific identifier of where traffic originates.
Good values: facebook, newsletter, google, partner-site.com. Keep it lowercase, one concept per source.
Common mistake: putting a campaign name here. utm_source=spring-sale is wrong. The source is where the link was clicked (e.g. facebook), not what the click was about.
utm_mediumrequired
The channel or vehicle. This is the single strongest signal analytics tools use to classify traffic.
Standard values: cpc or ppc (paid search/social), social (organic social), email, newsletter, referral, affiliate, display, video, organic, podcast, sms.
Anything outside these values lands in Referral or a generic bucket. If your team invents utm_medium=blog-share, analytics treats it as Referral, not Social. Pick from the standard list.
utm_campaign
The named marketing initiative. spring-2026-launch, black-friday, webinar-product-demo.
Lowercase, hyphens not spaces. Prefix with year or quarter if you re-run annually: 2026q2-launch. Otherwise last year's launch merges with this year's launch in reports.
Do not cram creative variants or source info here. Same campaign with three creatives: same utm_campaign, different utm_content.
utm_content
Which creative or variant was clicked. This is your A/B testing field.
Examples: banner-a vs banner-b, footer-cta vs hero-cta, v1 vs v2.
If you're running one campaign with three ads, the three links share utm_campaign and differ only in utm_content. That way your analytics can roll the campaign up or break it down by creative on demand.
utm_termpaid only
Historically for paid search keywords. Google Ads auto-populates this with {keyword} in your ad URLs, so the exact keyword the searcher used shows up in analytics.
Leave this blank for anything other than paid search. Some teams use it for retargeting audience IDs, which is valid, but do not invent a use for it on every campaign. An email campaign with utm_term is usually a tagging mistake someone will spend two hours untangling later.
How UTMs become channels
16 channels, evaluated in priority order. Tap any channel to see the exact rules and a sample tagged URL.
Paid channels
Display
Triggered by dclid in the URL, or by utm_medium=display, banner, or cpm.
Source matches an organic shopping site (amazon, etsy, ebay, walmart, etc.) with no paid medium. Evaluated before Organic Search so shopping.google.com does not miscategorize.
Typical: referrer from amazon.com with no UTMs. No sample URL needed.
AI Search
Source matches an AI answer engine: ChatGPT, Perplexity, Claude, Gemini, Copilot, Phind, Kagi, DeepSeek, Grok, Meta AI, You.com.
For tagged campaigns: utm_source=chatgpt works. For untagged, the referrer URL usually carries the platform name.
Organic Search
Source matches a traditional search engine (google, bing, duckduckgo, yandex, baidu, etc.) with no paid medium. Or utm_medium=organic.
Typical: referrer from google.com with no UTMs. Or ?utm_source=google&utm_medium=organic.
Organic Video
Source matches a video platform (youtube, vimeo, twitch, rumble, etc.) with no paid medium.
No referrer, no UTM parameters, no click IDs. Someone typed your URL, clicked a bookmark, or came from an app that stripped referrers (Slack, iOS Mail, some newsletter clients).
Inflated Direct traffic is often untagged campaign clicks. Tag your links.
Referral
The catch-all. Everything that has a referrer or tags but does not match any of the channels above lands here.
A Referral-heavy report usually means inconsistent utm_medium values. Audit and standardize.
Six mistakes our hygiene score flags, with the exact reason each one breaks your analytics.
Uppercase letters in values
Facebook and facebook are two different sources to analytics. Tools do not normalize case for you.
Result: the same campaign appears as two separate rows. Totals are wrong. Reports split.
Fix: lowercase everything. Always. Enable the auto-lowercase toggle in the builder.
Spaces in values
utm_campaign=spring sale gets URL-encoded to spring%20sale in the URL. Browsers handle it, but your dashboard shows it literally with the %20. Ugly in reports, and any tool that re-encodes the URL (email clients, ad platforms) may produce spring%2520sale (double-encoded).
Fix: hyphens. spring-sale.
URL syntax characters in values
Characters &, =, ?, #, +, % are reserved URL syntax. Using them inside a parameter value breaks parsing.
utm_campaign=Q3&Q4 becomes two parameters: one called utm_campaign with value Q3, and a separate one called Q4. Half your data vanishes.
Fix:q3-q4, or percent-encode deliberately (rare in practice).
Duplicate parameters
Destination URL already has ?utm_source=google, and you add &utm_source=facebook. Most analytics tools keep one at random; some concatenate; some drop both.
You will not know which one was used until the numbers look off. The hygiene score flags this automatically.
Fix: strip existing UTMs from your destination URL before building.
utm_term on non-paid campaigns
utm_term was designed for paid search keywords. Adding it on an email blast or social post does not break anything technically, but it misleads whoever reviews the report.
A teammate opens the Campaigns panel, sees utm_term=early-access on an email, and spends an hour figuring out why an email is categorized as paid search.
Fix: leave utm_term blank unless the medium is cpc, ppc, or similar.
Campaign names that collide over time
utm_campaign=launch three years in a row gives you three rows called launch that merge in any report without a date filter. Year-over-year comparisons become impossible.
Fix: prefix with year or quarter. 2024-launch, 2025-launch, 2026q2-launch. Year-over-year analysis becomes a one-click filter.
Platform cookbook
Ready-to-copy tagged URL templates for every major platform. Tap a platform for the sample.
Facebook ads
Classifies as Paid Social. Facebook appends fbclid automatically.
They carry information UTMs do not (specific ad, ad group, keyword) and they influence classification. A gclid on a Facebook-tagged URL still classifies as Paid Search, because the click came through Google Ads.
Do not strip click IDs from URLs. Let them ride alongside your UTMs. Clickport uses both.
UTMs in redirect chains
If your destination is a redirect (site.com/r/abc123 → site.com/landing), make sure UTMs land on the final URL, not just the redirect entry point. Most ad platforms strip custom query params across redirects unless you explicitly append them.
Build the tagged URL against the final destination. Let the redirect preserve the query string via server config (most do) or append them in the redirect logic.
UTMs in single-page apps
SPAs use client-side routing (pushState). UTMs in the initial URL load fine. If the visitor navigates to /page-b via internal links, the URL changes and the UTMs are stripped.
Clickport captures UTMs on the first page-load event per session and pins them to the session. Internal SPA navigation does not lose attribution.
UTMs and URL shorteners
Shorteners like bit.ly and TinyURL preserve query parameters across the redirect if the long URL has them. Build the shortened link from the tagged URL, not the clean one. Otherwise you lose attribution at the redirect.
QR codes work differently. They encode the full URL directly (no redirect). Tagged URL in, tagged URL scanned.
UTMs and Consent Mode v2
Consent Mode v2 (Google) affects cookie-based tracking. UTMs are URL-based, not cookie-based, so they work identically regardless of consent state.
The analytics tool reading the UTMs may be gated by consent. The tags themselves are not. Clickport does not require consent, so UTMs are captured on every session.
First-touch vs last-touch attribution
UTMs label a single click. Whether that click gets credit for the conversion depends on the attribution model.
First-touch: the first UTM of the session wins. Good for campaigns whose job is to acquire a visitor.
Last-touch: the last UTM of the session wins. Good for campaigns whose job is to convert a visitor.
Clickport uses first-touch per session by default (see UTM tracking docs).
Frequently asked questions
Is this tool free? Do I need an account?
Yes, completely free. No signup, no email, no account. The builder runs entirely in your browser. Your URLs, presets, and history stay in your browser's localStorage and are never uploaded anywhere.
What does the channel classification preview actually do?
It runs the same classification logic Clickport uses on real traffic. Your UTM source, medium, and any click IDs get fed through a 16-channel decision tree and you see the result live. The preview matches how your URL would appear if you clicked it on your own site with Clickport installed.
How does the A-F hygiene score work?
You start at A. Each hygiene issue (uppercase letters, spaces, special characters, duplicate params, mismatched medium with utm_term) drops the grade by one. If required fields are missing, you get F regardless. The issues list tells you exactly what to fix.
Can I paste a URL that already has UTMs?
Yes. Switch to the Reverse parse tab and paste the URL. You get a plain-English breakdown, the hygiene grade, the classified channel, and a one-click button to load the parsed values back into the builder so you can edit them.
What is bulk permutations mode?
In Bulk permutations mode, each field accepts comma-separated values. facebook,linkedin in Source and cpc,social in Medium gives you four URLs (one per combination) in a table with channel classification and hygiene grade for each. Export as CSV or copy all at once.
Are my URLs stored anywhere?
No. Everything runs in your browser. Your recent builds and saved presets are stored in your browser's localStorage so they survive a page refresh, but they never leave your machine. Clear your browser data and they are gone. We do not log the URLs you build.
How is this different from the free UTM builder Plausible just released?
Plausible's tool has five input fields and a copy button. This one also has channel classification preview, A-F hygiene scoring, reverse URL parsing, bulk permutations, CSV export, QR codes, saved presets, and shareable URL state. The hook is the three unique features: only an analytics tool can credibly show you how your UTMs will be classified.
Can I share a builder state with my team?
Yes. Click "Copy shareable link" and send the resulting URL. When your teammate opens it, the builder prefills with the same values. No account, no backend: the state is encoded in the URL.
See your real campaigns in a dashboard
Tagging URLs is step one. Step two is watching them perform. Clickport shows every campaign, every channel, every conversion. Cookieless, GDPR-compliant, 30-day free trial.
Define the allowed values for each UTM field. Anyone using this builder on this browser will see warnings for values outside your list. Export as JSON to share the spec with your team.
utm_source
utm_medium
utm_campaign
utm_content
utm_term
utm_id
Keyboard shortcuts
Copy generated URLCmd+Enter
Analyze pasted URL (parse mode)Cmd+Enter
Open this help?
Close helpEsc
Bookmarklet
Drag this link to your bookmarks bar. Click it on any page to open the builder with that page's URL prefilled.