How do I name UTM campaigns?
Usually: one lowercase pattern, such as offer, audience and year, joined by underscores and used word for word in every tool. Keep shop and shopping out of names, and put a stable campaign ID in utm_id so imported costs can join.
By Joris van Huët, Founder & CEOUpdated 7 min read
Run the numbers for your store: the free UTM builder.
Usually: pick one pattern, such as offer, audience and year, in lowercase with underscores, and use that exact name in every tool. Keep shop and shopping out unless it is a Shopping campaign, because GA4's channel rules read campaign names. If you plan to import ad costs, put a stable ID in utm_id.
A campaign name looks like a note to yourself. It has three other readers, and all three are fussier than you are.
GA4's reports. GA4 groups visits by the exact text in utm_campaign. Its URL builder page gives the example that SpringSale and Spring_Sale are considered distinct. Its cost import guide adds that inconsistent naming can make one marketing effort look like two separate campaigns.
GA4's channel rules. For hand-tagged links, most channels depend on source and medium, but two rules read the campaign name. A name containing cross-network lands in Cross-network. A name that matches GA4's shop pattern can land in Paid Shopping or Organic Shopping. Cross-network and Paid Shopping come before Paid Social in GA4's list, and Organic Shopping comes before Organic Social and Email. Google's help on channel groups says traffic goes to the first channel whose definition it matches.
The shop pattern is wider than it looks. It catches shopping anywhere in a name, and shop at the start or after an underscore, hyphen, space or digit. It also lets an e sit right before shop. So winter_shop_drop and eshop_launch both match, while workshop_week does not.
Your cost data. If you import ad costs into GA4, it joins them to visits on exact values. Google's import guide says the values in your file must exactly match the values your users have logged. A campaign ID in utm_id is the sturdier key, because an ID survives a rename. The URL builder page asks for the same IDs you use when uploading campaign data.
So a fixed pattern beats a clever name. One that holds up: offer, then audience, then the year if the push repeats, joined by underscores. A name like black_friday_prospecting_2026 says what, who and when. Anything that changes from ad to ad, such as the creative or the creator, belongs in utm_content. GA4's help describes that tag as the way to differentiate creatives.
Google's own help page, by the way, writes spring_sale in one example and summer-sale a few lines further down. Pick one separator anyway.
What one store's data shows
One store's anonymised GA4 export, 1 January 2024 to 21 August 2026. It holds shares of revenue only: no ad spend, no order counts.
| What the export shows | Share of revenue | Source cell |
|---|---|---|
| Journeys with 2 to 3 touches (12.5 days to buy) | 12.2% | Journeys sheet, 2-3 touches row |
| Journeys with 4 to 9 touches (16.9 days to buy) | 5.4% | Journeys sheet, 4-9 touches row |
| Journeys with 10 or more touches (16.0 days to buy) | 3.0% | Journeys sheet, 10+ touches row |
| Direct, in last click, first click and touched views | 57.7% | Channels sheet, Direct row |
This export works in channels and journey lengths. It holds no campaign names, so it cannot grade anyone's naming. It can show how long a name has to last, and where a name never arrives.
On the Journeys sheet, journeys with 2 to 3 touches took 12.5 days to buy. The Journeys sheet puts journeys with 4 to 9 touches at 16.9 days, and those with 10 or more at 16.0 days. A campaign name has to hold still for that long. Change it halfway through a push, and one buyer's path can carry both names, as if two campaigns had taken turns.
Those longer journeys hold 12.2% + 5.4% + 3.0% = 20.6% of revenue on the Journeys sheet, about a fifth. That fifth is the only slice with several touches per path. It is where tidy names pay off when you read GA4's paths report by campaign.
Direct holds 57.7% of revenue on the Channels sheet, in all three views. No naming rule reaches those visits. GA4 processes a session as direct when no information about the referral source is available. A campaign name only travels on a tagged link.
What the export cannot show is which campaigns sat behind each channel, or whether their names were tidy. Your own GA4 property can show that, and the steps below start there.
Why does the usual naming advice fall short?
The usual advice is a naming spreadsheet. Keep it, but know that many of your names never pass through it.
Ad platforms write their own names into your links. Meta's dynamic value {{campaign.name}} copies the campaign name from Ads Manager, and GA4's own best practice suggests exactly that. TikTok's Auto-attach fills in the campaign name too. With Google Ads auto-tagging on, GA4 uses the auto-tagged values, and Google says auto-tagging is prioritized over manual tagging.
So most paid names get typed inside Ads Manager, Google Ads and TikTok Ads Manager, often by whoever launched the campaign in a hurry. The spreadsheet only works if those people follow it.
Names also freeze. Meta's help says that after a rename, name-based parameters still refer to the original names. Klaviyo says UTM parameters cannot be edited for sent messages. A typo at launch stays a typo for the life of the campaign.
What can a campaign name not tell you?
A name is a label on a click. GA4 ties it to the session that click started, and a second campaign link clicked mid-visit does not start a new session.
So a tidy name tells you which campaign got the credit. It cannot tell you whether that campaign earned it. Clean names make credit readable, not right. To learn what a campaign caused, compare people who could see it with people who could not, as a holdout test does.
What to do this week
- List every campaign name GA4 has seen. In GA4, select Reports, then Acquisition > Traffic acquisition, and switch the dimension drop-down to Session campaign. Pass: each push appears once, in one spelling. Fail: pairs such as BlackFriday and black_friday, so pick one and fix the links that send the other.
- Read one live Meta ad's URL parameters. In Ads Manager, open the ad, scroll to Tracking and read the URL parameters field below it. Pass: utm_campaign uses
{{campaign.name}}and the campaign name already fits your pattern. Fail: a hand-typed value, or a campaign renamed after launch that GA4 will keep showing under its first name. - Check that campaigns carry an ID. In the same table, click the icon next to the dimension drop-down and add Session campaign ID. Pass: your paid campaigns show an ID. Fail: they show (not set), so any cost you import later has only names to join on.
Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework
Sources, 1 October 2026: URL builders: Collect campaign data with custom URLs (Google); Default channel group (Google); Custom channel groups (Google); Import campaign data (Google); Campaigns and traffic sources (Google); Traffic-source dimensions, manual tagging, and auto-tagging (Google); Traffic acquisition report (Google); About the (other) row (Google); About auto-tagging (Google); Specifications for dynamic URL parameters in Meta Ads Manager (Meta); Add URL parameters to your Meta ads in Meta Ads Manager (Meta); How to add URL parameters to your website URL in TikTok Ads Manager (TikTok); How to add UTM tracking to campaigns and flows (Klaviyo)
Related answers
Frequently asked questions
Should every ad get its own utm_campaign value?
No. Give the push one campaign name and tell ads apart with utm_content, which GA4's help describes as the way to differentiate creatives. A name per ad splits one push into many rows. Once a table outgrows its row limit, GA4 folds rare values into an (other) row.What should go in utm_id?
A campaign ID that never changes, ideally the ad platform's own, such as Meta's campaign ID. GA4 can join imported costs on it, and Google's help asks for the same IDs you use when uploading cost data. Unlike a name, an ID survives a rename.Does the campaign name change which channel GA4 picks?
Sometimes. For hand-tagged links, two channel rules read the campaign name. Names containing cross-network go to Cross-network, and names matching GA4's shop pattern can go to Paid Shopping or Organic Shopping. The other rules look at source and medium.
Go deeper: Causal attribution, explained.
Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.
Keep reading
Terms in this article
- AnalyticsAnalytics is the systematic computational analysis of data. It reveals customer behavior and measures campaign performance.
- AttributionAttribution identifies user actions that contribute to a desired outcome and assigns value to each. It reveals which marketing touchpoints drive conversions.
- Google AdsGoogle Ads is an online advertising platform where advertisers bid to display ads, service offerings, and product listings.
- Holdout TestA holdout test is an experiment where a portion of the audience does not see a campaign. This measures the campaign's true incremental impact.
- IncrementalityIncrementality measures the true causal impact of a marketing campaign. It quantifies the additional conversions or revenue directly from that activity.
- TikTok AdsTikTok Ads are advertisements on the TikTok platform. They allow brands to reach younger audiences through short-form video content.
- Traffic SourceTraffic Source is the origin through which users find a site. Common sources include organic search, paid search, direct traffic, and referrals.
- UTM ParametersUTM Parameters are URL tags marketers use to track campaign effectiveness across traffic sources. They provide data for accurate campaign tracking and attribution in analytics platforms.