Free Marketing Taxonomy Guide4-min intro

utm_campaign: The Free-Text Field That Breaks Every Convention

PC

Puru Choudhary

Last updated

utm_campaign drifts first because it’s the only core field with no natural value list. Sources and mediums come from short lists; campaigns get named fresh every week. The fix is a grammar (fixed segments, fixed order, reserved separators, a placeholder for empty slots), generated from picklists, with utm_id as a stable key beside it.

TL;DR

  • utm_campaign drifts first because source and medium come with natural value lists and campaign names don’t.
  • Structure the name: 3 to 5 segments, a fixed order, hyphens between segments, underscores inside them, and _na_ in any empty slot so every string splits the same way.
  • Most conventions break in the last segment: the free text people type after following the structured part.
  • Generate the name from picklists instead of typing it. Keep free text only where a value truly can’t be listed, and fence it with validation.
  • utm_id populates GA4’s manual campaign ID dimensions and is one of two optional, highly recommended keys for cost data import (campaign name is the other). Use it next to a readable name.
  • In GA4’s default channel group, a campaign name containing shop, shopping or cross-network can move traffic into a different channel.

Why utm_campaign Drifts First

The guide to utm_campaign, utm_medium and utm_source tours all three. Put them side by side and one stands out.

utm_source names a place: google, linkedin, newsletter. The list of places you promote is finite and changes a few times a year. utm_medium is tighter still, because GA4’s channel rules match on a small set of medium values and punish anything creative. Both fields have a natural value list. Write it down once and you are most of the way to governed.

utm_campaign has no such list. It describes this piece of work: a launch or a quarter-end promotion. New values are supposed to appear every week. So it’s the one field people type from scratch.

And typing from scratch is where spelling happens.

Here’s one spring promotion after a quarter of hand-tagged links (illustrative values):

spring_sale
Spring Sale
spring-sale-2026
springsale
spring_sale_v2
ss26_promo

Six rows in your campaign report. One campaign. Nobody made a mistake they’d recognize as a mistake, because each person typed a perfectly reasonable name.

This comes up on sales calls again and again. A digital team at a consumer goods company told us the campaign name was their most contentious field: free format, and the naming guidelines they’d written hadn’t settled it. A marketer at a manufacturer put the symptom more plainly. The field was free text, and people spelled the same campaign a little differently all the time.

Half a Convention Still Drifts

Most teams that spot the drift write a convention. Then they find a subtler failure. People follow it, halfway.

A marketing operations team at an insurance company walked us through theirs. Campaign year and line of business came first, standardized. Everything after that went into a free-form field each team filled in by hand, and the email team and the paid team had each built a private structure inside it. Reading their links, we couldn’t tell where the defined segments stopped and the typed part began. Neither could their reports.

Call that last stretch the typed tail: the free-text portion people fill in after they’ve dutifully picked the structured prefix. It does damage in two ways.

It looks compliant. A name that opens with 2026_q4-us- passes every glance, so nobody reads the rest.

It breaks the parse. When the tail contains your separator, a script that splits on hyphens finds seven segments where the convention promised five. At the end of the name, each stray hyphen spawns a column nobody defined. Move the same free text into the middle and every column after it shifts.

That insurance team stated its goal flatly: get rid of the free-form field entirely and force everyone into the taxonomy, because the flexibility was exactly what let people go off script. An investment firm we spoke with had the same problem from another angle. Its campaign name generator lived in a spreadsheet with data validation, but the UTM naming field beside it was free-form. Anyone could type anything in it: capitals, spaces, underscores, hyphens, whatever the day brought.

Give the Campaign Name a Grammar

Before you can generate a campaign name, decide what a valid one looks like. Four decisions.

Segments. Pick the dimensions the name carries, such as period, region, objective, product and a short descriptor. Three to five is the working range. Past five, names get hard to read and people start skipping positions. If you need more dimensions than that, the taxonomy structures chapter of our marketing taxonomy guide compares key-value names (the guide’s pick for most teams past about ten link builders) and opaque IDs, which carry more dimensions without adding positions.

Order. Fix it and don’t reshuffle it. In a positional name, position is meaning. Report filters and warehouse parsing both assume the third segment is always the objective.

Separators. Use two, with separate jobs. Hyphens go between segments; underscores join words inside a segment. holiday_launch is one segment and holiday-launch is two. Split on hyphens and every segment comes out whole. Our free naming convention template flips the roles: underscores between segments, hyphens only inside the last one. That works too. Pick one arrangement and hold it everywhere.

Placeholders. Every segment appears in every name, even when it doesn’t apply. Reserve a value that can never be a real one, like _na_ (plain na collides with North America in a region slot). A brand campaign with no specific product still gets a product slot.

