The 5-Field UTM Structure Template Every Campaign Should Follow

Bhargav Dhameliya
Bhargav Dhameliya
September 7, 2026
5 min read
utm structure template 5 fields every campaign featured

Your last campaign had nine links. Six of them carried utm_content. Three did not.

Nobody noticed. The links worked, the clicks landed, GA4 filled up. Then someone asked which creative performed best, you opened the report, and a third of the campaign sat in a row labelled (not set). You could not answer the question. Not because the data was missing, but because the campaign never agreed on what it was collecting.

A UTM structure template is the fixed set of UTM fields every link in a single campaign agrees to fill. It sits below the naming convention, which governs how a value is written, and above the individual link, which supplies the values. The structure is decided once, before the first link exists, and then nobody decides it again.

I run linkutm, so I see this from the inside. The tagging mistakes that cost teams the most are almost never typos. They are structural: one person tagged four fields, another tagged three, and now the campaign cannot be read as one thing.

This is not a walkthrough of what each parameter means. If that is what you need, the anatomy of a UTM tag covers which GA4 dimension each field becomes, and our UTM naming conventions guide covers how to write the values inside them. This piece covers the layer nobody writes about: which fields your campaign fills at all.

What a UTM Structure Template Fixes in Place

A structure fixes the field list. That is all it does, and that is why it works.

Here’s the thing about the five UTM fields. Three of them (utm_source, utm_medium, utm_campaign) are effectively mandatory, because GA4 needs them to attribute a session to a channel and a campaign. The other two (utm_term, utm_content) are optional. Optional is where teams get into trouble, because “optional” gets read as “decide per link” when it should mean “decide per campaign”.

A structure template answers three questions before anyone opens a link builder:

  1. Which of the five fields will this campaign populate?
  2. What does each populated field hold for this campaign specifically?
  3. What happens to a link that cannot supply one of those values?

Question three is the one people skip. The answer has to be a rule, not a shrug. Either the link gets a defined fallback value, or that field leaves the structure for the entire campaign.

The limitation: a structure cannot tell you whether your values are any good. You can hold a perfect five-field structure across 200 links and still write utm_source=fb on Monday and utm_source=facebook on Tuesday. Structure and naming are separate failures with separate fixes.

Three-layer stack diagram showing UTM structure with five field chips at the base, naming convention rules in the middle, and individual link values at the top

Structure, Convention, and Values Are Three Different Layers

These three get used interchangeably in most marketing teams, and the confusion is expensive. They are stacked, and they depend on each other in one direction only.

Structure decides which fields exist for a campaign. It is a list of field names.

Convention decides what may be written inside those fields. It is a set of rules about format, casing, and approved values.

Values are what an individual link actually carries. They are the output.

The dependency runs upward. You cannot write a naming rule for a field your campaign has not committed to. You cannot supply a value for a field with no rule without inventing one on the spot. Skip the bottom layer and every layer above it wobbles.

This also explains where a saved template fits. A pre-built UTM template is one structure plus prefilled values, saved for reuse. Every template contains a structure. A structure does not need a template to exist, which matters for the one-off campaign nobody will ever run again.

There is a fourth thing people confuse with structure, and it is worth separating now. How many unique values a field holds is cardinality, not structure. That is a different axis with different consequences, and our UTM framework guide covers the volume side properly. Structure asks whether the field exists. Cardinality asks how many different things you put in it.

Honest limitation: this layering is cleaner in writing than in practice. Most teams discover their structure retroactively by looking at what they have already tagged. That is fine. Just write it down once you find it.

Why Google’s Builder Shows Six Fields, Not Five

Open Google’s Campaign URL Builder right now and count. You get six inputs: campaign ID, campaign source, campaign medium, campaign name, campaign term, and campaign content.

The “five UTM parameters” phrase predates utm_id. It is still the right default for most teams, but you should know why the sixth field is there before you decide to ignore it.

utm_id holds a campaign identifier that stays stable even when the campaign name changes. It exists mostly to join GA4 data with imported cost data. If you are not importing ad spend into GA4, it earns nothing and adds a field everyone has to remember. If you are, it belongs in your structure and the five-field template becomes a six-field one.

GA4 also recognises parameters beyond these six, and two of them currently do nothing in reports at all. I am not going to relitigate that here because the anatomy post has the full table.

The limitation of treating five as the default: it is a convention, not a standard. Nothing in Google’s documentation on custom campaigns says five is correct. Five is just where most teams land when they weigh usefulness against the cost of remembering.

The Fill-or-Omit Rule Inside a UTM Structure Template

Decide each field once, for the whole campaign, and record the decision. Here is how I run that call.

