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.
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
One 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.
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.
| Segment | Meaning | Example | Allowed values |
|---|---|---|---|
| channel | Where the click comes from | facebook, google, email, linkedin, newsletter | |
| objective | What the campaign is for | acquisition | acquisition, retargeting, nurture, retention, launch |
| geo | Target region | us | us, uk, emea, apac, global |
| yyyymm | Start year and month | 202607 | six digits, numeric only |
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
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
Lock the order
Decide the sequence once and never change it.
channel_objective_geo_yyyymmreads the same for every campaign, so a person and a pivot table both parse it the same way. - 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
Use one case and one delimiter
Lowercase everything and join with underscores. GA4 is case-sensitive, so
Facebook_Acquisitionandfacebook_acquisitionare two different campaigns. More on UTM case sensitivity in GA4. - 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 brief | Structured utm_campaign | Reads in GA4 as |
|---|---|---|
| Facebook retargeting for US shoppers, July | facebook_retargeting_us_202607 | facebook · retargeting · us · 202607 |
| Google prospecting across EMEA, May | google_acquisition_emea_202605 | google · acquisition · emea · 202605 |
| Nurture newsletter to the global list, June | email_nurture_global_202606 | email · nurture · global · 202606 |
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
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
yyyymmfor dates so they sort correctly (202601before202607). - 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 Saleandsummer_salebecome two campaigns. - Mixing
_and-as segment separators in the same name. - Free-text dates like
Julyorq3that 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.