A practical guide to how you structure, name, and govern your UTM parameters — from solo marketers to global enterprises.
When you share a marketing link, you append query parameters to the URL so your analytics can tell you where the click came from and why. The most common are the five standard UTM parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) — but it doesn't stop there. Many teams use custom parameters like cid for campaign IDs, utm_audience for targeting segments, or platform-specific parameters. The same taxonomy principles apply to all of them.
Most marketers know what these parameters are. The harder question is how you structure the values inside them. That's your taxonomy — the naming system that determines whether your analytics data is clean and queryable, or a fragmented mess that requires hours of manual cleanup.
The taxonomy approach you choose has real consequences. It affects how easily your team can create links, how reliably your data holds up at scale, and what questions your analytics can actually answer. A solo marketer and a 50-person team need fundamentally different systems.
There are four fundamentally different ways to structure your UTM values. Each trades simplicity for power. Here's what they look like and what they mean:
utm_campaign=summer-sale
Human-readable, flat values with no internal structure. You type whatever describes the campaign. It's intuitive and requires zero tooling — but it breaks down fast. Without governance, one person writes facebook, another writes Facebook, a third writes fb, and your analytics fragments the same source into multiple entries.
utm_campaign=us-paid_social-facebook-summer_sale-awareness-q2_2025 Predefined segments in a fixed order, joined by a delimiter. Each position has a specific meaning: position 1 is region, position 2 is channel, position 3 is platform, and so on. This embeds rich metadata directly in your analytics — but position dependency is the killer flaw. If someone skips a segment, every value after it shifts and gets silently misinterpreted.
utm_campaign=geo:us-obj:awareness-prd:enterprise
Self-describing pairs where each piece of data is labeled. geo:us means geography is US — no position guide needed, and the order doesn't matter. You only include relevant attributes (no ugly _na_ fillers), and adding new dimensions doesn't break existing data. This is the sweet spot for most growing teams.
utm_campaign=cid_8f3a2b1c The UTM value is a meaningless identifier. All metadata — region, objective, budget, owner, ABM tier — lives in an external lookup table. Competitors learn nothing from your URLs, and you can track unlimited dimensions. But it requires serious infrastructure (database, campaign management UI, BI integration), and raw analytics are completely opaque without the lookup.
On top of whichever core approach you choose, you can optionally add enhancement layers. These aren't alternatives — they're add-ons that provide additional governance.
Establishes parent-child relationships between fields. When someone selects medium=email, the source dropdown only shows valid email sources like HubSpot or Mailchimp — not Facebook or Google. This prevents impossible combinations from ever entering your data.
SQL or regex rules applied during analysis to normalize messy data after collection. All the variations of facebook, fb, meta get mapped to a single clean value. Essential as a safety net, but should never be your primary governance strategy.
How these fit together: You pick one core approach (that's how your UTM values look), then optionally add layers. A company might use Structured + Dependency Validation, or Key-Value + both layers. The sections below explore each in detail, then show you which combinations work best for different team sizes and maturity levels.
Pick one — this determines how your UTM values are structured.
facebook vs Facebook vs fb) summer-sale tells you nothing about region or objective Even with Simple, a one-page document listing approved values (google, facebook, linkedin...) prevents most fragmentation.
Without governance, the same source becomes multiple records in your analytics.
facebook: 12,450
Facebook: 8,321
fb: 3,102
facebook.com: 1,877
Total: ???
All 25,750 sessions came from one source. Your analytics shows four.
These are not alternatives to the core approaches — they're add-ons that work with any of them.
Prevents impossible combinations
Establishes parent-child relationships between fields. Selecting one value constrains what other values are valid.
Step 1: User selects medium → "paid-social"
Step 2: Source filters to → [facebook, linkedin, tiktok]
Step 3: User selects source → "facebook"
Step 4: Format filters to → [carousel, video, story]
LOB → Product
Result appears here
Medium → Source
Result appears here
When to add this layer:
Clean messy data during analysis
SQL/Python/regex rules applied during analysis to normalize messy raw UTM data into clean categories.
CASE
WHEN LOWER(utm_source) IN ('facebook', 'fb', 'meta')
THEN 'meta'
WHEN LOWER(utm_source) IN ('ig', 'instagram')
THEN 'instagram'
ELSE LOWER(utm_source)
END AS clean_source
The Transformation Pipeline
Raw Data
Classification rules
Clean Data
Proactive
Clean at source. Data is trustworthy for all users.
Reactive
Clean in analysis. Creates analyst bottlenecks.
Safety net, not primary strategy
If post-hoc is the only thing keeping your data clean, your upstream process has failed. Use it as a complement to proactive governance.
In practice, nobody uses a pure approach in isolation. Here are the real-world combinations.
1-2 people • < 10 campaigns/month
Can answer
Can't answer
3-10 people • 10-50 campaigns/month
Can answer
Can't answer
10-30 people • 50-200 campaigns/month
Can answer
Trade-offs
30+ people • 200+ campaigns/month
Can answer
Trade-offs
How the four core approaches compare across 12 key dimensions.
| Dimension | Simple | Structured | Key-Value | Opaque ID |
|---|---|---|---|---|
| Setup Cost | None | Low (2-4 hrs) | Medium (1-2 wks) | Very High (months) |
| Ongoing Maintenance | None | Low | Medium | High |
| Tooling Required | None | Spreadsheet | UTM builder | Database + BI + UI |
| Data Consistency | Very Low | Medium | High | Very High |
| Scalability | 1-2 people | 3-10 people | 10-50 people | 50+ people |
| Metadata Richness | Name only | Fixed segments | Flexible keys | Unlimited |
| URL Readability | Very readable | Long but readable | Semi-readable | Opaque |
| Position Dependency | N/A | High (fragile) | None | N/A |
| Extensibility | None | Rigid | Flexible | Unlimited |
| Competitive Concealment | None | None | None | Full |
| Debugging Ease | Easy | Medium | Medium | Hard |
| Analytics Without Lookup | Full | Full | Full | Impossible |
| Layer | Simple | Structured | Key-Value | Opaque ID |
|---|---|---|---|---|
| Dependency Validation | Helpful | Very useful | Ideal fit | Built-in |
| Post-Hoc Classification | Essential | Useful | Safety net | Safety net |
Use these frameworks to find the right approach for your organization.
How many people create UTM links?
You're cleaning up analytics data manually. Different people use different names for the same source. You can't compare campaigns across quarters.
Concatenated strings have 6+ segments. Position errors are recurring. You need new dimensions but can't add them without breaking existing data.
Competitors are analyzing your URLs. You need to track sensitive metadata (budgets, target accounts). You have 30+ people creating campaigns.
Universal rules that apply to every approach, and common traps to avoid.
These apply regardless of which combo you use.
Always lowercase
Some tools treat "Dog" and "dog" as different entries. Lowercase eliminates this entirely.
Use hyphens between words
Better URL encoding and readability than underscores or spaces.
Never tag internal links
UTMs on internal navigation create new sessions and corrupt source attribution.
Stick to safe characters
a-z, 0-9, hyphens, underscores, and chosen separators. Avoid spaces, umlauts, or special characters.
Document allowed values
Even the simplest approach benefits from a list of approved source names.
Audit quarterly
Review analytics for fragmented values and add cleanup rules.
facebook → 12,450 sessions
Facebook → 8,321 sessions
fb → 3,102 sessions
meta → 1,877 sessions
Reality: All 25,750 from one source.
Fix:
Always enforce lowercase. This single rule eliminates the most common fragmentation cause.
Correct: us-paid_social-facebook-summer_sale
Wrong: us-facebook-summer_sale (missing medium)
Everything downstream is misread.
Fix:
Use Key-Value notation, or add a builder tool that prevents skipping fields.
Implementing Opaque IDs for a 5-person team running 15 campaigns/month. The maintenance cost of the database, campaign system, and BI integration far exceeds the value.
Fix:
Match your approach to your actual scale. Upgrade when you feel pain, not preemptively.
External agencies almost never follow your taxonomy unless forced by tooling. Any strategy that relies on documentation alone will leak inconsistency at the edges.
Fix:
Provide agencies with your builder tool so they can't deviate, or accept you'll need Post-Hoc Classification.
Stop wrestling with messy UTM data. Terminus provides the builder tools, dependency validation, and data dictionary you need to implement any taxonomy approach at scale.
21-day free trial • Cancel anytime