The UTM builder below turns a page URL and a few campaign details into a tracking link that GA4 reads correctly. It lowercases every value, swaps spaces for hyphens and strips anything that would break the link, so every link you make follows the same rules.
Why it matters: GA4 treats "Facebook" and "facebook" as two different sources. One typo splits a campaign's results across two rows, and after a year of ad hoc links, nobody can say what email or paid social delivered. Clean UTMs are the difference between a report you trust and a spreadsheet you argue about.
The UTM builder
Fill in the fields and the finished link updates as you type. The source, medium and campaign fields suggest the values from our naming table further down.
Add https:// at the start so the link opens, not just the page path.
Nothing you type leaves this page. The tool runs in your browser and stores nothing.
What UTM parameters are
UTM parameters are short tags you add to the end of a URL. When someone clicks the link, GA4 reads the tags and files the visit under the source, medium and campaign you named. The page itself doesn't change. Only the reporting does.
There are five, and the first three do almost all the work.
- utm_source is where the click came from:
google,facebook,newsletter. - utm_medium is the type of channel:
cpc,paid-social,email. - utm_campaign is the name of the campaign, promotion or send.
- utm_content tells two links in the same campaign apart, such as two ads or the top and bottom button in one email.
- utm_term was built for paid search keywords. Google Ads auto-tagging covers the keyword for you, so most teams leave it blank everywhere else.
Here's what a finished link looks like for a water heater promotion running on Facebook:
https://www.acmeplumbing.com/water-heaters/?utm_source=facebook&utm_medium=paid-social&utm_campaign=acme-leads-water-heaters-oct26&utm_content=video-same-day-v1
The question mark starts the tags, the ampersands separate them, and GA4 does the rest.
UTM naming conventions that keep GA4 clean
GA4 is case-sensitive and matches values exactly. Paid Social, paid-social and paid_social are three different mediums to it. The fix isn't a reminder to be careful. It's a short set of rules and a fixed list of values, so there's nothing to decide at link time.
- Lowercase only. Every value, every time. The builder enforces this for you.
- Hyphens instead of spaces. A space becomes
%20in a URL and looks like a mistake in reports. Pick hyphens and stay with them. - A fixed list of source and medium values. Sources name the platform. Mediums name the channel type, and GA4's default channel groups depend on them:
cpclands in Paid Search,paid-socialin Paid Social,emailin Email. Invent a medium and GA4 files the traffic under Unassigned. - A campaign pattern that matches your ad accounts. We name campaigns
Brand | Objective | Product | Datein Meta andBrand | Type | Theme | Geo or datein Google Ads. The UTM version is the same fields in the same order, lowercased, with hyphens for the separators:acme-leads-water-heaters-oct26.
This is the table we hand clients. Copy it into your tracking sheet and treat it as the only list of allowed values.
| Parameter | Allowed values | Example |
|---|---|---|
| utm_source | google, facebook, instagram, linkedin, youtube, newsletter, partner (add the partner name as utm_content) | facebook |
| utm_medium | cpc, paid-social, email, organic-social, referral, display, video | paid-social |
| utm_campaign | brand-objective-product-date, matching the campaign name in the ad platform | acme-leads-water-heaters-oct26 |
| utm_content | format-hook-version for ads, or the link position for email | video-same-day-v1 |
| utm_term | Leave blank outside paid search. Google Ads auto-tagging covers the keyword. | water-heater-repair |
Two notes on the source list. Use facebook and instagram as separate sources rather than meta, because GA4 recognizes both names and the split is useful. And if a partner or publisher sends you traffic, use partner as the source and put their name in utm_content, so the source list stays short.
How to set up UTM parameters, step by step
- Build a shared tracking sheet. One spreadsheet, shared with everyone who makes links. The columns are date, destination URL, source, medium, campaign, content, term, the finished link and who made it. Put the allowed values table on a second tab. This sheet is the system. The builder is just the pen.
- Generate every link with the builder. Paste the destination URL, pick the source and medium from the list, write the campaign value in the pattern, and copy the result into the sheet before it goes anywhere else. Never type a UTM link by hand, and never edit one in a text field after it's built.
- Test the link in GA4 Realtime. Open the link in a private browser window. In GA4, go to Reports, then Realtime, and look at the "Users by First user source" card. Your source, medium and campaign should appear within a minute, spelled exactly as you wrote them. If they don't, the link was changed somewhere between the builder and the browser. A shortener, a CMS link field or a redirect is the usual suspect.
- Find the data in Traffic acquisition. After the campaign has run for a day, go to Reports, Acquisition, then Traffic acquisition. Change the primary dimension from Session default channel group to Session source / medium, or add Session campaign as a second dimension. Each clean source and medium pair shows up as one row, with sessions, engagement and conversions beside it.
One habit that saves the whole system: every new link gets a row in the sheet before it ships. If a link isn't in the sheet, it doesn't go out.
Platform notes: Google Ads, Meta and email
Google Ads usually doesn't need manual UTMs. Auto-tagging adds a gclid parameter to every click, and the Google Ads link inside GA4 turns that into source google, medium cpc, your campaign name, ad group and keyword. Name your campaigns well and the reporting inherits it for free.
Add manual UTMs on Google Ads when a tool other than GA4 needs them: a CRM like HubSpot, a call tracking platform or a client's own reporting that can't read a gclid. Put them in the campaign's final URL suffix, keep auto-tagging on, and know that GA4 will keep using the gclid data unless you switch on "Allow manual tagging to override auto-tagging" in the Google Ads link settings. Leave that off unless you have a reason.
Meta needs the UTMs, and dynamic values make them consistent. Meta has no auto-tagging for GA4, so without parameters its traffic shows up as referral from facebook.com or, worse, as direct. In Ads Manager, the URL parameters field at the ad level is where they go, and it applies to every link in the ad. Use Meta's dynamic values so the campaign name you already wrote fills itself in:
utm_source={{site_source_name}}&utm_medium=paid-social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}
Two things to know. {{site_source_name}} returns short codes, so Facebook arrives as fb and Instagram as ig. GA4 recognizes both. And {{campaign.name}} inserts the name exactly as you wrote it in Meta, capitals and separators included. That's fine, because the platform writes it the same way every time, and a value that never drifts beats a lowercase value typed by hand. Set the parameters once at the account level in Ads Manager so new ads inherit them.
Email platforms add their own UTMs. Mailchimp, Klaviyo, HubSpot and most others tag every link in a send by default, and each uses its own names. One sets the medium to email, another to campaign, a third uses its own product name as the source. Before you add anything, send yourself a test email, click a link and read the URL. Then change the platform's defaults to match your table wherever it lets you, and don't paste pre-built UTM links into emails, or the platform will stack its tags on top of yours.
Common UTM mistakes
- UTMs on internal links. A tagged link from your homepage to your pricing page tells GA4 a new campaign started mid-visit. GA4 starts a new session, and the visitor's original source is lost. UTMs go on links that bring people to your site, never on links inside it.
- Mixing Facebook and facebook. Or
Emailandemail, orlinkedinandLinkedIn. Each pair becomes two rows in GA4 and splits the results. The builder lowercases everything, which is why you should use it even for a one-off link. - Putting the medium in utm_source.
utm_source=paid-sociallooks reasonable and breaks channel grouping, because GA4 reads the source as a platform name. Source is where, medium is how. If you can't say which is which, it's the platform name in source and the channel type in medium. - Links that break through a redirect. Tag a URL that redirects, like the http version of a page or a vanity URL, and the redirect can drop the parameters on the way. Always tag the final URL, with https and the trailing slash exactly as the page resolves. Then test in Realtime before the campaign goes live.
- Tagging the wrong things. A tracking parameter on a link in a PDF, a QR code or a sales email signature works well. One on a link inside a Google Ads ad, where auto-tagging already covers it, mostly adds clutter.
Match your UTMs to your campaign names
The campaign value is the one field a builder can't decide for you, and it works best when it mirrors the name already in the ad platform. Our guides to Google Ads naming conventions and Meta Ads naming conventions set out the fields and their order. Keep those names, lowercase them, swap the separators for hyphens, and your GA4 campaign report reads like your ad accounts.
Bottom line: a short table of allowed values, a builder that enforces it and a sheet where every link lives. Set it up in an afternoon and GA4 stays clean for years.
If your tracking already has a year of "Facebook" and "facebook" in it, tell us what you're working with. Cleaning that up and rebuilding the system is work we do often, and a partner will reply within one business day.
Frequently asked questions
What is a UTM builder?
A UTM builder is a small form that takes a page URL and your source, medium and campaign values and assembles them into a correctly formatted tracking link. A good one also enforces your naming rules, so every link follows the same pattern.
Do I need UTM parameters on Google Ads?
Usually not for GA4. Auto-tagging adds a gclid to every click, and GA4 reads the campaign, ad group and keyword from it. Add manual UTMs only when another tool, such as a CRM, needs to read the link.
Should utm_source be facebook or meta?
Use facebook and instagram as separate sources. GA4 recognizes both names for channel grouping, and knowing which placement drove the click is useful. If you use Meta's dynamic site_source_name value, Facebook arrives as fb and Instagram as ig, which GA4 also recognizes.
Why do my UTMs show up as "not set" in GA4?
The most common causes are a redirect that drops the parameters, a session that started before the tagged click, or a parameter name with a typo such as utm_medium spelled wrong. Open the tagged link in a private window and check the Realtime report to see what GA4 received.
Where do I find UTM data in GA4?
Go to Reports, then Acquisition, then Traffic acquisition. Change the primary dimension to Session source / medium or Session campaign. The Realtime report shows the same values within a minute of a click, which is the fastest way to test a new link.
