SEO & web Tracking links

UTM link builder

Landing page
Source utm_source *
Where the click comes from: newsletter, google, linkedin.
Medium utm_medium *
The kind of traffic: email, cpc, social, referral. Analytics groups channels on this together with the source, so keep both to the standard values.
Campaign utm_campaign *
The thing you are running: spring-sale, launch-2026.
Content utm_content
Which link, when a page has several: header-cta, footer-link.
Term utm_term
The paid keyword. Usually filled in automatically by the ad platform.
Your link 0 characters
— Still missing: utm_source, utm_medium, utm_campaign
Live · lower case and hyphenated by default

UTM parameters are query-string tags an analytics tool reads to attribute a visit. This builder writes the classic five: source, medium, campaign, content and term. GA4 actually recognises nine, and it treats every value as case sensitive, stating that "utm_source=google is different from utm_source=Google".

How to build a UTM link

1 Paste the page the link should land on. A missing https:// is added, and any parameters already on the URL are kept.
2 Fill in source, medium and campaign. The presets are values GA4’s default channel rules recognise.
3 Check the source as carefully as the medium. Several channels need both to match before they will group correctly.
4 Copy the finished link. Leave the lower-case switch on unless you have a reason not to.

Begin with the thing most tagging guides get wrong, this page’s previous version included. Medium alone does not decide the channel. Read GA4’s own default channel rules and several of the ones people care about most take a condition on source as well. Paid Search needs the source to match Google’s list of search sites and the medium to match ^(.*cp.*|ppc|retargeting|paid.*)$. Paid Social needs a social source and the same medium pattern. Organic Search accepts a search source or a medium of exactly organic. Tag a LinkedIn ad as utm_medium=cpc and you will not get Paid Search, because LinkedIn is not a search site; you get Paid Social if the source matches Google’s social list, and Paid Other if it does not.

Some channels genuinely are medium-only, and those are the safe ones to memorise. Affiliates is utm_medium=affiliate, matched exactly, so the plural affiliates misses it. Referral takes referral, app or link. Display takes display, banner, expandable, interstitial or cpm. Email is more forgiving than the rest and matches on either field, accepting email, e-mail, e_mail or e mail in the source or the medium. Anything matching nothing lands in Unassigned, which GA4 describes as "the value Analytics uses when there are no other channel rules that match the event data", and Unassigned is where campaigns go to be quietly forgotten.

Case is the other reliable way to split one campaign into several, and GA4 documents it flatly: parameter values are case sensitive, so Newsletter and newsletter are two different sources sitting in two different rows of the same report. Nothing normalises them afterwards. The lower-case switch on this panel is on by default for that reason, and it also turns runs of whitespace into hyphens, so spring sale becomes spring-sale rather than arriving as spring%20sale.

Five is no longer the whole set. GA4 lists nine campaign parameters: alongside source, medium, campaign, term and content there are utm_id, utm_source_platform, utm_creative_format and utm_marketing_tactic, with the last two documented as not currently reported. The one worth adding by hand is utm_id, a campaign ID that lets GA4 join a manually tagged campaign to imported cost data, which is how a hand-tagged newsletter or sponsorship ends up with a cost per acquisition beside the ad platforms.

A few mechanics of the builder itself. The URL is parsed properly rather than concatenated, so existing query parameters survive, a value you type twice replaces rather than duplicates the parameter, and a fragment stays where it belongs at the end. That last one prevents a common hand-written mistake: appending ?utm_source=x after a #section anchor puts the whole query inside the fragment, where it is never sent to the server and never reaches analytics. Leave a field empty and its parameter is omitted entirely, which is better than emitting utm_term= and creating an empty dimension value.

Finally, the parameters are public. They sit in the address bar, they are copied whenever somebody shares the link, and they are readable by every script and extension running on the landing page. What they do not do any more is travel onward in the referrer: browsers have defaulted to strict-origin-when-cross-origin since 2020, so a click from your landing page to another site sends only your origin, with no path and no query. Even so, naming a campaign after an unannounced product or a client who has not signed is a way of announcing both. Keep the values descriptive and dull.

What people use it for

  • Tagging a newsletter send so every click lands in one campaign row
  • Keeping medium values consistent across links written by different people
  • Telling a header button and a footer link on the same page apart in the report
  • Handing a partner or a sponsor a link that credits their traffic properly
  • Checking a link someone else built before it goes out
  • Re-tagging a link that already carries parameters, without duplicating them
  • Tagging a landing page that has a fragment anchor on the end

Questions

Source, medium and campaign in practice. Without a source, Analytics has nothing to attribute the visit to and falls back to referral or direct.

Google Analytics Help, collect campaign data with custom URLsGoogle Analytics Help — default channel group
Was this tool any good?
Internal signal only · I use it to find the tools worth rebuilding