UTM Governance

utm_campaign Naming Structure: A Template That Reconciles

A field-tested utm_campaign template you can copy today: channel, objective, geo, and year-month, in a fixed order your whole team can follow.

Jun 26, 2026 8 min readBy The UTM Drift Guard team
UTM Governance
fbFacebookFBfacebook

Open GA4, filter by Campaign, and you find the same launch listed five ways: Summer Sale, summer-sale, SummerSale_FB, q3 promo, and Summer Sale 2026. Each one is a separate row, so no single number tells you how the campaign actually did. The fix is not more discipline. It is a utm_campaign naming structure the whole team can follow without thinking.

Why campaign names drift#

utm_campaign is a free-text field. GA4 stores whatever string you send, exactly as you send it, and never normalizes it. So the field drifts the moment a second person starts building links. One writes Summer Sale, the next writes summer_sale, a third adds the year. Spreadsheets stop enforcing consistency once more than two people touch them, so the drift compounds week over week.

67% of teams use UTMs but only 58% have a documented strategy (SEMrush, 2024). Without a written structure, every campaign name is a guess, and the report that joins on utm_campaign inherits every guess. That is how one campaign becomes six rows that never add up.

One campaign, five spellings

Summer Salesummer-saleSummerSale_FBq3 promoSummer Sale 2026

One structured value

facebook_acquisition_us_202607
Five free-text spellings of one launch collapse into a single structured value.

The template: channel_objective_geo_yyyymm#

A naming structure is just segments in a fixed order, joined by one delimiter. The order matters more than the exact segments — once it is fixed, anyone can read a campaign name left to right and know what it is. Here is a template that reconciles cleanly across channels and months.

The template and three filled-in examples.
Template
channel_objective_geo_yyyymm
Examples
facebook_acquisition_us_202607
google_retargeting_emea_202605
email_nurture_global_202606

Read facebook_acquisition_us_202607 left to right: the channel is facebook, the objective is acquisition, the target region is us, and it started in July 2026. Every segment is a value you can filter, group, or compare on. None of them is a free-text guess.

The four segments, what each means, and the values they accept.
SegmentMeaningExampleAllowed values
channelWhere the click comes fromfacebookfacebook, google, email, linkedin, newsletter
objectiveWhat the campaign is foracquisitionacquisition, retargeting, nurture, retention, launch
geoTarget regionusus, uk, emea, apac, global
yyyymmStart year and month202607six digits, numeric only
fbFacebookmetafacebook-ads
facebook
retargetremarketingrtgretgt
retargeting
USusaunited-statesU.S.
us
acqnewprospectingacquire
acquisition
Each segment has one canonical value and the misspellings it absorbs.

How to build your own structure#

You do not have to use these exact segments. A 6-person marketing team that runs mostly email and paid social might use channel_objective_yyyymm and skip geo entirely. Pick the segments you actually filter on, then follow the same five moves.

  1. 1

    Choose three to five segments

    Pick the dimensions you slice reports by — usually channel, objective, and a date. More than five segments and the name gets unreadable; fewer than three and it stops being useful.

  2. 2

    Lock the order

    Decide the sequence once and never change it. channel_objective_geo_yyyymm reads the same for every campaign, so a person and a pivot table both parse it the same way.

  3. 3

    Write the allowed values

    List the canonical value for each segment in a shared doc. This is the same work as a UTM naming convention for teams — the campaign field just inherits it.

  4. 4

    Use one case and one delimiter

    Lowercase everything and join with underscores. GA4 is case-sensitive, so Facebook_Acquisition and facebook_acquisition are two different campaigns. More on UTM case sensitivity in GA4.

  5. 5

    Govern it, do not police it

    A convention in a doc still drifts. Move link creation from a spreadsheet to governed links so the structure is enforced at build time, not caught later.

Pick a delimiter and never mix

Use underscores between segments and reserve hyphens for inside a segment (black-friday). Mixing _ and - as separators is the most common reason a parser splits one campaign into two.

Worked example: one brief, one value#

The point of a structure is that a plain-English brief maps to exactly one string. Here is how three briefs become three governed campaign values, with no room for a second spelling.

Plain-English briefs mapped to one structured value each.
Plain-English briefStructured utm_campaignReads in GA4 as
Facebook retargeting for US shoppers, Julyfacebook_retargeting_us_202607facebook · retargeting · us · 202607
Google prospecting across EMEA, Maygoogle_acquisition_emea_202605google · acquisition · emea · 202605
Nurture newsletter to the global list, Juneemail_nurture_global_202606email · nurture · global · 202606
The full tagged URL for the first brief.
https://example.com/sale
?utm_source=facebook
&utm_medium=paid_social
&utm_campaign=facebook_retargeting_us_202607

Free-text field vs a templated field#

Free-text campaign field

  • Every person invents a new spelling
  • GA4 splits one campaign into several rows
  • Numbers never reconcile across channels
  • You re-map names by hand before every review

Templated utm_campaign

  • Fixed segments in a fixed order
  • One campaign equals one row in GA4
  • Filter by channel, objective, geo, or month
  • New links inherit the convention automatically
Why a fixed structure reconciles where free text never does.

58%

of teams have a documented UTM strategy, though 67% use UTMs (SEMrush, 2024)

29%

better attribution accuracy when teams standardize naming (Cometly, 2026)

10–20%

of GA4 sessions commonly land in Unassigned

Common mistakes#

Do

  • Keep the segment order identical on every campaign.
  • Lowercase every value and join segments with one underscore.
  • Use yyyymm for dates so they sort correctly (202601 before 202607).
  • Keep a written list of allowed values for each segment.
  • Audit the campaign names you already have before reporting on them.

Avoid

  • Spaces or capital letters — Summer Sale and summer_sale become two campaigns.
  • Mixing _ and - as segment separators in the same name.
  • Free-text dates like July or q3 that do not sort and drift in spelling.
  • Stuffing the whole brief into one segment (facebook-summer-sale-retargeting-us).
  • Changing the structure mid-quarter, which breaks every comparison that spans the change.

Case is not cosmetic

GA4 treats email, Email, and EMAIL as three separate mediums, and the same is true for the campaign field. A single capital letter is enough to split a campaign and send its traffic toward Unassigned.

What is a good utm_campaign naming structure?

A fixed set of segments in a fixed order, joined by one delimiter — for example channel_objective_geo_yyyymm, which becomes facebook_acquisition_us_202607. Use lowercase and underscores, write down the allowed values for each segment, and keep the order identical on every campaign so a person and a pivot table read it the same way.

Should utm_campaign use dashes or underscores?

Pick one delimiter for separating segments and never mix. Underscores between segments and hyphens inside a segment (black-friday) is a common, readable choice. What matters is consistency: if some links use _ and others use -, your parser and your reports treat them as different campaigns.

How do I format the date in a utm_campaign name?

Use yyyymm (for example 202607) so the values sort in calendar order and never drift in spelling. Avoid July, Jul, or q3, which sort alphabetically, vary by author, and make month-over-month comparison unreliable.

Can I change my utm_campaign structure later?

You can, but every report that compares dates across the change will break, because the old and new names will not group together. If you must change it, pick a clean month boundary, keep the old links untouched, and audit both formats so you can map them during the transition.

How is utm_campaign naming different from a full UTM convention?

A full convention governs every parameter — utm_source, utm_medium, and utm_campaign. The campaign structure is the one free-text field inside it, so it inherits the same allowed values and casing rules. See UTM naming convention for teams for the full set.

See how clean your campaign names already are

Paste a GA4 source / medium / campaign export and get an A–F UTM health grade in about a minute — no signup for the first scan.

Run a free audit