Free Marketing Taxonomy Guide4-min intro

One UTM Taxonomy Across Brands, Regions and Business Units

PC

Puru Choudhary

Last updated

Run one taxonomy with two layers. Source, medium and the campaign name format are global, with one list and one owner. Content values, languages and local campaign descriptors are local, owned by the teams that use them. Brand, region and country come from hierarchical picklists. The global team publishes the campaign names local teams pick from. An acquired company’s old values get mapped in reporting, and its new links start on the standard.

TL;DR

  • Keep the global layer small: utm_source, utm_medium and the format of the campaign name. Everything a central report groups by lives here.
  • Hand local teams the values only they understand, such as content variants, languages and local descriptors, inside global character rules.
  • Put brand, region and country in hierarchical picklists so impossible combinations never reach a dropdown.
  • Let the global team name campaigns once. Approved names become the campaign dropdown on every local form.
  • For an acquisition, map old values to the standard in reporting, pick a cutover date for new links, and leave history alone.
  • Name an owner for every list. Global lists belong to the center, local lists to the regions.

Every Unit Tagging Its Own Way Produces a Report Nobody Can Read

Here is the setup we hear about on sales calls with multi-division companies, over and over. Each division built its tagging habits independently, often in a spreadsheet nobody outside that division opens. All of them send traffic to the same website and report into one analytics property. Nobody at the center can say what half the values mean.

The damage shows up in the one report that matters to you, the consolidated one.

GA4 treats parameter values as case sensitive, so utm_source=Facebook from one brand and utm_source=facebook from another become two rows. A region that writes DE and a region that writes de produce two Germanys. Each spelling is internally consistent. Together they’re noise.

Channel reports hide some of it. GA4’s default channel definitions aren’t case sensitive, so the channel column can look fine while the source and medium columns underneath it fragment. That’s the worst kind of broken: the summary looks healthy and the drill-down lies.

The fix isn’t to make every unit tag identically. Units have real differences, and a taxonomy that pretends otherwise gets abandoned for a local spreadsheet within a quarter. The fix is to decide, explicitly, which parts are shared and which parts aren’t.

If you haven’t written the convention itself yet, start with how to define and enforce UTM naming conventions. This page is about stretching one convention across many teams.

Make the Global Spine Small and Non-Negotiable

Call the shared part the global spine: the fields every brand, region and business unit uses with the same values and the same format. It needs to be small enough that nobody has a good reason to break it, and firm enough that nobody can.

It holds the fields a consolidated report can’t survive without.

utm_source. One list for the whole company. facebook is facebook in every market. A local team that needs a regional publisher asks for it to be added to the global list, and every other team gets it too.

utm_medium. Same rule, higher stakes. GA4 decides the channel largely from source and medium together, and the Paid Social rule wants a social source with a medium matching ^(.*cp.*|ppc|retargeting|paid.*)$. Now watch what happens when one region invents its own medium. Their team tags utm_source=facebook&utm_medium=social_paid. The medium doesn’t start with paid and contains no cp, so the Paid Social rule misses. The source is a known social site, so the session lands in Organic Social. That region’s paid social traffic disappears from Paid Social, and the global team spends a month asking why organic social looks so good there.

The campaign name format. The values inside utm_campaign can vary by campaign. The shape can’t. Segment order, delimiters and casing are global, so any report can split the name the same way. A five-segment structured name looks like this:

utm_campaign = emea-de-alder-spring_launch-fy27
               region-country-brand-initiative-fiscal_year

Hyphens separate segments, underscores join words within a segment, everything is lowercase. A global campaign with no single country uses the filler _na_ in that position: emea-_na_-alder-spring_launch-fy27. Skip the filler and every segment after the gap shifts one place, which is exactly how a brand ends up reported as a country.

Five segments is about the ceiling for a positional name, and positional only holds up when a builder assembles every name, because someone typing by hand eventually skips a segment. If your spine needs more dimensions, or people still type names, move to key-value pairs, which our guide recommends for most multi-region teams, or an opaque ID. The trade-offs are laid out in the taxonomy structures chapter of our guide.

