Measurement Tool

UTM Builder — Free Campaign URL Generator

Build tagged campaign URLs — and see the exact GA4 default channel group each link will land in before you spend a dollar against it.

Show optional parameters — utm_id, utm_term, utm_content
Word separatorSeparator
Your tagged link

GA4 channel check

Waiting for a source and medium

Fill in utm_source and utm_medium and this will show the exact GA4 default channel group your traffic lands in — before you spend anything against the link.

How this appears in GA4 → Reports → Acquisition → Traffic acquisition
Session source / mediumSession campaignDefault channel group
(direct) / (none)(not set)

Link audit3 to fix · 1 to check · 1 tip

  • Fix

    destinationAdd the page this link should open. Everything else is a label on top of it.

  • Fix

    utm_sourceWithout utm_source, GA4 falls back to whatever referrer the browser sends — so the campaign has no reliable origin and cannot be compared against anything.

  • Fix

    utm_mediumutm_medium is the parameter that picks the channel group. Leave it out and the session reports as Referral or Unassigned, whatever the source says.

  • Check

    utm_campaignLegal, but the campaign column will read (not set), so nothing rolls up and you cannot compare this link against the rest of the push.

  • Tip

    utm_idAdd utm_id if you ever want cost data next to these sessions — it is the join key GA4 Data Import matches on. Without it, spend and sessions never meet in the same report.

Everything here runs in your browser. No link you build is sent to Refinity, logged, or stored anywhere but this device. Channel groups follow Google’s published GA4 default channel group rules — a custom channel group in your own property will override them.

What a UTM actually does — and what it doesn’t

A UTM parameter is a label you attach to a link before anyone clicks it. Five parameters do the work: utm_source (where the click comes from), utm_medium (how they got there), utm_campaign (why), and the optional utm_term and utm_content for keyword and creative. Google Analytics reads them off the URL and files the session accordingly.

The reason to bother is that the alternative — referrer data — is unreliable and getting worse. Referrers are stripped by in-app browsers, rewritten by email clients, and withheld by privacy settings. Even when a referrer arrives intact, it cannot tell a paid placement apart from an organic post on the same platform. Both arrive as facebook.com.

What a UTM does not do is create attribution. It labels the click. Everything after that — whether the session is credited, how long the lookback window is, which conversion it gets attached to — is decided by your analytics configuration, not by the link. A perfectly tagged URL in a badly configured property still tells you very little.

How GA4 turns two parameters into a channel

This is the part most UTM guides skip, and it is where the money is lost. GA4 does not store your utm_medium and show it back to you in the channel report. It runs your source and medium through a fixed, ordered list of nineteen rules and assigns the session to the first one that matches. Everything that matches nothing lands in Unassigned.

The order is what catches people. Paid Social is rule 5 and requires a medium matching ^(.*cp.*|ppc|paid.*)$. Organic Social is rule 10 and matches a medium of simply social. So a Meta campaign tagged utm_source=facebook&utm_medium=social fails the paid test at rule 5, falls through, and is captured by rule 10 as Organic Social. The link is valid. The traffic is counted. The spend is simply not in your paid reporting, and nothing anywhere raises an error.

The near-misses are worse, because they look deliberate. social-paid reads like a sensible medium and fails, because paid.* is anchored to the start of the value and there is no cp in it. newsletter is the obvious medium for a newsletter and matches no rule at all. The reference table above is the full list worth memorising; the checker at the top of this page is faster.

The five mistakes that make a channel report lie

  1. Using social for paid social. The single most expensive one. Use paid-social or cpc and keep the platform in the source.
  2. Capital letters. GA4 dimensions are case-sensitive. Facebook and facebook are two rows that never sum, and one teammate capitalising a brand name fragments a quarter of data.
  3. Spaces. They encode as %20 — or as + if a platform re-encodes the link — which is how one campaign becomes two rows you reconcile by hand.
  4. Inventing a medium. newsletter, partner, qr, print all sound reasonable and all resolve to Unassigned.
  5. Tagging internal links. A UTM on a link between two pages of your own site starts a new session and overwrites the original acquisition source — the visitor Google sent you gets re-attributed to your own campaign.

A naming convention you can actually enforce

The rule that survives contact with a team is three words long: source is where, medium is how, campaign is why. The platform goes in the source. The channel type goes in the medium, chosen from GA4’s recognised list rather than invented. The thing you are promoting goes in the campaign, spelled identically everywhere.

