UTM names that survive three agencies (a convention that sticks)
Published August 28, 2026
The 60-second version
- Most UTM taxonomies die at the first agency handover โ free text plus no validation equals slow rot.
- Four rules keep links clean: lowercase, fixed vocabularies, required fields, no spaces.
- The fix: a weekly validator query plus a normalisation view for the messy past.
Open your Monday channel report and count the rows. If you see facebook, Facebook, FB, fb, facebook.com, meta, and Facebook_Ads, you do not have a traffic problem. You have seven split rows describing the exact same ad channel, and every ROAS calculation built on them is broken.
This does not happen because people are careless. It happens because three agencies, two contractors, and an email tool each built URLs without automated guardrails. A UTM parameter convention written in a slide deck decays within weeks. To keep your channel numbers reliable, you need a strict convention backed by an automated validator.
Why UTM conventions quietly fall apart
The Standard Decay Path
Process FlowSomeone writes the documentation
A thorough guide is written and shared in a Slack channel that later gets archived.
It works for one quarter
While the original author manually checks links, compliance stays high.
A new agency onboards
They bring their own naming style from their previous client and launch 200 unvetted links.
Someone creates a link on mobile
Autocapitalisation turns 'newsletter' into 'Newsletter', creating a permanent duplicate row.
The report loses credibility
Someone notices the broken numbers, runs a manual cleanup, and writes a new guide. The cycle repeats.
The documentation is rarely the problem. The failure is that nothing between the document and the report checks the tags. Every durable UTM system has an automated validator; every fragile one relies entirely on human memory.
The four rules of clean link naming
Everything else is optional detail. These four rules determine whether your tracking survives an agency transition.
Rule 1: source and medium are a closed set
utm_source and utm_medium are the two fields your analytics tool relies on to group channels. They must come from a fixed, short list that only changes through a deliberate team decision. Free-form values belong in campaign or content tags.
| Field | Type | Allowed values / rule |
|---|---|---|
utm_source | Closed set | google, meta, linkedin, newsletter, partner, podcast |
utm_medium | Closed set | cpc, paid_social, email, organic_social, affiliate, referral |
utm_campaign | Pattern-enforced | Fixed grammar: period_initiative_stage (e.g. 2026q3_diwali_prospecting) |
utm_content | Free-form | Creative variation (e.g. carousel_v3_lifestyle) |
utm_term | Free-form | Keyword or audience targeting |
Medium is the traffic type (such as paid_social), while source is the platform where the visitor clicked (such as meta). Setting utm_medium=facebook reverses this logic and causes GA4 to quietly dump your visits into "Unassigned".
You spot utm_medium=facebook in your campaign URLs. What is wrong with this tag?
Rule 2: lowercase, underscores, and no spaces
UTM values are case-sensitive across Google Analytics, BigQuery, and SQL warehouses. Newsletter and newsletter remain two separate rows forever.
- Lowercase everything. Mobile keyboards automatically capitalise the first letter, which causes most case inconsistencies.
- Use underscores, never spaces. Spaces convert to
%20or+depending on the browser, splitting one campaign into multiple records. - Avoid punctuation. Characters like ampersands break URL query parameters and truncate the remainder of your tracking string.
- Pick underscores or hyphens and stick to one. Mixing both causes
summer_saleandsummer-saleto coexist in your reports.
Rule 3: give utm_campaign a strict grammar
Campaign names combine multiple dimensions into a single string. Give them a predictable structure:
<period>_<initiative>_<funnel_stage>
2026q3_diwali_prospecting
2026q3_diwali_retargeting
2026q4_newyear_prospecting
A fixed order makes your campaign names parseable in SQL. With a consistent grammar, SPLIT(utm_campaign, '_')[OFFSET(2)] lets you isolate funnel stage across every campaign without writing brittle CASE WHEN logic.
Governed vs ungoverned campaign names
Rule 4: never put UTM tags on internal links
Placing UTM tags on banners, headers, or buttons inside your own website starts a brand new session in Google Analytics. A customer who arrived from a paid Meta ad and then clicks an internal homepage banner has their conversion reassigned to that banner. The paid campaign loses credit, and internal links appear artificially profitable.
Use an internal tracking parameter like int_promo=homepage_hero instead, and ensure your analytics configuration ignores it for session attribution.
Catch bad tags with a weekly validator query
Do not rely on people reading a PDF manual. Provide a simple spreadsheet generator with dropdowns for link creation, and run an automated query each week to detect drift before bad tags contaminate historical reports.
Catching drift at 40 sessions allows an agency to fix a tag immediately. Catching it at 40,000 sessions leaves you with corrupted reporting tables that require manual data repairs.
Clean messy history with a normalisation view
You cannot change links that customers clicked last month. Instead, clean the data at read time using a database view so reports always see unified channels.
Point all dashboards and attribution models at this view. When a new tag variant appears, add one WHEN condition here rather than reprocessing millions of historical rows.
How to run an agency handover that lasts
Agency transitions are where naming conventions face their toughest test. Build these requirements directly into the onboarding process:
Agency handover checklist no doc-only handovers
- Approved source and medium lists shared as raw data tables, not a written memo
- Campaign grammar template (period_initiative_stage) provided with 3 clear examples
- Read access granted to the weekly validator output so teams see tagging errors directly
- Clear agreement that unapproved values get normalised into whatever bucket the view assigns
Three Levels of UTM Maturity
Reporting HierarchyDocumented
Conventions exist only in a handbook. Compliance fades as soon as staff change.
Enforced at creation
A spreadsheet builder with dropdowns makes valid tags the easiest path forward.
Enforced at ingestion
Automated queries detect drift weekly while SQL views clean legacy data automatically.
Setting up the third level takes less than a day of engineering, and it ensures your marketing data stays clean regardless of agency turnover.
Frequently asked questions
Are UTM parameter values case-sensitive?
Yes. While parameter keys like utm_source are treated case-insensitively by many systems, the values assigned to them (Meta vs meta) are strictly case-sensitive in GA4, BigQuery, and SQL databases. Always enforce lowercase characters.
Should I put manual UTM tags on Google Ads?
In most cases, no. Google Ads auto-tagging with gclid passes far richer data into GA4 without risk of manual typos. Adding conflicting manual UTM parameters can override auto-tagging and obscure auction-level signals. Reserve manual UTMs for channels without native IDs, like newsletters, affiliates, and influencer links.
How should we handle historical data that is already inconsistent?
Do not rewrite historical raw records. Build a database normalisation view using CASE statements to standardise old values when querying. This preserves raw audit logs while giving your analytics dashboards clean, unified metrics.
Can an agency introduce new traffic sources on their own?
They can request an addition, but it must be approved by your analytics lead. An uncontrolled source list degrades into separate rows for every minor variation within months.
Takeaways for your next report
- Keep source and medium as locked, closed lists to prevent channel reports from splintering.
- Enforce lowercase letters and underscores exclusively to avoid permanent case-sensitive duplicate rows.
- Give campaign names a strict grammar (period_initiative_stage) so SQL queries can easily extract dimensions.
- Never tag internal links with UTM parameters, which restarts analytics sessions and misattributes revenue.
Related: how channel CAC depends on clean taxonomy, and what to do when ad spend and orders share no join key.
Blended CAC Calculator
Total spend across every channel, divided by total new customers โ the acquisition cost number that reconciles with what you actually spent.
Chinmay Raibagkar
About author โFounder of DataLens AI. He helps non-technical teams read their ad and database numbers with confidence โ which number to trust, what to do next, and what to ignore.