Here’s the split in one place:

LayerFieldsWho can change it
Globalutm_source, utm_medium, campaign name format, region, country and brand listsThe global taxonomy owner
Localutm_content values, language list, local campaign descriptors, utm_termThe regional or brand list owner
Shared rulesLowercase, allowed characters, delimiters, utm_content segment order (language-descriptor-variant), _na_ for empty segmentsThe global taxonomy owner

Region, country and brand sit in the global row on purpose. They feel local because each team only uses its own, but they’re what the consolidated report groups by. A region list edited locally is a region dimension you can no longer trust.

Let Local Teams Own the Values Only They Understand

Lock down everything and local teams route around you. The local layer is the release valve, and it should be generous.

Hand these over.

  • Content variants. A country team knows it’s testing a partner webinar invite against a video cut. The center doesn’t, and doesn’t need to. In utm_content=de-_na_-webinar_invite and utm_content=de-_na_-video_cut, the words after the language code are theirs to define.
  • Languages. A region running campaigns in four languages keeps a list of those four. The codes follow one global standard (lowercase two-letter codes such as de, fr, nl) and always sit in the first segment of utm_content, so a global report can still filter by language. Which codes appear on a team’s list is that team’s call.
  • Local campaign descriptors. The trade show a single country runs, the retailer promotion only one brand has. These describe a local execution of a global campaign and ride in the second segment of utm_content, leaving the global campaign name untouched.

The shared rules still apply to every local value: lowercase, underscores within a value, no spaces, nothing outside the allowed characters. Local teams choose the words. The spine chooses the grammar.

One more thing from sales calls. Global teams often work through an agency with a specialist per ad platform, while a local marketer builds links for every channel they run. The local builder is the person most likely to mix up conventions, and the least likely to have time to read a style guide. Give them dropdowns, not documentation.

Put Brand, Region and Country in Hierarchical Picklists

A flat list of every country is an invitation to pick the wrong one. A flat list of every product across every business unit is worse. The answer on nearly every multi-unit call is the same: make the lists depend on each other.

Hierarchical picklists handle parent and child. Pick a region, and the country list narrows to that region’s countries:

RegionCountries offered
amerus, ca, mx
emeade, gb, nl
apacjp, au, sg

A builder in emea never sees jp, so emea-jp-... can’t be created.

The chain can run deeper than two levels. Brands aren’t sold everywhere, so make brand the parent of region: pick birch, and only the regions where it’s sold appear, then only their countries. Products belong to some business units and not others, so the product list sits under business unit. Each child option is offered only when the choices above it match, which means a product never shows up under a unit that doesn’t own it.

In Terminus, the marketing taxonomy governance platform, these lists live in the governance model alongside the fields that use them, and the rules run the same way whether someone builds one link in Quick or Form, hundreds in the Grid, through a CSV round trip or through the API. A value that fails validation doesn’t become a record.

Scoped workspaces (Business plan and up) take it one step further. Workspaces can build against the same published model, and on each one you can narrow the options of any dropdown field, such as region, source or medium, to what that team runs. A country team’s workspace only offers its own region, so the team can’t tag another market’s campaigns by accident. Our advice on these calls is usually the same: give each brand or unit its own workspace if that’s how the teams work, and keep one shared structure underneath all of them. Separate workspaces are an access decision. Separate taxonomies are a reporting decision, and almost always the wrong one.

The Global Team Names the Campaign, Every Local Team Picks It

The most common global campaign workflow we hear about goes like this. Headquarters plans the campaign in detail, often including the creative itself. Regional teams adapt it, translate it and launch it in their markets. The naming instructions travel in a wiki page or a slide in the campaign package.

That wiki page is where the drift starts. Ten markets copy a campaign name by hand, one of them a week late and from an older version of the page.