Field What it holds for the campaign The rule Failure if you get it wrong
utm_source The specific origin of the click Always fill. No exceptions. Traffic lands in Direct or Unassigned and the campaign is invisible
utm_medium The channel type the click belongs to Always fill. Use a value GA4 already recognises. Campaign shows up in the wrong channel group
utm_campaign The initiative the link belongs to Always fill. One value for the whole campaign. Links scatter across multiple campaign rows and cannot be summed
utm_term The paid search keyword Fill only for paid search. Omit everywhere else. Filled with a guess, it becomes a column of noise nobody reads
utm_content What separates two links inside the same campaign Fill for all links or none. Never some. Partial fill makes every creative comparison invalid

The three mandatory fields are not interesting. Everyone fills them, and when they get them wrong it is a naming problem, not a structure problem.

utm_term is the field I see abused most. It was built for paid search keywords. Outside paid search there is no keyword, so people put the audience segment, or the send date, or the subject line in it. Any of those might be useful, but none of them are terms, and six months later nobody remembers which meaning was in play. If you want a second dimension inside a campaign, utm_content is the field designed for it.

utm_content is where the actual decision lives, and it deserves its own test.

Limitation worth stating: these rules assume GA4. If your primary reporting platform treats these fields differently, check its documentation before adopting the table wholesale.

Decision flowchart for whether an optional UTM field earns a slot, with both no branches leading to omitting the field across the whole campaign

The Two-Question Test for the Optional Fields

Run both questions before an optional field enters your structure. One “no” and the field is out.

Question 1: Will you actually segment by this field?

Not “might it be interesting”. Will you open a report, split by this dimension, and change something based on what you see? If you cannot name the decision the field feeds, it is decoration.

Question 2: Can every single link in this campaign carry a meaningful value for it?

Every link. The main CTA, the footer link, the image link, the one your agency adds on day nine, the QR code on the event banner. If any of them cannot supply a real value, the field fails the test.

Two yeses and the field goes into your structure with a defined value set. Anything else and it leaves the structure entirely.

That second question is the one that kills most optional fields, and people hate the conclusion. A field filled on 80% of links is worse than a field filled on 0%, because a partially filled field looks complete in a report. Nothing warns you that the denominator moved.

The limitation: this test is deliberately strict, and it will sometimes cost you a genuinely useful split. A campaign where nine of ten links can carry a creative label is annoying to reduce to zero. The alternative is defining a fallback value for the tenth link, which keeps the field in the structure and keeps the report honest.

What Happens When a UTM Structure Template Drifts

Drift is when links inside one campaign stop sharing a structure. It produces a specific and quiet failure that a naming audit will never catch.

GA4 does not drop a link that is missing a field. It reports it, and it fills the empty dimension with (not set), which is GA4’s label for a dimension that received no value. Your row count stays right. Your session count stays right. Only the split breaks.

Say your campaign ran ten links and six carried utm_content. You open the campaign, split by content, and see:

hero-banner        412 sessions
sidebar-cta        228 sessions
footer-link         96 sessions
(not set)          641 sessions

That (not set) row is not a creative. It is four links pretending to be one thing. And the comparison you wanted to make, hero versus sidebar, is now built on a partial universe. The percentages are wrong. Not missing, wrong, which is more expensive.

Four things cause drift, and I have watched all four happen on real campaigns:

  • A link added mid-flight. The campaign was structured on day one. On day nine someone needs one more link and builds it from memory.
  • A link rebuilt from a screenshot. Somebody copies a tagged URL out of Slack, edits the destination, and drops a field in the process.
  • A platform macro that resolves empty. Paid social macros that fill a field automatically return nothing when the object they reference has no name.
  • A second person with a different mental model. The most common one. Two people, both careful, different assumptions about whether the field applies.

This is exactly what UTM rules exist to stop, by rejecting a link that does not match the structure before it ships rather than after.

Honest limitation: drift is only detectable while the campaign is running or shortly after. You cannot retag a link that is already in someone’s inbox. Catching it on day two is a fix. Catching it on day sixty is a note in the report.

The artifact is one block of text per campaign, and it belongs wherever your campaign brief lives.

CAMPAIGN: spring-sale-2026
STRUCTURE: source, medium, campaign, content
  utm_source   = the specific platform (newsletter, facebook, partner-name)
  utm_medium   = email | paid-social | referral
  utm_campaign = spring-sale-2026        [locked, identical on every link]
  utm_content  = creative slot           [hero | sidebar | footer | qr]
  utm_term     = OMITTED for this campaign
FALLBACK: any link with no creative slot uses utm_content=general
OWNER: whoever ships a link outside this structure fixes it same day

Five lines and a fallback. That is the whole artifact.

Two details make it work. The OMITTED line matters more than the filled ones, because it converts an absence into a decision. A reader six months later knows utm_term was considered and dropped, rather than forgotten. And the fallback line kills the “this link is a special case” conversation before it starts.

I keep these with the campaign brief rather than in a central tagging document. The central document holds your conventions, which change rarely. The structure changes per campaign, so it lives with the campaign.

The limitation: this only survives if someone owns it. A structure declaration in a doc nobody opens is a nice piece of writing. The owner line at the bottom is not decoration.

