Sit in any monthly marketing review and you'll watch the same argument happen. Google Ads reports 40 conversions. Meta reports 38. The CRM shows 51 new leads. Total actual demo requests that month: 44. Every platform graded its own homework, every platform gave itself an A, and the numbers don't reconcile because they were never going to. The only referee you control is your own analytics, and your analytics can only referee what your links tell it. That's the whole job of UTM parameters. This guide covers the part most write-ups skip: what GA4 actually does with the tags once the click lands, and why so much correctly-intentioned tagging still produces garbage reports.
What UTM Parameters Actually Are
Five short tags appended to a URL. That's it. The name is a fossil: Urchin Tracking Module, from Urchin Software, the analytics company Google bought in 2005 and turned into Google Analytics. The format outlived the company, the product, and two full rewrites of Google Analytics itself.
https://www.example.com/demo
?utm_source=google
&utm_medium=cpc
&utm_campaign=2026-q3-demo-signups
&utm_term=marketing-analytics
&utm_content=headline-aClick that link and GA4 records the session as google / cpc, files it under Paid Search, and credits the 2026-q3-demo-signups campaign with whatever happens next. Skip the tags and the session lands in direct or unassigned, at which point the ad platform that placed the link becomes the only witness to its own performance.
| Parameter | Required? | What it identifies | Examples |
|---|---|---|---|
| utm_source | Yes | The platform, site, or list sending the traffic | google, facebook, newsletter |
| utm_medium | Yes | The channel type. Drives GA4 channel grouping | cpc, email, paid-social |
| utm_campaign | Yes | The promotion or initiative the link belongs to | 2026-q3-product-launch |
| utm_term | Optional | Paid keyword or audience segment | marketing-analytics |
| utm_content | Optional | The creative or placement variant | hero-cta, variant-b |
There's technically a sixth, utm_id, used for data imports. You'll go years without needing it.
Source and medium travel as a pair. GA4 reads them together, not separately, and that pairing is where most tagging goes wrong, so it gets its own section.
How GA4 Decides What Channel You Are
GA4 does not read your campaign names. It runs your source and medium through a rule set: source gets checked against Google's category lists (search sites, social sites, video sites), medium gets checked against exact values and regular expressions. The paid rule is literally this regex:
^(.*cp.*|ppc|retargeting|paid.*)$Which is why cpc, ppc, and paid-social all register as paid traffic, and why paidsocial without the dash does too. The system is more forgiving than its reputation suggests. The problem is what happens when a value misses.
It does not fail loudly. Say someone on the team tags a Facebook campaign with fb-ads as the medium. GA4 sees a social source and a medium that matches no paid rule, shrugs, and files the whole campaign under Organic Social. Your paid spend now inflates your organic numbers. No error, no warning, and the report looks completely plausible, which is exactly why nobody catches it until someone asks why organic social suddenly doubled in March.
The louder failure is rarer: a combination that matches nothing at all, like a partner mailing tagged newsletter / newsletter instead of newsletter / email, drops into Unassigned, where at least the bucket name admits something went wrong.
| GA4 channel | utm_source examples | utm_medium |
|---|---|---|
| Paid Search | google, bing | cpc |
| Paid Social | facebook, instagram, linkedin, tiktok | paid-social |
| Organic Social | facebook, linkedin, instagram | social |
| newsletter, crm | ||
| Display | google, dv360 | display |
| Paid Video | youtube | paid-video |
| Affiliates | partner | affiliate |
| SMS | sms-campaign | sms |
One more trap: dimension values are case-sensitive in reports. Tag half your links Facebook and half facebook and your source report now has two Facebook rows that will never be merged. Our free UTM builder lowercases everything automatically and shows you, as you type, which GA4 channel the source and medium pair will land in. We built that live check because we kept finding the fb-ads problem in client audits, and it's a lot cheaper to catch at the moment of typing.
Where the Data Shows Up (and Where It Hides)
Tagging is pointless if you never open the right report, and GA4 splits campaign data across two reports that answer different questions.
Traffic acquisition is session-scoped. Each session gets credited to whatever source, medium, and campaign started it. This is your day-to-day report. Switch the primary dimension to Session source / medium or add Session campaign and your tagged campaigns line up next to their sessions and conversions.
User acquisition is first-touch, forever. A user who first arrived through a March webinar shows up under that webinar in this report even when your October email drove this week's purchase. Compare the two reports for the same campaign and you can see acquisition and reactivation as separate stories. Most teams never do; it's a genuinely underused trick.
And then there's the data you tagged but will never see by accident: utm_term and utm_content appear in no default report. None. You have to add Session manual term and Session manual ad content as dimensions yourself, in a report or an Exploration. We audited an account last year that had been dutifully tagging creative variants in utm_content for six months. Nobody on the team had ever seen the data. It was all there, sitting behind a dimension picker no one had opened.
The last report worth knowing is Realtime, for exactly one purpose: click your own tagged link before the campaign ships and watch the session arrive with the right source and medium. Thirty seconds. A mis-tagged link in an email blast to 40,000 people cannot be recalled, and neither can the month of Unassigned data it produces.
When You Tagged It Right and GA4 Still Says Direct
Eventually it happens to everyone: the link was tagged correctly, and the traffic shows up as direct anyway. Before blaming GA4, check the delivery path, because the parameters probably never arrived. In rough order of likelihood:
- A redirect ate the query string. Link shorteners, vanity URLs, http-to-https hops. Open the final link in an incognito window and look at the address bar on the landing page. If the utm values aren't there, they aren't in GA4 either.
- Consent got there first. A visitor who declines analytics cookies may never fire the tag that records the session. Depending on your Consent Mode setup the visit gets modeled or lost. Campaigns into strict-consent regions under-report; that's a measurement floor, not a tagging bug, and no amount of re-tagging fixes it.
- The app mangled the link. In-app browsers, email clients that rewrap links through their own click trackers, single-page apps that drop query strings on route changes. When one specific placement chronically under-reports, click it on the actual device and watch what lands.
The three failure signatures each mean something different, and reading them right saves hours: direct means the parameters never arrived. Unassigned means they arrived and matched no channel rule. (not set) on a campaign dimension usually means the session carried some campaign signal but not that particular parameter.
Getting the Campaign Name Into Your CRM
GA4 can tell you which channels drive conversions. It cannot tell your sales team which campaign produced the lead they're about to call, because that answer lives inside analytics and dies there unless you capture it at the form.
The pattern is old and reliable: hidden fields on the form, filled by a small script from the URL parameters or a first-touch cookie, written into HubSpot or Salesforce with the submission. Every contact record carries its origin from day one.
The design decision teams skip: does that hidden field hold the first touch or the last? A lead who found you through a LinkedIn ad and converted six weeks later from a newsletter looks like a paid win in one version and an email win in the other. Pick deliberately, document the choice, and expect GA4 to disagree with the CRM anyway, because GA4 runs an attribution model across every touch it saw while your form stored one snapshot. Neither number is wrong. Reconciling them into a single revenue story your CFO signs off on is precisely the kind of work our marketing analytics and attribution practice exists to do.
Stop Typing These by Hand
Nobody managing real volume builds campaign URLs one at a time, and the platforms know it.
- Google Ads. Leave auto-tagging on. The GCLID carries richer click data than manual tags, and it wins by default; manual UTMs only override it if you flip a property setting most people should leave alone. Manual tags still belong on final URLs so tools other than GA4 can read attribution, just keep the values consistent with your convention.
- Meta. Dynamic parameters, not typed values:
utm_campaign={{campaign.name}},utm_content={{ad.name}}. The values then always match the live campaign structure, including every rename some media buyer makes at 11pm. Meta appends its ownfbclidalongside regardless. - Email platforms. Mailchimp, Klaviyo, and HubSpot can append UTMs automatically from merge variables, which deletes the per-send typo risk entirely. Our email and automation builds ship with this wired to the naming convention on day one.
- Print and offline. A QR code wrapping a tagged URL turns a conference banner into a measurable channel. Source names the placement, medium is
offline, and the scan shows up in the same campaign report as everything else.
The Convention Is the Product
A builder solves syntax. It cannot solve six months of "FB", "facebook", and "Facebook_Ads" accumulating as three separate sources, which is a people problem, and people problems need rules with owners:
- Lowercase, dashes, no spaces. No exceptions, because the exceptions are where the duplicate rows come from.
- A short approved list for source and medium values, with a named owner. Adding a value is a decision someone makes on purpose, not something that happens at 6pm before a send goes out.
- Campaign names on a fixed pattern that stays sortable a year later:
Pattern: [year]-[objective]-[audience]
Examples: 2026-demo-signups-smb
2026-q4-holiday-retargeting
2026-webinar-analytics-enterprise- Put the rules where links get built. A convention in a wiki nobody opens governs nothing; the approved values belong inside the builder or the email template your team actually touches.
- When the default channels genuinely don't fit your business, GA4's custom channel groups let you define your own grouping over the same source and medium data. A Partnerships channel, a Marketplace channel. They change how reports group traffic, but they cannot conjure values that were never sent.
The Part Tagging Can't Do
Do all of the above and you get trustworthy session data: right campaign, right channel, right report, lead records that know where they came from. What you don't get is an answer to the fight from that monthly review, because when a buyer touches six channels before converting, deciding which spend deserves the credit is a modeling problem. Tags are evidence. They are not the verdict.
The verdict layer, ad platform and CRM data unified in one warehouse with multi-touch attribution calibrated against closed revenue, is what our marketing analytics practice builds, with the same tagging discipline running through our paid media management underneath it. Start with the free UTM builder and a one-page convention your team actually follows. Clean evidence first. Verdicts after.
FAQs
Frequently Asked Questions
UTM stands for Urchin Tracking Module, named after Urchin Software, the analytics company Google acquired in 2005 and turned into Google Analytics. The parameter format survived every generation of the product and remains the standard for campaign tagging in GA4.