The better model moves the name out of the document and into the dropdown.

  1. The global team builds the campaign name from fields of its own: region, country, brand, initiative and fiscal year. A campaign running in five markets gets five names, one per country, so country stays reportable on every local link. The model concatenates them in the global format, so every name is spelled correctly by construction.
  2. The name goes through review. Until it’s approved, it isn’t an option anywhere.
  3. Approved names become the campaign dropdown on every local form. A country marketer in Germany picks the name for their market, such as emea-de-alder-spring_launch-fy27, fills in source and medium from the global lists and language and content from their own, and gets a link that carries both layers.

In Terminus this is an automated picklist: a picklist that derives its options live from the approved records of another taxonomy. Automated picklists and approval workflows are both on the Business plan. A local team can’t misspell a global campaign, and it can’t launch one that was never approved.

What about campaigns a region runs on its own? Branch on who needs to see them. If the campaign should appear in global reporting next to headquarters campaigns, the region submits the name into the same approved list, in the same format, and it goes through the same review. If it’s a purely local execution of something already named, no new campaign is needed, only a local descriptor in the second segment of utm_content.

Bring an Acquired Company In Without Rewriting History

Acquisitions break taxonomies in a particular way. The acquired company arrives with years of links and reports built on its own values, and those reports were right for the company it used to be.

One pattern from calls: two marketing teams came together in a merger and only then discovered their taxonomies didn’t match. Another: a company retiring an acquired brand kept that brand’s link domain running, because links already out in the world depended on it.

Both point to the same rule.

Never rewrite a closed quarter.

Here’s the disaster it prevents. Someone runs a find-and-replace across the warehouse to convert the acquired company’s FB into facebook and paidsocial into paid_social. It works. Then finance pulls last year’s paid social figure for a board comparison, and it no longer matches the number in last year’s board deck. Nobody can tell whether the gap is real performance or the replace. The data is cleaner and nobody believes it.

Do it this way instead.

1. Export and inventory. Pull every distinct source, medium and campaign value the acquired company used, with volumes. Pull the list of live links you can’t retag, such as printed QR codes and email footers.

2. Build a mapping table. One row per old value, one column for the global value it corresponds to:

Old utm_sourceOld utm_mediumGlobal utm_sourceGlobal utm_medium
FBpaidsocialfacebookpaid_social
newsletterEmailnewsletteremail
LinkedInsponsoredlinkedinpaid_social

3. Apply the mapping in reporting. In the warehouse, that’s a view joining sessions to the mapping table, with raw values kept untouched underneath. In GA4, a custom channel group can reclassify old combinations into the right channel, and custom channel groups apply to your reports retroactively. Making a custom group your primary channel group is different: that populates with the new criteria from that point forward only. Standard properties also get just two custom channel groups beyond the predefined one, so check whether another team already uses them.

4. Set a cutover date. From that date, every new link from the acquired team is built on the global standard. Their brand becomes a value in the global brand list, their markets get added to the region and country hierarchy, and their team gets a workspace scoped to what it runs. Put the date in writing and in your reporting annotations, so anyone reading a trend line knows where the change sits.

5. Keep old links working. A QR code on packaging will send its old values for years. So will an evergreen email footer. That makes the mapping table permanent. Old links that are still actively managed can be rebuilt on the standard and bulk-imported through a CSV round trip, where the same validation applies. Everything else stays as it is and gets mapped.

The acquired team will notice the new dropdowns immediately. Their historical reports won’t change at all. That’s the point. The same approach for any inherited mess is in our guide’s When You Inherit a Mess page.

Decide Who Owns the Global Lists and Who Owns the Local Ones

Every list needs one named owner. Our guide’s governance chapter makes the case for a single accountable taxonomy owner. Across many units, that owner sits at the center of a small network.