Two GA4 campaign tables compared, one with a clean four-row creative breakdown and one where a large not set row consumes most of the sessions

How to Audit Field Completeness for One Campaign in GA4

Do this once per campaign, two days after launch, while the links can still be fixed. It takes about five minutes.

  1. Open Explore and start a blank exploration. Standard reports will not show you the split you need.
  2. Set the date range to the campaign period only. A wider range pulls in other campaigns and hides the gap.
  3. Add Session campaign as a filter, set to exactly match your campaign value. This isolates one campaign.
  4. Add Session manual ad content as a row dimension. This is the GA4 dimension utm_content becomes.
  5. Add Sessions as the metric and apply.
  6. Read the (not set) row as a percentage of total sessions. Anything above zero means at least one link shipped outside your structure.
  7. If utm_term is in your structure, repeat with Session manual term. Same read, same threshold.

Zero is the only good number here, and you will rarely hit it on the first campaign. On our own campaigns the first audit usually turns up one or two stray links, almost always added after launch.

Then do the part that matters: find which link produced the (not set) sessions, fix it if it is still editable, and add its cause to the structure block so the next campaign inherits the lesson.

Analytics exploration configured with a session campaign filter and session manual ad content as the row dimension, showing a not set row in the results

Limitation: this audit only finds gaps in fields you decided to fill. It cannot tell you that a field you omitted would have been useful. That question only gets answered when someone asks for a split you cannot produce, which is a slower feedback loop and the real argument for thinking about structure up front.

What a UTM Structure Template Cannot Fix

A structure keeps a campaign internally consistent. It does not make the campaign comparable to your other campaigns, it does not validate a single value, and it does nothing about traffic that arrives untagged.

Four specific limits:

  • It stops at the campaign boundary. Two campaigns can each hold a perfect internal structure and still be impossible to compare, because one used utm_content for creative and the other used it for placement.
  • It cannot survive a channel that strips parameters. Some apps and messaging platforms rewrite outbound URLs. The structure was correct when the link left; it is not what arrived.
  • It does not apply to auto-tagged paid traffic. Google Ads auto-tagging carries its own identifier and does not use your fields at all.
  • It adds a step before launch. Somebody has to make the decisions and write them down while everyone else wants to ship. On a one-link campaign that overhead is not worth it, and you should skip it honestly rather than pretend.

Frequently Asked Questions

How many UTM fields should a campaign use?

Three at minimum and five at most, with four being the common answer for campaigns that run more than one creative. utm_source, utm_medium, and utm_campaign are always filled because GA4 needs them for attribution. Add utm_content when you have a split you will genuinely act on, and add utm_term only for paid search. The number matters less than holding the same number across every link in the campaign.

Should every link in the same campaign use the same UTM structure?

Yes, and this is the single rule that matters most. A campaign is only readable as one thing if its links agree on which fields they carry. When some links fill a field and others skip it, GA4 still reports both, so nothing looks broken while every comparison built on that field silently becomes wrong. Decide the field list once per campaign, then hold it.

What happens if some links in a campaign are missing utm_content?

GA4 groups those sessions into a (not set) row instead of excluding them. Your totals stay correct, which is what makes this dangerous. The creative breakdown becomes unusable because part of the traffic is unlabelled, so the percentages you read for each creative are calculated against an incomplete universe. Give every link a real value or a defined fallback such as general.

Do you need utm_term if you are not running paid search?

No. utm_term was designed to hold the paid search keyword that triggered an ad, and outside paid search there is no keyword to record. Teams that fill it anyway usually put a segment, a date, or a subject line in it, which produces a dimension whose meaning changes campaign to campaign. If you need a second dimension inside a campaign, use utm_content and leave utm_term out of the structure.

What is a UTM structure template?

A UTM structure template is the fixed set of UTM fields that every link in one campaign commits to filling, decided before the first link is built. It is narrower than a saved UTM template, which also carries prefilled values, and it sits underneath your naming convention, which governs how each value is written. Its job is consistency inside a campaign, so that any split you run across those links is calculated on the same basis.

Decide the Fields Once, Then Stop Deciding

Most UTM advice tells you to be consistent. Nobody tells you what to be consistent about, so teams try to be consistent about everything at once and give up on the hard part first.

Start smaller. For your next campaign, write the five field names down, mark each one filled or omitted, add a fallback for the optional field you kept, and give the block an owner. That is ten minutes of work before the first link exists.

Then audit it on day two. Find the stray link. Fix it while it is still fixable.

The structure is the part of UTM tracking you can actually control on a deadline, and it is the part that decides whether the report you open in three weeks can answer the question you built the campaign to ask.

Ready to stop links shipping outside your structure? linkutm’s UTM rules reject a link that is missing a required field before it goes out, so structure drift never reaches your GA4 reports.

Bhargav Dhameliya

About Bhargav Dhameliya

Share this article

Ready to track your campaigns better?

Join thousands of marketers who use linkutm to build, track, and manage their marketing campaigns with ease.

Get Started for Free