Then two mechanical rules: lowercase everything, always; and pick one separator and never deviate. Hyphen or underscore is genuinely arbitrary — mixing them is not, because every split-column formula in your reporting sheet then needs two cases.

The reason to write this down once is that UTM hygiene degrades by accretion. No single link breaks a report. Thirty links built by four people over a quarter, each slightly differently, produce a channel report nobody trusts and everybody quietly works around.

Tagging social ads versus organic posts

Same platform, same link, two different jobs. An organic post is utm_source=facebook&utm_medium=social — here social is correct, because the traffic genuinely is organic social. A paid placement is utm_medium=paid-social. The source stays the same; the medium is what separates the ad account from the content calendar.

Two platform-specific things worth knowing. In-app browsers on TikTok and Instagram are aggressive about stripping parameters, so test the finished link from a phone rather than from your desktop. And Meta, LinkedIn, and Pinterest all append their own click IDs (fbclid, li_fat_id, epik) — those sit alongside your UTMs rather than replacing them, so both survive.

Tagging email newsletters

The medium is email. Not newsletter, not e-blast, not the name of your ESP — those all land in Unassigned. The publication or list belongs in the source, and the individual send belongs in the campaign.

The complication is that most email platforms want to tag links themselves. Klaviyo, Mailchimp, and HubSpot all offer automatic UTM appending, and running that alongside hand-built links produces duplicate utm_ keys on the same URL — GA4 reads the first occurrence and silently ignores the rest, so which one wins depends on ordering you do not control. Pick one system and turn the other off.

One privacy note: Mailchimp’s mc_eid identifies an individual subscriber. Keep it out of anything you publish or share, and never put an email address in a UTM value — Google prohibits sending personally identifiable information to Analytics, and sustained violations can cost you the property’s data.

utm_id, cost data, and the join you actually want

utm_id is the parameter almost nobody sets and the one that unlocks the most. It is the join key GA4 Data Import matches your spend against, which is what puts cost, sessions, and conversions in the same report — and therefore what lets you calculate a real ROAS or cost per lead without exporting two systems into a spreadsheet.

utm_term is the paid-search keyword slot and belongs nowhere else; on a social campaign it becomes a mystery column three months later. utm_content is where creative names, audiences, and placements go — and it is what stops two otherwise identical links collapsing into a single row.

When not to tag at all

Internal links. Never. A UTM between two pages of your own site starts a fresh session and overwrites the original source. If you need to measure an internal promotion, use an event.

Google Ads with auto-tagging on. The gclid parameter overrides manual UTMs in GA4 entirely, so hand-tagging an auto-tagged URL changes nothing — and if auto-tagging is ever switched off, you get a silent attribution change instead of a visible error. The same applies to Microsoft Ads and msclkid.

Anything containing personal data. No email addresses, no phone numbers, no customer IDs — not in the campaign, not in the content.

If links are already live and the report looks wrong, paste one into the Audit tab above. It runs the same rules over an existing URL and shows you the channel group it is actually reporting into, which is usually the fastest way to explain a month of traffic that went missing.

How to generate a UTM code

  1. Start from a clean destination URL

    Paste the page you want the click to land on. Strip any utm_ parameters it already carries — this builder replaces them rather than stacking a second set, and it preserves real query strings and #anchors instead of overwriting them.

  2. Pick the channel, not the parameters

    Choose a preset rather than typing utm_source and utm_medium separately. GA4 grades the two together and never in isolation, so facebook + social and facebook + paid-social are the same platform reporting into two completely different channels.

  3. Name the campaign once, then reuse it exactly

    Lowercase, one separator, no spaces. GA4 dimensions are case-sensitive: Spring_Sale and spring_sale become two rows in your report that never add up to one number.

  4. Read the channel check before you copy

    Confirm the GA4 default channel group is the one you will report against. Unassigned, or an unexpected Organic on a paid campaign, is a tagging bug you can still fix — after launch it is a gap in the data you cannot backfill.

  5. Add utm_id if you want cost data alongside sessions

    utm_id is the join key GA4 Data Import matches spend against. Without it, sessions and cost live in separate reports and never meet.

What each utm_medium value does in GA4

GA4 assigns a channel group by walking a fixed, ordered rule set over utm_source and utm_medium — first match wins. These are the medium values that decide the outcome; anything not on the list falls through to Unassigned. Reviewed against Google’s published default channel group definitions on 21 August 2026.

