Free tool

Free UTM Builder

Build a clean campaign URL, see which GA4 channel it should land in, and copy it. No signup, and the link never leaves your browser.

The link is built in your browser. Nothing you type is sent anywhere.

Build your link

Templates

A template fills source and medium with values GA4 recognises. The campaign name you type is never overwritten.

required

The page people land on, with or without https://. If it already has UTMs and the fields below are empty, we pull them into the fields.

Required
required

Who sends the traffic: facebook, instagram, google, newsletter. Use the name on GA4's list; meta isn't on it.

required

How it arrives: cpc, paid_social, social, email, affiliate. Medium is what separates paid from organic in GA4.

required

The name you'll filter by later. Say what and when. Templates never overwrite what you type here.

Optional
optional

Keyword or audience. In Google Ads, the keyword; in Meta, the ad set.

optional

Which ad, creative or link. It's the field that answers "which piece brought this visit".

Value formatting

Applies to UTM values only. The destination URL and dynamic parameters are never changed.

Full URL

Fill in the destination, source, medium and campaign. The link appears here as you type.

Parameters only

For the URL parameters field in Meta and TikTok, or the Final URL suffix in Google Ads.

The link is built in your browser. Nothing you type is sent anywhere.

GA4 channel

Estimate

The channel appears once source and medium are filled in.

Estimated with GA4's default channel group rules.

Calculated from Google's published rules and its official source list (2023 version). GA4 may recognise variants that aren't on the list, and properties with a custom channel group follow their own rules.

Your recent links

Saved only in this browser. Nobody else sees them, us included. We keep the last 20.