Put together (illustrative):

2026_q4-us-conversion-running_shoes-holiday_launch
2026_q4-global-awareness-_na_-brand_film

Both split into exactly five pieces. Drop the _na_ from the second and it splits into four, and every tool downstream now believes brand_film is a product.

Never let a person type a separator.

The moment someone can put a hyphen inside a segment value, your parse depends on their attention span that afternoon. A single back-to-school in the product slot turns a five-segment name into seven. A report built on segment positions records the product as back, the descriptor as to, and pushes school and the real descriptor into columns nobody defined. Nothing errors. The numbers just stop meaning what the column says. The UTM naming conventions guide sets the same rule.

Stop Typing the Name

A written grammar still depends on people applying it correctly every time. The durable fix is to make the name an output instead of an input.

In a governance model, each segment becomes its own field. Period, region, objective and product are dropdowns fed by picklists. The campaign name is a concatenated field: the model joins the segment values in the defined order and inserts the separator itself. Nobody types a hyphen, so nobody types a wrong one.

That is how Terminus, the marketing taxonomy governance platform, builds campaign names. A picklist can work three ways:

  • Static picklists hold lists you author, like regions.
  • A hierarchical picklist is a static list linked to a parent, so the parent choice narrows the child options. Pick a line of business and only that line’s campaign types appear, which is the rule the insurance team above said their existing tool had no way to express.
  • On the Business plan, an automated picklist fills itself from records already created. A global team assembles approved campaign names from its own fields (region, initiative, fiscal year), and those names become the Campaign dropdown on every local team’s form. Local marketers pick the campaign and add what their channel needs. They never retype it.

The rules live on the model. Validation lowercases values and turns spaces into underscores on the way in, limits the characters a field accepts, and can require a value to be unique across every record. Changes happen in a draft and reach every workspace when you publish, so the team keeps tagging against the current convention while you rework it.

Every way in hits the same checks: the Quick and Form builders, the Grid for hundreds of rows, a CSV round trip, and the API, which runs the same validation as the form. A script can’t write a campaign name the form would have refused.

To see a concatenated campaign field before changing anything of your own, the no-signup playground runs the real builder on sample models, and the template library has campaign structures you can start from.

Should You Kill the Free-Text Segment?

The insurance team wanted zero free text. Whether you can get there depends on one question: can the values be listed?

If a segment’s values can be listed, even as a long list, make it a picklist. Products, regions, objectives, fiscal periods, event names from a calendar: all listable. Most “free text” turns out to be a list nobody got around to maintaining. A picklist needs an owner who adds a value the same day it’s asked for, or people route around it.

If the value truly can’t be known ahead of time (a one-off descriptor, a creative concept, a partner name confirmed the week of launch), keep exactly one free-text segment and fence it:

  • Put it last, so the typed tail can’t shift the segments you filter on.
  • Lowercase it and convert spaces automatically.
  • Allow letters, digits and underscores only. That keeps your hyphen out by construction.
  • Set a length limit. A marketer at a medical device company told us they hadn’t set one, trusting people to know better than to type a full sentence. That holds until a rushed launch.
  • Treat the segment as a label. Nothing in reporting should filter on it.

A nonprofit team asked us about a middle road worth copying: a dropdown with an Other option, where choosing Other opens a text field. Give that field its own character rules. The common case gets picked. The exception gets typed, fenced, and stays visible as an exception, which tells you which values belong on the list next quarter.

Our view: zero free text in any segment you report on, and at most one fenced segment for everything else.

Campaign IDs: A Second Key, Not a Replacement

The other escape from name drift is to stop relying on the name to identify the campaign.

GA4 reads a dedicated parameter for that. Google’s URL builder documentation describes utm_id as the campaign ID, used to identify a specific campaign or promotion, and tells you to use the same IDs you use when uploading campaign data. GA4’s dimension reference lists utm_id as the source of Manual campaign ID, Session manual campaign ID and First user manual campaign ID. In cost data import, source, medium and date are required, and campaign ID and campaign name are both listed as optional but highly recommended. Google requires imported values to match your logged values exactly, so imported cost attaches to one spelling of the name, and every other variant shows sessions with no cost beside them.

That makes utm_id good at the one thing names are bad at: staying the same. Rename holiday_launch to holiday_launch_v2 halfway through and the name splits your history in two. An ID like c0417 (illustrative) doesn’t care what the campaign is called, so a report broken out by the ID dimension keeps the history whole.