utm_medium valueGA4 default channel groupNotes
cpc, ppc, paid-searchPaid SearchOnly when utm_source is a recognised search engine. The same medium on facebook becomes Paid Social, and on an unrecognised source it becomes Paid Other.
paid-social, paid_socialPaid SocialRequires the source to be a known social platform. Note that social-paid does NOT match — the rule is anchored to the start of the value.
social, social-media, smOrganic SocialThe most expensive row in this table. Used on a paid campaign, it reports Meta and LinkedIn ad spend as organic traffic.
organicOrganic SearchNever set this by hand on a campaign link. It overwrites genuine organic attribution with your own campaign.
display, banner, cpm, interstitialDisplayChecked before the generic paid rule, so cpm lands in Display even on a paid buy rather than in Paid Other.
email, e-mailEmailGA4 matches on either the source or the medium, so utm_source=email also qualifies.
referral, app, linkReferralThe honest medium for a link someone else hosts — a partner page, a webinar platform.
affiliateAffiliatesExact match only. No plurals, no variants.
audioAudioThe right medium for a podcast read.
smsSMSMatches on either source or medium.
cpv, videoPaid Video / Organic VideoPaid Video needs a video source such as youtube plus a paid medium.
newsletter, partner, qr, printUnassignedNo rule matches any of these. The traffic is real and the sessions are counted — they are just missing from every channel report you use to judge the campaign.

Frequently asked questions

  • What is a UTM generator?

    A UTM generator is a tool that adds tracking parameters to a URL so analytics can tell you where a visitor came from. You supply the destination page plus a source, medium, and campaign name, and it returns a link like https://example.com/?utm_source=facebook&utm_medium=paid-social&utm_campaign=spring-sale. The parameters travel with the click and appear in Google Analytics as the traffic source, medium, and campaign for that session.

  • How do you generate a UTM code?

    Take the page you want people to land on, then add utm_source (where the click comes from, such as facebook), utm_medium (how they got there, such as paid-social), and utm_campaign (the promotion, such as spring-sale). Join them to the URL with a question mark and separate them with ampersands. Use lowercase throughout and no spaces. The builder on this page does the assembly and, unlike most generators, also tells you which GA4 channel group the finished link will report into.

  • How do I create trackable links for marketing campaigns?

    Decide your naming convention before you build anything: utm_source is the platform, utm_medium is the channel type, and utm_campaign is the thing you are promoting. Then build one link per placement, keeping the campaign name identical across all of them so they roll up together, and using utm_content to tell individual creatives or placements apart. Build the whole set at once rather than one at a time — a campaign name typed five times is a campaign name spelled five ways.

  • How do I create UTM codes for tracking social media ads?

    Use the platform as the source (facebook, instagram, linkedin, tiktok) and paid-social or cpc as the medium. The medium is the part that matters: utm_medium=social matches GA4’s organic social rule, so a paid campaign tagged that way reports as Organic Social and the ad spend disappears from your paid reporting entirely. Values like social-paid look sensible but fail too, because GA4’s paid pattern is anchored to the start of the value. Check the channel group in the builder above before the campaign goes live.

  • What are the best practices for naming utm_source and utm_medium?

    Keep utm_source as the specific platform and utm_medium as the broad channel type, never the reverse. Use lowercase without exception, because GA4 dimensions are case-sensitive and Facebook, facebook, and FACEBOOK become three separate rows. Pick one separator, hyphen or underscore, and never mix them. Most importantly, restrict utm_medium to values GA4 actually recognises — cpc, paid-social, email, referral, display, affiliate, audio, sms, organic — because an invented medium like newsletter or partner sends the traffic straight to Unassigned.

  • What is the purpose of UTM parameters in analytics?

    UTM parameters let you label a click before it happens, so analytics can group sessions by where they came from rather than guessing from the referrer. Referrer data is unreliable — it is stripped by apps, email clients, and privacy settings, and it cannot tell a paid placement apart from an organic one on the same platform. UTMs solve both problems. What they do not do is create attribution: they label the click, and everything downstream still depends on your analytics configuration.

  • How do I use a UTM generator for email newsletters?

    Set utm_medium to email — this is the single most common place people get it wrong, because newsletter feels like the natural value but matches no GA4 rule and lands in Unassigned. Put the publication or list in utm_source (newsletter, klaviyo, mailchimp) and the specific send in utm_campaign. If your email platform appends its own tracking parameters, turn one of the two systems off rather than running both, or you end up with duplicate utm_ keys and GA4 reads only the first.

Related tools

Where this fits

Want help putting these numbers to work?

Refinity helps growth-stage teams turn metrics like these into a measurable, automated growth system.

GA4 channel rules and presets last reviewed by the Refinity.io team.