How to use this UTM builder in 3 steps
- Paste the destination URL. If it already carries UTMs, from an old campaign or a link someone sent you, and the fields are still empty, the builder reads them into the fields, so it doubles as a UTM decoder. Every other parameter in the URL stays exactly as it was.
- Pick a template and name the campaign. The template fills source and medium with values GA4 recognises. The campaign is always yours; no template overwrites a name you typed. Term and content are optional, but content is what tells one creative from another when you ask what sold.
- Check the channel and copy. The badge shows which GA4 channel the link should land in, and the warnings flag what will cause trouble in your reports before the link goes live. Copy the full URL or, for an ad platform, the parameters only.
Everything runs in your browser, and your last 20 copied links are kept only there.
What UTM parameters are, and what each of the five does
UTM parameters are tags at the end of a link that say where a visit came from. Whatever is installed on the page, GA4 or Supreme, reads them and stores them with the visit. Without them, a tool only has the referrer, which won't tell you which campaign, ad or email brought someone in.
| Parameter | What it answers | Example | In this builder |
|---|---|---|---|
utm_source |
Who sent the traffic | facebook, google, newsletter |
required |
utm_medium |
How it arrived: paid, organic, email | paid_social, cpc, email |
required |
utm_campaign |
Which push or offer | spring_sale_2026 |
required |
utm_term |
Keyword or audience | {keyword}, cold_audience |
optional |
utm_content |
Which ad, creative or link | {{ad.id}}, top_button |
optional |
For GA4, source and medium decide the channel. Google's own builder marks both as required and asks for a campaign name or ID; here the campaign is required too, because it's what you'll filter by.
There's also utm_id, which ties the visit to imported cost data. This builder doesn't manage it: if the destination already has one, it stays, and you get a warning. The builder also keeps a fixed order (source, medium, campaign, term, content) and encodes spaces as %20, the form Meta, Google Ads and GA4 use in their own examples.
Which GA4 channel your link will land in
There's no "channel" parameter. GA4 works the channel out from source, medium and, in two cases, the campaign name, running through a list of rules in order. The first rule that matches wins. Two pieces do most of the work:
- Paid medium. Any medium that contains
cp(cpc, cpm, cpa), equalsppcorretargeting, or starts withpaid. - The source list. Google publishes a list of 819 sources tagged social, search, video or shopping.
facebook,fb,instagram,ig,whatsappandtiktokare social;googleandbingare search;youtubeis video.
Put them together: a social source with a paid medium is Paid Social; a search source with a paid medium is Paid Search; a paid medium with a source on no list is Paid Other.
| utm_source | utm_medium | GA4 channel |
|---|---|---|
facebook |
paid_social |
Paid Social |
meta |
paid_social |
Paid Other |
google |
cpc |
Paid Search |
tiktok |
paid_social |
Paid Social |
youtube |
cpc |
Paid Video |
instagram |
social |
Organic Social |
newsletter |
email |
|
newsletter |
newsletter |
Unassigned |
partner |
affiliate |
Affiliates |
partner |
affiliates |
Unassigned |
The meta trap
The company is called Meta and so is the ads platform, so utm_source=meta is everywhere, including the pattern plenty of tools teach. But meta isn't on Google's social list. With paid_social, the link lands in Paid Other, and your Facebook and Instagram spend vanishes from Paid Social. The same goes for insta, threads and x, and for msg and an, which Meta's {{site_source_name}} returns for Messenger and Audience Network clicks. Use facebook or instagram.
Case sensitivity: what actually breaks
You've probably read that capital letters "break GA4". Half true. Channel rules ignore case: Facebook with Paid_Social still lands in Paid Social. What breaks is reporting. In the source, medium and campaign dimensions, Facebook and facebook are two rows, and the total you want is split. That's why this builder defaults to lowercase, the standard Google itself recommends.
Campaign names can change the channel too
A campaign containing cross-network goes to Cross-network. One containing shopping, or shop in names like black_shop or eshop_x, goes to Paid or Organic Shopping depending on the medium. workshop escapes thanks to a detail in the rule.
The badge runs exactly this logic, and it's an estimate: the published list dates from 2023, the social rule may match variants off the list, and properties with a custom channel group follow their own rules.
A UTM naming convention your team will actually keep
Messy UTMs don't throw errors. They just pile up duplicate rows until nobody trusts the report. A short convention fixes it, as long as everyone uses the same one:
- Lowercase, no accents, no spaces.
spring_sale, notSpring Sale. Spaces become%20and accents become percent-encoded bytes; it works, but rows split the moment someone types it differently. The snake_case mode cleans this up for you. - One separator.
_or-, pick one.black_fridayandblack-fridayare different campaigns to every report. - Sources from Google's list.
facebook,instagram,google,youtube,tiktok. Notmeta,instaorfacebook_ads. - Mediums from a closed list.
cpcfor paid search,paid_socialfor paid social,socialfor organic,email,affiliate,referral,video. Six or seven values, written down where the team can find them. - Campaigns that say what and when.
course_x_launch_2026_05still makes sense in six months.campaign1doesn't. - Content that identifies the asset.
story_day_1,top_button,{{ad.id}}. It's what answers "which creative sold". - No
|,#,&or?in values. They mean something in a URL. The builder encodes them, but names become unreadable and tools that split values on|get confused.
About the name|ID pattern: joining name and ID with a pipe, like {{campaign.name}}|{{campaign.id}}, is common. IDs have better homes: the campaign ID in utm_id, the ad ID alone in utm_content. Merging them into one value gets in the way of any tool that needs one or the other, and Supreme is one of them: matching a sale to a Meta ad needs the ID (or the name, with attribution set to Ad name) alone in the field.
UTM parameters by channel: Meta, Google Ads, TikTok and more
Meta Ads UTM parameters
On Meta Ads (Facebook and Instagram), don't build one link per ad. Use dynamic parameters: Meta swaps each {{...}} for the real value at click time. A pattern that works for GA4 and for Supreme:
utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.id}}
Paste it at the ad level, under Tracking → URL parameters, with no leading ?, and keep only the page address in the website URL field. If the URL already has the same key, Meta's value wins. Three details: {{campaign.name}} keeps the name from first publish, so renaming later changes nothing; single braces or spaces inside aren't recognised and show up literally in reports; and Meta asks that no parameter be left empty.
Keep the medium fixed. With {{adset.name}} in utm_medium, the channel depends on each ad set's name: cold_audience lands in Organic Social, while LAL_CPA lands in Paid Social only because it contains cp.
If you use Supreme with Meta Ads connected, {{ad.id}} on its own in utm_content matches each sale to the ad. That's the default; {{ad.name}} also works when the Console's Meta Ads attribution is set to Ad name. The setup is in Connect Meta Ads to your Node.
Google Ads UTM and ValueTrack
Google Ads has auto-tagging. With it on, each click carries a gclid and, by default, GA4 uses the auto-tagging data instead of your UTMs. For GA4, UTMs on Google Ads are close to decorative; they still matter for other tools that read the URL, such as Supreme. If you use them, put them in the Final URL suffix:
utm_source=google&utm_medium=cpc&utm_campaign=brand_search&utm_term={keyword}&utm_content={creative}
There's no ValueTrack parameter for the campaign name, so type it. {campaignid} exists, and its place is utm_id. {keyword} comes back empty in Performance Max, Dynamic Search Ads and AI Max. And never paste a gclid from one of your own clicks into a fixed link: GA4 will use auto-tagging data instead of your UTMs.
TikTok Ads
utm_source=tiktok&utm_medium=paid_social&utm_campaign=__CAMPAIGN_NAME__&utm_term=__AID_NAME__&utm_content=__CID__
The trap is in the names: __AID__ is the ad group and __CID__ is the creative. TikTok itself suggests utm_term for the ad group name. Paste it under Ad details → Destination URL → Edit → Build URL parameters, and avoid a # in the destination: TikTok drops everything after it.
UTMs on WhatsApp links
UTMs work on a link you send through WhatsApp that opens your site: broadcast lists, groups, status. Use whatsapp / social (whatsapp is on Google's social list) and tell messages apart with utm_content.
A wa.me link is different: WhatsApp only reads the number and the text, so the UTMs never reach analytics. Click-to-WhatsApp ads are their own case: they carry their own click ID into the chat, without UTMs. If you want the source recorded on your site before the chat starts, send people through a page of yours with the chat button first.
Instagram, email, YouTube
- Instagram bio and Stories:
instagram/social(Organic Social), with a differentutm_contentfor the bio and for each Story. If your bio points to a link page, tag each link on it. - Email:
newsletter/emaillands in Email. The rule is exact: source or medium must beemail,e-mail,e_mailore mail.newsletter/newsletteris Unassigned. - YouTube:
youtube/videois Organic Video;youtube/cpcis Paid Video.
Affiliates and partners
affiliate, singular, is the medium for the Affiliates channel; affiliates, plural, is Unassigned. Put the partner's name in the source so you know who sold. On digital-product platforms there's a catch: on Kiwify, affiliates can't add parameters to the sales page, only src on the checkout link, and Hotmart works with sck and src. The hop to the checkout decides whether the source reaches the sale.
8 mistakes that turn tagged traffic into Direct, Unassigned or the wrong channel
metaas the source. Paid Other instead of Paid Social.- Made-up mediums.
traffic,message,newsletter,affiliates. If the source isn't on Google's lists either, the visit is Unassigned. - A dynamic value in the medium. With
{{adset.name}}inutm_medium, the channel changes from ad set to ad set. - UTMs on internal links. A homepage banner with UTMs gives the visit a new source halfway through, and the real one, the ad or email that brought the person in, is lost.
- A redirect that drops the query string. Link shorteners, old-domain redirects, interstitials. The UTMs die before the page loads, and all that's left to classify the visit is the referrer, if there is one.
- UTMs after the
#. Insite.com/#offer?utm_source=..., everything after#is the fragment, a classic reason UTMs don't show up in GA4. This builder always puts UTMs before the#. - A
wa.medestination. WhatsApp reads the number and the text. The UTMs go nowhere. - Checkout on another domain, with nothing carrying the source. The visit has UTMs, the purchase happens on a hosted checkout, and the link between the two is lost in the hop. It's the one that costs you the sale itself.
A bonus: mixed case doesn't change the channel, but it splits Facebook and facebook into separate rows.
What happens to your UTMs after the click
UTMs only exist in the URL of the first page someone opens. Whatever is installed there (GA4, a pixel, Supreme) reads them; a checkout platform only sees what reaches its own link. Between click and sale, three things routinely erase the source: a redirect that drops the query string, a checkout on another domain, and the buyer who comes back days later by typing your address.
One point in the UTM's favour: in Private Browsing, and on links opened from Mail and Messages, Safari strips known tracking parameters before loading the page. Apple doesn't publish the list, but it gives the campaign parameter as an example of what is kept; click IDs are what may disappear. Beyond those cases, sources disagree.
What Supreme does with them
Supreme is tracking infrastructure that runs on your own hosting: the Node (the tracking server) lives on your server, and the Console reads straight from it. The part that matters here:
- Keeps the landing UTMs in each visitor's session, on your own server.
- Holds the source for returning visitors: someone who comes back direct in the same browser within 7 days of clicking a UTM link inherits the source of that last click.
- Classifies the channel on its own (Meta Ads, Google Ads, email, organic social, affiliates), regardless of capitalisation.
- Ties the sale to the visit: Hotmart, Kiwify and Yampi sales are linked to the buyer's visit and UTMs when the checkout link starts on your page. With the Hotmart or Kiwify integration active, the page's UTMs follow into the checkout link; digits-only values are left out of that link.
- Shows the path: in the Console you see the source of every event, every session and the visitor's journey.
What it can't do: if a redirect deleted the UTM before the page loaded, there's nothing to read. No tool recovers data that never arrived.
To start, Supreme has to be on the page that receives the click: that's the Loader. To see where UTMs sit in Supreme's event format, read The canonical event payload.