That indifference is also why an ID alone falls short. c0417 tells a person scanning a campaign report nothing. Teams that swap the readable name for an opaque ID rebuild the meaning in a lookup table. That’s a legitimate architecture, the one the taxonomy guide calls Opaque ID, with a real cost: a table someone maintains and a join someone runs every time a question comes up.

Two teams we spoke with show both sides of it. A bank’s marketing team created the campaign ID first, before anyone had settled what to track, because lines of business needed a working URL fast. The details got filled in after launch, against a link that never changed. Another bank drew the line from the other direction: one ID could legitimately cover several campaign names, so IDs and names had to stay connected in whatever tool built the links.

For most teams the answer is both. Keep utm_campaign readable and generated from picklists. Add utm_id as a stable key, unique per campaign, and send the same value wherever you import costs. In a governance model, put the uniqueness rule where the campaign is created. Every link in that campaign repeats the same ID, so the same rule on the link record would refuse the second link.

Some Words in a Campaign Name Change the GA4 Channel

GA4 doesn’t treat campaign names as labels only. Its default channel group reads them.

Google’s default channel group rules for manual traffic include three campaign-name conditions:

  • Cross-network: the campaign name contains cross-network. That is the whole rule. No source or medium condition.
  • Paid Shopping: the source is a known shopping site, or the campaign name matches ^(.*(([^a-df-z]|^)shop|shopping).*)$, and the medium matches the paid pattern (cpc, ppc, paid_social and the like).
  • Organic Shopping: the source is a known shopping site, or the campaign name matches that same regex. No medium condition.

GA4 places traffic in the first channel whose definition it matches, and the manual-traffic list puts Paid Shopping above Paid Search and Paid Social, and Organic Shopping above Organic Social. So a paid social ad in a campaign called holiday_shop reports as Paid Shopping, and the organic posts and newsletters in that campaign report as Organic Shopping, because that rule has no medium condition and sits above Organic Social and Email. Channel definitions aren’t case sensitive, so Shop counts too. workshop is safe, because the regex ignores shop after any letter except e. But a separator counts as a boundary, so a value like shopper_marketing or shopify matches wherever it sits in the name.

The governance fix is small. Keep cross-network, shopping and any word that starts with shop out of picklist values, wherever the word sits, and check the finished name as well, since two segments can join into a match. Ban the same words with a pattern on any free-text segment. The fields guide covers the rest of GA4’s channel rules.

Where to Start

Export last quarter’s distinct utm_campaign values and sort them alphabetically. Near-duplicates land next to each other, and each cluster shows you a segment people were trying to express without a list to pick from.

Those clusters are your first picklists. Whatever’s left is your typed tail: list it or fence it.

FAQ

Why does utm_campaign get messier than utm_source or utm_medium?

Source and medium have natural value lists: a finite set of places and a handful of channel types. Campaign names are new every week, so people type them from scratch, and every person spells a new name a little differently.

What separator should I use in a structured campaign name?

Use hyphens between segments and underscores to join words inside a segment, as in 2026_q4-us-conversion-running_shoes-holiday_launch. Splitting on hyphens then returns every segment whole. The rule only holds if no segment value can contain a hyphen, which is why the builder should insert separators instead of people.

What goes in a segment that doesn’t apply to a campaign?

A reserved placeholder such as _na_. Every name keeps every segment, so every name splits into the same number of pieces. Skip the placeholder and the segments after the gap shift into the wrong positions.

How many segments should a campaign name have?

Three to five. Past five, names become hard to read and people start skipping positions. If you need more dimensions, move to key-value names or an ID with a lookup table rather than a longer positional string.

Should I remove free text from campaign names entirely?

From every segment you report on, yes: if the values can be listed, use a picklist. If one value genuinely can’t be known ahead of time, keep a single free-text segment at the end with lowercase conversion, a restricted character set, a length limit and no reporting built on it.

Does utm_id replace utm_campaign in GA4?

No. utm_id populates GA4’s manual campaign ID dimensions and is one of two optional, highly recommended keys for cost data import (campaign name is the other), while utm_campaign populates manual campaign name dimensions such as Session manual campaign name. An ID stays stable through renames but means nothing to someone reading a report, so use both.

Why is my paid social campaign showing up as Paid Shopping?

The campaign name probably contains shop or shopping. GA4’s Paid Shopping rule matches on the campaign name plus a paid medium, and it sits above Paid Social in the channel list. A campaign name containing cross-network has a similar effect, sending traffic to Cross-network.

How do I find the near-duplicates I already have?

Export the distinct utm_campaign values for a recent period and sort them alphabetically. Variants of the same name cluster together, and those clusters show which segments your convention needs picklists for.

Terminus helps you and your team be consistent in UTM tracking

Try Terminus risk-free for 21 days. Cancel anytime with 1 click.