List or ruleOwnerWho can request a changeHow changes land
Sources, mediumsGlobal taxonomy ownerAny teamAdded globally, available to everyone
Region, country, brand, business unitGlobal taxonomy ownerRegional and brand leadsAdded to the hierarchy after review
Campaign name format, character rulesGlobal taxonomy ownerAnalytics ownerRare, planned, announced ahead
Campaign namesGlobal campaign teamRegional teams, for globally reported campaignsThrough approval
Content values, local descriptors, language listRegional or brand list ownerTheir own teamLocal owner decides, no central approval
Old-value mapping tableAnalytics ownerAnyone who spots an unmapped valueUpdated in reporting

The line to hold is between the second and fifth rows. Global lists change slowly and centrally. Local lists change quickly and locally. If a country team has to wait on headquarters to add a content variant, the center becomes the bottleneck and the country goes back to its spreadsheet. A pattern we see work: give each local lead ownership of their local lists and a named contact at the center, while the global owner keeps the model.

Changing the global layer needs care, because every workspace uses it. In Terminus the owner edits the model in a draft while everyone keeps tagging against the published version, then publishes the revision, and new links in every workspace use it at once.

Local lists follow the same path, because a list edit is a model edit, made by an account admin and published. Where a local team needs to add values without waiting, make that field free text and put the shared character rules on it as validation: lowercase, allowed characters, a pattern.

Where to Start

Write down the global spine first: sources, mediums, the campaign name format and the region, country and brand lists. Then ask each regional or brand lead for their local lists, and hold them to the shared character rules. Link the lists that depend on each other. Move campaign names out of the wiki and into an approved list. If an acquisition is on the horizon, build the mapping table before the cutover date.

To see a model like this without building one, browse the taxonomy templates or try the live demo. Every Terminus trial runs 21 days with no credit card.

Start with the spine. Everything local hangs off it.

FAQ

Should each brand have its own UTM taxonomy?

No. Give each brand its own workspace if the teams work separately, but keep one taxonomy underneath. Separate taxonomies mean every consolidated report needs a translation layer, and that layer drifts. A brand field in the shared model gives you per-brand reporting without the translation.

Should region and country go in utm_campaign or a custom parameter?

If they’re what your consolidated reports group by, put them in the campaign name format as fixed segments, so every analytics tool that reads utm_campaign can split them out. If your spine already needs more than about five segments, move to key-value pairs or a campaign ID with a lookup table rather than making the positional name longer.

How should UTM values work across languages?

Keep the values themselves in one language and one character set, and record the language as its own segment, such as a lowercase two-letter code at the start of utm_content. Translated source or campaign values split one campaign into as many report rows as there are languages. Local teams translate the ads and landing pages. The tags stay in the shared vocabulary.

What can local teams add without central approval?

Content values, local campaign descriptors and their own language list, as long as the values follow the shared character rules. Anything a global report groups by, such as source, medium, region, country, brand and globally reported campaign names, goes through the global owner.

How do we map an acquired company’s old UTM values in GA4?

Build a mapping table from old source and medium combinations to your global values, then apply it in reporting. A GA4 custom channel group can reclassify old combinations into the right channels and applies to reports retroactively. Setting a custom group as your primary channel group only applies to data from that point forward. For source and medium level reporting, do the mapping in your warehouse or BI layer and keep the raw values.

Only the ones you still actively manage. Rebuild those on the global standard from your cutover date. Links you can’t change, such as printed QR codes and old email footers, keep sending their old values, so the mapping table stays in place for as long as those links get clicks.

What if a local team needs a campaign the global team hasn’t named?

If the campaign should appear in global reporting, the local team submits a name in the global format and it goes through the same review as a headquarters campaign. If it only adapts a campaign that already exists, keep the global name and record the local detail in the descriptor segment of utm_content.

Can Terminus run one governance model across several workspaces?

Yes. Several workspaces can build against the same published governance model. On the Business plan and up, scoped workspaces narrow the dropdown options each workspace sees, such as its own region, sources and mediums, and automated picklists let approved campaign names from one taxonomy become the campaign dropdown in others. Workspace counts differ by plan, as listed on the pricing page.

Terminus helps you and your team be consistent in UTM tracking

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