Free GA4 tool. Campaign tagging
UTM Builder and GA4 Channel Checker: Free, Runs in Your Browser
Built by Ram Kr Shukla, SEO and growth consultant, Google Analytics and Google Ads certified.
Private by design: nothing is uploaded. Your links, any CSV you choose and your saved naming rules are processed locally in your browser.
Build a UTM link and see its GA4 channel
The prediction updates as you type. Switch to Bulk CSV to check a whole sheet of links, or a GA4 source / medium export.
1. The page the link opens
2. Campaign tags
Paste a CSV or choose a file
Three shapes work. A sheet with a url column plus utm_source, utm_medium and utm_campaign (utm_content, utm_term, utm_id, utm_source_platform and internal are optional). A url column of links that are already tagged. Or a GA4 Traffic acquisition export by Session source / medium. Comma, tab or semicolon separated. Up to 10,000 rows.Your naming convention (saved in this browser)
List the sources and mediums your team may use, one per line or comma separated, plus your own domains. Anything outside the lists gets flagged in both modes. Your domains also catch tags on internal links.
The sample data is a made up store, Acme Trail Co at example.com. Tagging is one part of a wider attribution clean-up, covered in why your organic traffic numbers are lying to you.
Quick answer
This free UTM builder adds utm_source, utm_medium, utm_campaign and the optional tags to any page URL, then predicts which GA4 default channel group the click will land in. It runs Google’s published channel rules in order, against Google’s full list of 819 sources, and flags three kinds of trouble: tags that end up in Unassigned, paid links that GA4 will file as organic, and capitals or spaces that split one source into two report rows. If you tag email, social and ad links as a marketer, an agency or an analyst, it helps you get the channel report right the first time.
Most UTM builders stop at the link. That’s the easy part. GA4 doesn’t read your tags the way you meant them. It runs every source and medium through 19 channel rules, top to bottom, and drops the session into the first one that fits. Get one word wrong and a paid campaign shows up as Organic Social. Or a newsletter vanishes into Unassigned.
This page builds the link and runs those rules on it before anyone clicks. The rules come from Google’s [GA4] Default channel group help page, and the source lists come from the sources and categories file Google links from that page, captured live: 129 search sites, 592 social sites, 52 shopping sites and 46 video sites.
Bad tags are one of the quieter ways your organic number gets polluted. My guide on why your organic traffic numbers are lying to you covers the wider mess (paid clicks counted as organic, parameters that rewrite the source, campaign tags on internal links). This tool handles just the tagging part.
How to Use the UTM Builder
You need the page URL and two minutes. For bulk, add a sheet you can save as CSV.
Sources for those steps: Google’s help on URL builders and campaign parameters, its default channel group definitions and its page on sharing and exporting reports. Google’s own Campaign URL Builder makes the same links, but it won’t predict the channel or check a list.
How to Read the Results
Three labels. A link’s status is the worst label it collects.
- Fault. The link lands in Unassigned, in a channel that contradicts what it is (an ad filed as organic), or it’s a tagged internal link. Fix it before it goes out.
- Check. The channel works, but something will cost you later: capitals that split one row into two, a source GA4 doesn’t recognise, or a campaign name that quietly changes the channel.
- Info. Context. What the builder did to your URL, or how a platform setting changes the picture.
The 19 rules, in the order GA4 checks them
Google’s custom channel groups page says traffic goes into the first channel whose definition it matches. The default group lists its rules for manual traffic in the order below, and the checker applies them in that same order. Case doesn’t matter. Google says channel definitions aren’t case sensitive, so the checker lowercases values before it matches anything.
| # | Channel | Google’s rule for UTM traffic | Where tags trip |
|---|---|---|---|
| 1 | Direct | Source exactly (direct), medium (not set) or (none) | You won’t hit this with UTMs |
| 2 | Cross-network | Campaign name contains cross-network | Any campaign with cross-network in its name, from any source |
| 3 | Paid Shopping | Source on the shopping list, or campaign name matches ^(.*(([^a-df-z]|^)shop|shopping).*)$, and medium matches ^(.*cp.*|ppc|retargeting|paid.*)$ | A cpc campaign called shop_launch lands here, even from Facebook |
| 4 | Paid Search | Source on the search list, and the paid medium pattern | google_ads isn’t on the list. google is |
| 5 | Paid Social | Source on the social list, and the paid medium pattern | insta, x and x.com aren’t on the list |
| 6 | Paid Video | Source on the video list, and the paid medium pattern | youtube with cpc or cpv |
| 7 | Display | Medium is display, banner, expandable, interstitial or cpm | display_ads isn’t on the list |
| 8 | Paid Other | Paid medium pattern, source on none of the lists | GA4 knows it’s paid, not which kind |
| 9 | Organic Shopping | Source on the shopping list, or campaign name matches the shop pattern | Checked before Social and Email, so a newsletter called summer_shopping lands here |
| 10 | Organic Social | Source on the social list, or medium is social, social-network, social-media, sm, social network or social media | social_media with an underscore isn’t listed |
| 11 | Organic Video | Source on the video list, or medium contains video | video_ads lands here as organic |
| 12 | Organic Search | Source on the search list, or medium exactly organic | organic_search only works with a search engine source |
| 13 | AI Assistant | Medium exactly ai-assistant | GA4 sets this itself for referrers on its AI list |
| 14 | Referral | Medium is referral, app or link | referal, with one r, falls through |
| 15 | Source or medium is email, e-mail, e_mail or e mail | newsletter isn’t on the list | |
| 16 | Affiliates | Medium exactly affiliate | affiliates, plural, falls through |
| 17 | Audio | Medium exactly audio | podcast falls through |
| 18 | SMS | Source or medium exactly sms | text falls through |
| 19 | Mobile Push Notifications | Medium ends with push, or contains mobile or notification, or source exactly firebase | mobile_banner lands here |
| Unassigned | Nothing above matched | Where most tagging mistakes end up |
Source: Google’s default channel group page and its list of sources and categories. Two readings are mine. Google writes the shopping rules without brackets, so the checker reads them as (shopping source or shop campaign) and a paid medium. That’s the only reading that keeps Paid and Organic Shopping apart. And Google calls the social list a regex list but publishes plain names, so the checker matches whole values: m.facebook.com counts, facebook_ads doesn’t.
What to do about each flag
- Unassigned. Change the medium to one Google lists: newsletter becomes email, affiliates becomes affiliate, social_media becomes social. The flag tells you which value works and the channel it’d land in.
- An ad in an organic channel. Usually it’s a medium like social_paid or remarketing that misses the paid pattern, or a google link with no medium. Start paid mediums with paid, or use cpc.
- Paid Other. The medium says paid but the source isn’t on Google’s lists, so use the listed name: instagram for insta, twitter for x.com. Threads and Bluesky aren’t listed at all. For those, a custom channel group is the only fix.
- Campaign name decides the channel. Rename campaigns containing shop, shopping or cross-network unless they really are shopping or cross-network campaigns. Watch the edges, too: eshop matches and workshop doesn’t, because of the [^a-df-z] in Google’s pattern.
- Capitals and spaces. The channel still comes out right, but your report splits, because Google says utm_source=google and utm_source=Google are different values. Click Tidy case and spaces: it lowercases everything and swaps spaces for hyphens. Why hyphens? Google lists social-media and e-mail but not social_media.
- Tagged internal link. Remove the tags. To measure banners and promo blocks, use a click event, or GA4’s select_promotion event from Google’s recommended events.
- Click IDs in the page URL. Delete gclid, fbclid, msclkid and the like from the base URL. Platforms add a fresh one to every click, and Google says that when a gclid is present, auto-tagged values win over your utm_source and utm_medium.
Worked example: the Acme Trail Co sample
Open the Bulk CSV tab and click Load sample data. You’ll get 15 links for a made up outdoor store at example.com. The checker puts 3 of them in Unassigned, gives 6 a Fault and 6 a Check, and passes 3 clean: the Facebook ad, the blog referral and the text message.
The faults are the interesting part.
- Row 3, Facebook / social_paid. Predicted Organic Social. The word paid comes second, so the paid pattern misses, and facebook is on the social list. That’s a paid campaign reported as unpaid social.
- Row 6, google with no medium. Predicted Organic Search, because google is on the search list and nothing else is set. If that link sits in an ad, it inflates organic. That’s exactly the pollution the attribution guide describes.
- Row 14, youtube / video_ads. Predicted Organic Video. The medium contains video, but it doesn’t start with paid or contain cp.
- Rows 4, 9 and 15. Unassigned, because newsletter, affiliates and qr_code aren’t values Google lists. The first two are one word away: email lands in Email and affiliate lands in Affiliates. The QR code has nowhere to go, since there’s no offline channel.
Then the checks. Row 2 uses insta, the short name Google’s own UTM best practice table suggests for Instagram. It lands in Paid Other anyway, because the source list only has instagram, instagram.com, l.instagram.com and ig. Row 11 has the same problem with x.com. Row 5 is an email, but its campaign is called summer_shopping_edit, so the Organic Shopping rule grabs it before the Email rule is reached. Row 12 is a homepage banner with tags on it. And row 10, linkedin / Paid Social, lands in Paid Social as intended but will sit in its own row, apart from paid_social.
Fix the five faults that have a listed fix, swap the two source names and rename the row 5 campaign. Now 13 of the 15 links land where the team meant them to. The other two are honest calls you’ll have to make: the homepage banner should lose its tags, and the QR code needs a decision about which channel offline belongs in.
Once the tags are fixed, two things follow. Old sessions keep the channel they were given, so a month that mixes old and new tags will show Email jumping and Unassigned falling. That’s a labelling change, which why GA4 comparisons show fake growth after a tracking fix explains. And if you report organic in Looker Studio, filter on Session default channel group as set out in the Looker Studio SEO dashboard guide. That only works when your tags put traffic in the right group.
AI assistants are the newest wrinkle. You can’t tag a link ChatGPT cites, and Perplexity isn’t named in Google’s AI list. Measuring ChatGPT and Perplexity referrals in GA4 shows the custom channel group that catches them. If the channels look right but your ecommerce numbers don’t, run the GA4 funnel checker next. Then go back to the attribution clean-up checklist for the bits tagging can’t fix, like bots and self-referrals.
Limits of This Checker
It predicts. GA4 decides. Here’s where the two can differ.
- It only knows the manual traffic rules. Google Ads, Display and Video 360, Campaign Manager 360, Search Ads 360 and Merchant Center traffic is classified from integration data like ad network type and campaign type. A UTM can’t send that.
- The lists move. Google says its definitions may change as the market does. The checker carries the list as captured live from Google’s help page, so a source Google adds later won’t be on it until this page is updated.
- Whole-value matching is my reading. Google calls the social list a regex list but publishes plain names. If GA4 matches more loosely than that, a few sources the checker calls Paid Other could land in Paid Social.
- It can’t see referrers. Untagged clicks are classified from the referring site, and GA4’s AI Assistant detection works from the referrer too. The checker only reads what’s in your link.
- Your property may use its own channels. Reports built on a custom or primary channel group use your own rules. This checker only knows Google’s default.
- One session, one source. Google says GA4 doesn’t start a new session when a new campaign shows up mid-visit (campaigns and traffic sources). The prediction is about the session the click starts.
- Bulk tops out at 10,000 rows per run. The screen shows the first 1,000 in your chosen sort order. The download has the lot.
UTM Builder and GA4 Channel FAQ
Why is my UTM traffic showing as Unassigned in GA4?
Because the source and medium pair doesn’t match any of GA4’s 19 default channel rules. The usual culprits are mediums Google doesn’t list, like newsletter, affiliates, social_media or qr_code, and links with no utm_medium at all. Change the medium to a listed value such as email, affiliate or social, and new sessions land in a channel. Sessions already recorded keep their old label.
Are UTM parameters case sensitive in GA4?
For reports, yes. Google says utm_source=google and utm_source=Google are different values, so they show up as two rows. For channel grouping, no: Google says channel definitions aren’t case sensitive, so Facebook / CPC and facebook / cpc both land in Paid Social. Use lowercase anyway so your rows don’t split.
Should I use cpc or paid_social for Facebook ads?
Either works. GA4’s paid pattern matches any medium containing cp, ppc or retargeting as the whole value, and anything starting with paid. With utm_source=facebook, both cpc and paid_social land in Paid Social. Putting paid second, as in social_paid, breaks it, and so does remarketing.
Is email or e-mail correct for utm_medium?
Both are. Google’s Email rule accepts email, e-mail, e_mail and e mail, in the source or the medium. newsletter isn’t on that list, so utm_medium=newsletter lands in Unassigned unless the source is one of those four. One trap: a campaign name containing shop or shopping sends email traffic to Organic Shopping, because that rule is checked first.
Should I put UTM parameters on internal links?
No. Google says GA4 doesn’t start a new session when it sees a new campaign mid-visit, but the new values attach to the events that follow and feed event-based attribution. So a tagged homepage banner can take credit for key events that search, email or ads brought in. Track banners with a click event or GA4’s select_promotion event instead.
What does utm_source_platform do in GA4?
It names the platform that bought or managed the traffic, such as Search Ads 360 or Display and Video 360, and fills the Source platform dimension. Google’s note on traffic source dimensions says cross-channel reports still show Manual there for now. The checker predicts with the manual traffic rules either way.
Do I need UTM parameters if Google Ads auto-tagging is on?
Not for the channel. With auto-tagging on, GA4 takes source, medium and channel from the gclid and ignores your utm_source and utm_medium, while utm_content and utm_term still fill Manual ad content and Manual term. Google does suggest adding UTMs as a fallback for cases where the gclid can’t be used, such as when ad_user_data consent is denied.
Does this UTM builder upload my links anywhere?
No. Everything runs in your browser. The links you type, any CSV you choose and the naming convention you save stay on your device. The convention sits in this browser’s local storage until you clear it.
Channel report still doesn’t add up?
I audit GA4 attribution end to end: which tags land where, what’s sitting in Unassigned and why, and which naming convention your team should use. Then I write it down so the next campaign doesn’t undo it.
GA4 Conversion TrackingRead the attribution guideMore free tools that run in your browser are on the SEO tools page. For reading channel numbers once they’re clean, see how to read an e-commerce SEO report without being fooled.
Built by Ram Kr Shukla
SEO and growth consultant with 20+ years in the field across 50+ brands, working as a consultant or Fractional Chief Digital Officer. Google Analytics and Google Ads certified. Works daily in GA4, Search Console and Looker Studio.




