August 5, 2026 · 4 min read

utm_id: What GA4 Actually Does With It

The top-ranking guide says GA4 ignores utm_id and that cost import requires it. Google's own docs say the opposite on both. What utm_id is really for.

utm analytics strategy

The best-ranking answer to this question is wrong twice

Search for what utm_id does and the dedicated result at the top is about 600 words long. It tells you GA4 doesn't report on utm_id values and that the parameter exists purely for uploading campaign data.

Both halves of that are contradicted by Google's own documentation. And the guides that don't make that particular error tend to make the opposite one, calling utm_id a required field for cost import. It isn't that either.

Three of the most-cited pages on this parameter give three different answers. None of them quotes a Google doc. So let's just quote the docs.

It is not required for cost data import

Here's the campaign data import schema, straight from Google's help centre:

Field Requirement
Campaign source (utm_source) Required
Campaign medium (utm_medium) Required
Date Required
Campaign ID (utm_id) Optional, but highly recommended
Campaign name (utm_campaign) Optional, but highly recommended

Optional. Recommended, sure, and I'd agree with the recommendation. But anyone who's been told they can't import non-Google ad spend into GA4 until they've retrofitted utm_id onto every link they've ever built has been told something false, probably by a tool vendor who'd like to sell them the retrofit.

It is reported

The second error is the more consequential one, because it tells people the parameter is write-only.

GA4 has a dimension called Manual campaign ID, and Google's dimension reference describes it as: "Identifies the manual campaign. Populated by utm_id URL parameter." There's a user-scoped sibling, First user manual campaign ID, with the same wording.

So the values land. They're queryable through the Data API, and they're available for exploration and custom reports.

One honest caveat, because I'd rather flag this than pretend. Where exactly the dimension surfaces in the standard Traffic acquisition report is the one thing here I couldn't settle from documentation, and the three incumbent guides disagree with each other about it. Go look in your own property before you build a report on the answer.

So what is it for

Think of utm_id as a join key, not a label.

utm_campaign is a name a human typed, and names drift. Someone runs "summer-sale", someone else runs "summer_sale_2026", the agency renames it mid-flight, and now your rows have forked. An ID doesn't drift, because nobody is tempted to make it readable.

That matters in two situations, and honestly not much outside them:

  • Importing cost data. You want GA4's sessions to line up with what you actually spent on LinkedIn or a newsletter sponsorship. Google's rule is that the values in your uploaded file "must exactly match the values your users have logged," and an ID is far easier to match exactly than a campaign name three people have edited.
  • Joining to a system outside GA4. If you keep a campaign register, a spreadsheet, a CRM, or a finance sheet with a row per campaign, utm_id is the column that stitches your analytics to it. That's the same argument our UTM spreadsheet governance post makes about registers generally, and utm_id is the field that makes the register machine-readable.

Who should skip it

Most people. Genuinely.

If you're not importing cost data and you're not joining GA4 to an external system, utm_id gives you an extra field to type and an extra thing to get wrong. Our guide to the five parameters doesn't include it, and that omission was correct for the audience it's written for. Email links, organic social, partner links, most of the day-to-day tagging a marketing team does. None of it needs an ID.

Add it when you have something to join to. Not before.

The part that will actually bite you

If you do adopt it, the failure mode isn't syntax. It's drift.

utm_id only works if the value is stable and identical everywhere the campaign appears, including in the file you upload later. Improvise it per link and you've built a second naming problem on top of the one you already have, except this one is invisible because IDs don't read as wrong the way Summer_Sale_FINAL does. So the ID belongs in the campaign register first, and gets copied out to links, never invented at link-build time. Our naming conventions post covers the enforcement side, and a UTM builder that pulls from an approved list beats trusting anyone's memory.

That's the whole parameter. Useful, narrow, and mostly mis-described by the pages that rank for it. If your campaign values are landing as (not set) rather than as the wrong ID, that's a different problem with four documented causes.

← All posts