No links here yet. Links you copy show up in this list, in this browser only.

    In the Supreme Console, links you build in the Campaigns section are saved on your own Node, not on our systems. Start for free

    How to use this UTM builder in 3 steps

    1. 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.
    2. 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.
    3. 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), equals ppc or retargeting, or starts with paid.
    • The source list. Google publishes a list of 819 sources tagged social, search, video or shopping. facebook, fb, instagram, ig, whatsapp and tiktok are social; google and bing are search; youtube is 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 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, not Spring Sale. Spaces become %20 and 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_friday and black-friday are different campaigns to every report.
    • Sources from Google's list. facebook, instagram, google, youtube, tiktok. Not meta, insta or facebook_ads.
    • Mediums from a closed list. cpc for paid search, paid_social for paid social, social for 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_05 still makes sense in six months. campaign1 doesn'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 different utm_content for the bio and for each Story. If your bio points to a link page, tag each link on it.
    • Email: newsletter / email lands in Email. The rule is exact: source or medium must be email, e-mail, e_mail or e mail. newsletter / newsletter is Unassigned.
    • YouTube: youtube / video is Organic Video; youtube / cpc is 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

    1. meta as the source. Paid Other instead of Paid Social.
    2. Made-up mediums. traffic, message, newsletter, affiliates. If the source isn't on Google's lists either, the visit is Unassigned.
    3. A dynamic value in the medium. With {{adset.name}} in utm_medium, the channel changes from ad set to ad set.
    4. 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.
    5. 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.
    6. UTMs after the #. In site.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 #.
    7. A wa.me destination. WhatsApp reads the number and the text. The UTMs go nowhere.
    8. 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.

    Start for free Free, no credit card

    Frequently asked questions

    What is a UTM builder?

    A UTM builder, also called a UTM generator or campaign URL builder, adds campaign parameters (utm_source, utm_medium, utm_campaign, utm_term and utm_content) to a link without breaking it: it keeps the parameters already in the URL, encodes spaces and accents correctly and puts everything before any #. This one also estimates the GA4 channel the link should land in and warns you about the naming mistakes that send traffic to Unassigned.

    Which UTM parameters are required for GA4?

    GA4 decides the channel from utm_source and utm_medium, and Google's own builder marks both as required, together with a campaign name or campaign ID. This builder requires source, medium and campaign, because the campaign is what you filter by later. utm_term and utm_content are optional, but utm_content is what tells one ad or link apart from another.

    Are UTM parameters case-sensitive in GA4?

    In reports, yes; in channels, no. GA4's channel rules ignore case, so Facebook with Paid_Social still lands in Paid Social. But source, medium and campaign values are stored as typed, so Facebook and facebook become two rows, and spreadsheets and other tools split them too. Google recommends lowercase, which is this builder's default.

    Should I use utm_source=facebook or meta for Meta ads?

    Use facebook, or instagram. GA4 decides Paid Social by checking the source against Google's list of social sources, and meta isn't on it. So meta with paid_social lands in Paid Other, and your Facebook and Instagram spend disappears from Paid Social. The same happens to insta, and to msg and an, which Meta's {{site_source_name}} returns for Messenger and Audience Network.

    Why does my UTM traffic show as "Unassigned" or "Direct" in GA4?

    Unassigned means no channel rule matched: usually a medium GA4 doesn't recognise, such as message, newsletter or affiliates (plural), combined with a source that isn't on Google's lists. Direct means the visit arrived with no source information at all, for example after a redirect stripped the query string. Check the medium first, then open your link and confirm the UTMs survive to the final page.

    Does Safari strip UTM parameters?

    Generally not. In Private Browsing, and on links opened from Mail and Messages, Safari removes 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. Some privacy-focused browsers and extensions do strip UTMs, so no parameter is guaranteed in every case.

    Should I put UTM parameters on internal links?

    No. A UTM on an internal link, like a homepage banner pointing to your offer page, gives the visit a new source halfway through, and the real one, the ad or email that brought the person in, is lost. Keep UTMs for links that live outside your site: ads, emails, social posts, partners. Track internal clicks with events instead.

    How do I add UTMs to every Meta ad without editing each one?

    Use Meta's dynamic parameters in the ad's URL parameters field (ad level, Tracking section, no leading ?): utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_term={{adset.name}}&utm_content={{ad.id}}. Meta replaces each {{...}} with the real value at click time, so the same string works for every ad and you never type an ID. Keep the double braces and never leave a parameter empty.

    Do I still need UTMs on Google Ads if auto-tagging is on?

    For GA4, not really: with auto-tagging on, GA4 uses the gclid data instead of your UTMs by default. For other tools that read the URL, such as Supreme, the UTMs still count. If you use them, put them in the Final URL suffix with {keyword} and {creative}, and type the campaign name yourself: Google has no ValueTrack parameter for it.

    What are TikTok's UTM macros, and what do __AID__ and __CID__ mean?

    TikTok replaces tokens like __CAMPAIGN_NAME__, __AID_NAME__ and __CID__ at click time. The trap is the naming: __AID__ is the ad group and __CID__ is the creative. A clean pattern is utm_source=tiktok&utm_medium=paid_social&utm_campaign=__CAMPAIGN_NAME__&utm_term=__AID_NAME__&utm_content=__CID__. Avoid a # in the destination, because TikTok drops everything after it.

    Can I add UTMs to a URL that already has parameters or a #?

    Yes. This builder keeps your existing parameters exactly as they are, replaces any old utm_source, utm_medium, utm_campaign, utm_term or utm_content, and places the UTMs before the #, never inside it. It doesn't rebuild the query string, so values like a+b or a flag with no value stay byte for byte. Other utm_ parameters, such as utm_id, are kept, with a warning.

    Do you store the links I build?

    No. The link is built in your browser, and neither the link nor the values you type are sent to us. Your last 20 copied links are kept only in this browser's local storage, and you can clear them at any time. What the page does measure, through the same Supreme tracking the rest of our site uses and tied to this browser's cookie, is how the builder is used: which template you pick and which copy or next-step button you click, with coarse details such as the formatting option, the estimated GA4 channel and how many warnings the link had. The link, the values you type and your history are never sent.

    Carry the click's source all the way to the sale.

    Supreme stores each visit's UTMs on your own server and ties Hotmart, Kiwify and Yampi sales back to them when the checkout link starts on your page. Install your first Node on the hosting you already have.

    Free, no credit card

    Your email is only for starting the install. The builder stays free, no signup.