UTM Link Builder
Add utm_source, utm_medium, utm_campaign, utm_term, and utm_content to any URL and get a clean GA4 tracking link instantly. 100% client-side.
Generated URL
How the UTM Builder Works
A UTM link is just a normal URL with five optional query parameters tacked onto the end: utm_source, utm_medium, utm_campaign, utm_term, and utm_content. This tool builds that URL for you so you do not have to remember the parameter names, get the ampersands right, or worry about a stray space breaking the link later. Type in a destination URL, fill in the parameters that apply, and the tracking link appears in the result box as you type. Nothing is submitted anywhere; the URL object your browser already understands does the work.
- Paste your destination URL. This is the page the click actually lands on: a landing page, a blog post, a pricing page, whatever the campaign is promoting. Include the protocol (https://) or the tool will add one for you.
- Fill in utm_source. Where is this link being placed? A newsletter, a specific ad network, a partner site. This becomes the value analytics platforms use to answer "where did this visit come from."
- Fill in utm_medium. What kind of channel is this? Email, paid social, a banner, an affiliate placement. Source tells you the specific place; medium tells you the category of place.
- Name the campaign with utm_campaign. Every link that belongs to the same push, spring_sale, product_launch, black_friday, should share this exact value so they roll up into one row in your reports instead of scattering across several.
- Add utm_term and utm_content only if you need them. Both are optional, and skipping them when they do not apply keeps your links shorter and your reports cleaner.
- Copy the finished link. Click "Copy URL" and paste it wherever the link is going: an email platform, an ad manager, a social scheduler, or a spreadsheet you are building for a whole campaign at once.
The generator updates live as you type, so you can see exactly how each field changes the final URL before you commit to it. Clear a field and its parameter drops out of the link entirely rather than being appended as an empty value that would show up in your reports as a blank row.
The Five UTM Parameters, One at a Time
All five parameters exist to answer one question at different levels of detail: where did this visitor come from, and why did they click? Two of them are effectively required for the link to be useful, two are optional and situational, and one sits in between.
| Parameter | Answers | Typical values |
|---|---|---|
utm_source | Which specific place sent the traffic | google, newsletter, facebook, partner_site |
utm_medium | What category of channel that place is | cpc, email, social, affiliate, referral |
utm_campaign | Which marketing push this click belongs to | spring_sale_2026, product_launch, webinar_may |
utm_term | Which paid keyword triggered the ad | running_shoes, project_management_software |
utm_content | Which specific link or creative was clicked | header_cta, sidebar_banner, variant_b |
utm_source and utm_medium are the pair that shows up together in every analytics report as a single combined dimension, so it helps to think of them as a matched set. Source is specific (facebook, not "social media"), medium is the bucket that source belongs to (social). Get this pair right and everything downstream, channel groupings, default report tables, cost per acquisition by channel, lines up correctly.
utm_campaign is what ties a scattered set of links back into one initiative. A single campaign, say a product launch, might have a dozen individual links: one in an email, three in social posts, two in paid ads, a handful in partner newsletters. Every one of those should carry the same utm_campaign value so that when someone pulls a campaign performance report, all twelve show up contributing to the same row instead of twelve separate, hard to connect entries.
utm_term versus utm_content: the pair people mix up
utm_term was built for paid search specifically. It records the keyword that triggered a search ad, so when a report shows conversions by term, you can see which keywords are actually worth the bid. Outside of paid search campaigns, utm_term rarely has a natural use and most marketers leave it blank.
utm_content is broader: it distinguishes between two links that point to the exact same destination inside the exact same campaign. The classic example is an A/B test on an email, one version with a text link, one with a button, both going to the same landing page under the same campaign. Without utm_content, both clicks would look identical in your reports. With it, you can tell the button outperformed the text link by a factor of three. The same idea applies to comparing a header CTA against a footer CTA, or two different ad creatives running side by side.
How GA4 Turns These Parameters into a Report
Google Analytics 4 reads utm_source and utm_medium together and writes them into a single dimension called Session source/medium, formatted as source / medium, so a link tagged utm_source=newsletter and utm_medium=email shows up in reports as newsletter / email. That is the value you will filter by, compare against other channels, and build acquisition reports around, so whatever you type into those two fields becomes permanent, visible text in your analytics account.
utm_campaign lands in a separate dimension called Session campaign. This is what lets you open a report, filter to one campaign name, and see every session that arrived carrying that value, regardless of which source or medium brought it in. A well run campaign report is really just this dimension filtered down to one campaign, with source/medium as a secondary breakdown showing which channels within that campaign performed best.
utm_term and utm_content get their own dimensions too, Session manual term and Session manual ad content, and they only become useful once you actually add a secondary dimension or a comparison to see them. They do not appear in the default acquisition tables, which is part of why so many people set utm_term on every link out of habit and never look at the resulting data again.
The word session in those dimension names matters. GA4 attributes a new session's source and medium based on the parameters present on the link that started that session, not on every link a user has ever clicked. A visitor who arrives from an email today and comes back through a bookmark next week will show as two different sessions with two different source/medium values, which is expected and correct.
Naming Conventions That Keep One Campaign as One Row
GA4 treats UTM values as case sensitive strings, not as ideas. That means Facebook, facebook, and FACEBOOK are three different values as far as your reports are concerned, and a campaign tagged spring_Sale in one email and spring_sale in another will split into two rows even though a human reading both would call them the same campaign. The fix is a habit, not a feature: type every UTM value in lowercase, every time, on every link, with no exceptions for brand names or proper nouns.
Spaces cause a related but slightly different problem. A browser turns a literal space in a URL into %20, so a campaign named "Spring Sale" becomes spring%20sale in the address bar and in your reports, which is technically one value but reads as clutter and is easy to mistype inconsistently across different links. Use a hyphen or an underscore instead: spring-sale or spring_sale. Either works as long as you pick one and stick to it across your whole team, since spring-sale and spring_sale are, again, two different string values to GA4.
A short naming convention written down once and shared with everyone who builds links, marketing, agency partners, whoever manages paid ads, prevents most of this. Something as simple as "all lowercase, words separated by underscores, campaign names follow the pattern season_promotion_year" is enough to keep a full year of campaigns readable in one report instead of fragmenting into near duplicate rows that all have to be manually merged later.
Common Mistakes That Split One Campaign into Several Rows
The single most common UTM mistake is inconsistency across links that are supposed to belong together. A campaign built over a few weeks by different people, one person tags it spring_sale, another types Spring_Sale a week later, a third leaves out the underscore and writes springsale, and the result is a campaign report with three rows instead of one, none of them showing the full picture. The fix is always the same: agree on the exact string before the first link goes out, then copy that string rather than retyping it.
- Typos in the parameter name itself. utm_source misspelled as utm_soruce or utm_sourse will not error out anywhere; GA4 simply will not recognize it, and that traffic falls back to a generic channel instead of the one you intended.
- Mixing separators within one campaign. Using underscores in the campaign name on some links and hyphens on others creates two distinct values for what should be one row.
- Leaving utm_medium generic when it should be specific. A medium of "social" on every social link is fine, but setting it to "traffic" or "link" on everything defeats the purpose of the parameter entirely, since it no longer distinguishes anything.
- Re-tagging a link that is already live. Changing the UTM values on a URL after it has been shared, printed, or embedded means the old and new versions both keep collecting data under different values, and neither one tells the full story on its own.
Building every link for a campaign in one sitting, using the same tool, with the campaign name typed once and reused rather than retyped for each link, removes almost all of this risk before it happens.
Why Tagging Internal Links Backfires
It is tempting to add UTM parameters to a link inside your own site, a homepage banner pointing to a sale page, or a blog post linking to a related article, because it feels like it would show which internal placements drive clicks. It causes a real problem instead: GA4 treats a link carrying utm_source and utm_medium as the start of a new session, even when the click happens entirely within your own site. A visitor who arrived last week from a Google search, browsed around, and then clicked an internally tagged banner gets counted as a fresh session from whatever source and medium that internal link specifies, overwriting the original acquisition data for that visit.
This quietly corrupts your acquisition reports. Organic and paid traffic that should be credited to Google or a specific campaign instead gets reassigned to whatever internal source you tagged the banner with, and the more internal links you tag, the more sessions get artificially restarted mid visit. The traffic did not actually come from a new source; it was already on your site.
If you want to measure which internal placements get clicked, that is a real and useful question, but UTM parameters are the wrong tool for it. Event tracking or a dedicated internal campaign tool built for that purpose measures the click without disturbing the session's original source and medium. Save UTM tagging for links that live outside your own domain: emails, ads, social posts, partner sites, anywhere a visitor's session genuinely begins.
UTMs Through Redirects, Link Shorteners, and QR Codes
A UTM parameter only works if it survives the trip from the link someone clicks to the page GA4 actually measures. Most of the time it does, but three common detours are worth knowing about.
A standard 301 or 302 redirect, the kind used when a page moves or a short link expands to its full destination, normally passes query parameters straight through as long as the redirect target does not already define its own conflicting parameters. Test this once for any redirect chain you rely on regularly; some CMS platforms and some redirect rules strip the query string by default and need to be configured to forward it.
Link shorteners are usually fine, since the shortened link stores the full destination URL, UTM parameters included, and simply expands it on click, but it is worth checking a specific shortener's behavior once before relying on it for an entire campaign, since a few older or self hosted shorteners truncate long query strings.
QR codes are just a UTM link encoded as an image, so everything above applies the same way. A printed flyer, a poster, or packaging with a QR code pointing at a UTM tagged URL will report scans back into GA4 exactly like a clicked link would, with utm_source and utm_medium values you choose ahead of time, print or qr working well as a medium so this offline traffic does not get lumped in with your other channels.
Common Use Cases
Email campaigns
Every link in a newsletter or promotional email should carry the same utm_campaign, a medium of email, and a source identifying the specific list or platform sending it. Using utm_content to distinguish a header logo link from a body text link from a footer link reveals which placement inside the email people actually click, which is the kind of detail a raw open rate never shows.
Social media posts
Tagging links posted to different platforms with the platform name as the source, twitter, linkedin, instagram, and a medium of social or paid_social depending on whether the post was boosted, makes it possible to compare platforms against each other directly in one report instead of relying on each platform's own, differently defined analytics.
Paid advertising
Ad platforms report their own click and conversion numbers, but those numbers are not always defined the same way GA4 defines a session or a conversion. Tagging every ad's destination URL with utm_source, utm_medium, and utm_term for the triggering keyword gives you an independent, comparable view of paid performance sitting right next to your organic and email numbers in the same tool.
Print, packaging, and offline campaigns
A UTM link baked into a QR code on a flyer, a business card, or product packaging is often the only way to connect an offline touchpoint to an online conversion at all. Since these links rarely change once printed, get the campaign name and source right the first time.
Privacy: Everything Happens in Your Browser
Building out a full campaign's worth of UTM links, sometimes dozens across email, social, and paid channels, means typing out unreleased product names, unannounced campaign themes, and internal codenames well before any of it is public. This tool never sends any of that to a server. The URL parsing and parameter assembly run as JavaScript in the page you already have open, using the same URL object every modern browser ships with, and the result never leaves your device until you copy it yourself.
That also means there is no history to accidentally leak, no account to secure, and no third party retaining a record of which campaigns you were planning before launch day. Build one link or fifty in a single sitting, and the only place any of it exists is your own clipboard and whatever destination you paste it into.
Frequently Asked Questions
Related tools
🔒 100% Client-Side Privacy
Every UTM link is built <strong>entirely in your browser</strong>. No URL, campaign name, or parameter is ever uploaded to a server. Your campaign plans stay on your device.