The utm tagging conventions that survive five editions of one show
A durable utm tagging convention fixes one legal value per field before the campaign calendar opens: source names the platform the click came from, medium names the paid or owned mechanism, and campaign carries the edition code and the audience segment. Values stay lowercase, and every new value goes through one person.
The export lands as one csv. Five editions of the same show, 46,000 registration rows, and a column called source that somebody has promised is reliable. It holds 61 distinct values. Fourteen of them are LinkedIn.
The utm tagging conventions behind those fourteen values were never written down anywhere. Each value was correct on the afternoon somebody built a link. LinkedIn, linkedin, Linkedin, LI, linkedin.com, LinkedIn Ads, li-ads, linkedin_ads, LNKD, linked-in, LinkedIn-Sponsored, sponsored-linkedin, linkedin paid, LinkedIn/CPC. Same platform every time. The report treats them as fourteen unrelated sources and nobody notices, because no single one of them is large enough to argue about.
What fourteen spellings do to a channel report
Those fourteen values carry 3,412 registrations between them across the five editions. The largest of them holds 1,190, which is 34.9 per cent of the true total. Organic search, which is a single tidy value because Google Analytics writes it rather than a person, shows 1,510.
So the channel report says organic search beat paid social. Collapse the fourteen values into one and paid social has 3,412 against organic search's 1,510, more than double. The ranking inverts, and it inverted because of spelling.
This is not an exotic failure. Google's campaign parameter documentation, current in 2026, defines utm_source only as the referrer, with the examples google, newsletter4 and billboard, and utm_medium only as the marketing medium, with the examples cpc, banner and email. Those definitions are deliberately permissive, because Google cannot know what your properties are called. Permissive definitions plus eleven people building links over five years produces exactly what is in that csv.
The scale of the problem grows with the number of tactics you run. CEIR's Attendee Acquisition Study, presented in 2023, documented nearly twenty attendee marketing tactics in use and found 98 per cent of responding organisers running one or more digital tactics, with 43 per cent running a personalised attendee marketing effort. Twenty tactics across a portfolio, each with its own link builder, is a vocabulary problem before it is an analytics problem.
Why should the vocabulary be locked rather than agreed?
Agreement decays. Somebody agrees in March, a contractor builds the retargeting links in July, and the agreement was never anywhere the contractor could read it.
A locked vocabulary is a short document with a list of legal values for each field, owned by one person, where anything outside the list is a defect rather than a variation. The list lives next to the campaign calendar. New values get added by request, and the request takes about a minute, which is the point: the friction is small enough that people do it and large enough that they stop inventing values on their own.
I would rather have a slightly wrong locked vocabulary than a perfect one that nobody enforces. A show that decided in 2022 to call every paid social platform paid_social in the medium field, and stuck to it, can restate five years of history with one rule. A show that has fourteen ways of writing LinkedIn cannot restate anything without a person reading values one at a time.
The three fields, defined once
Source is the platform or property where the click started. One legal spelling per platform, lowercase, no spaces. Linkedin. Google. Meta. Bing. For a media partner, the publication's domain with the www stripped, so techweekly.com becomes techweekly. Source never changes because the ad format changed.
Medium is the mechanism, and specifically whether you paid for it and how it was delivered. Cpc for auction search, paid_social for bought placement in a feed, display for programmatic and direct banners, email for anything landing in an inbox you sent to, sms, print, and referral for links you did not pay for and did not send. The list of legal mediums should be short. If it grows past a dozen, somebody is encoding creative variations in the wrong field.
Campaign carries the edition code and the audience segment, joined by a hyphen. The edition code identifies one instance of one show, such as tech26, because years break the moment a show moves from November to February or runs twice. The segment names who the link was aimed at: tech26-lapsed, tech26-exhibitor-guests, tech26-new-buyers. Two facts in one field, both of which you will want to read on their own, and both recoverable by splitting on the hyphen.
That leaves utm_content for the creative or placement, and utm_id for the ad set or send identifier where the platform supports it. Google documents utm_id as the campaign ID, and it is the cleanest join key back to the platform's own reporting when you have one.
Two mechanical rules save more trouble than the definitions do. Everything is lowercase, because a browser will preserve the case you typed and your database will treat LinkedIn and linkedin as different strings, which is how six of those fourteen values came to exist. And no spaces anywhere, because a space becomes %20 in transit and comes back as a value that matches nothing. Pick one separator character for words inside a value and stay with it, because paid-social and paid_social are two different rows in every report you will ever build.
Collapsing fourteen values into one
The normalisation is a lookup applied at report time, never a rewrite of the registration file. The raw value stays in its own column, because the day somebody disputes a number you need to show what the row actually said.
| Legacy value in the file | Canonical source | Canonical medium |
|---|---|---|
| LinkedIn, linkedin, Linkedin, linked-in, LNKD, LI | (from medium field) | |
| LinkedIn Ads, li-ads, linkedin_ads, LinkedIn-Sponsored | paid_social | |
| linkedin paid, sponsored-linkedin, LinkedIn/CPC | paid_social | |
| linkedin.com | referral |
The last row matters more than it looks. A bare domain in the source column usually means the value was written by the analytics tool from a referrer, not by a person building a link, so it is organic traffic from the platform rather than bought placement. Mapping it to paid_social because it says linkedin would move 340 organic registrations into a paid channel and inflate every cost per registration calculation downstream by understating the denominator. Lowercasing is safe. Everything else needs a person to look once.
Across the five editions the whole exercise produced 63 mappings covering 61 raw source values and their medium pairs, and it took an afternoon. The output is that paid social carries 3,412 registrations, of which 1,190 sat under the spelling that happened to be most popular, and the other 2,222 were scattered across thirteen values small enough to be invisible.
How do you keep the next edition clean?
Three habits, and none of them is a tool purchase.
Build links from one builder. A spreadsheet with dropdowns for source and medium, free text only for the segment half of the campaign field, and a formula that assembles the url. Anybody can copy it. Nobody can type LinkedIn into it.
Run a weekly query for source values that have never been seen before. New value, more than five registrations, not in the legal list. That query returns nothing most weeks and returns something interesting the week an agency starts a new placement without telling you. The values it catches are the ones that would have become the fifteenth spelling.
Write the edition code into the calendar before the first link is built. Most tagging drift starts when a campaign goes live before anyone has decided what this edition is called, and a placeholder becomes permanent.
The medium field needs the same treatment as the source field and usually gets less attention, because everybody assumes it is obvious. In the same five edition file, the medium column held paid-social, paidsocial, paid_social, social-paid, social, and sponsored, which is six spellings for one mechanism and one genuine ambiguity, since social on its own could be organic. Fixing source without fixing medium leaves you with one clean platform name spread across six rows of the channel report, which is the same problem one level down.
One habit is worth more than the other three put together, and it is the one people resist. Give the agency the legal list in writing at the start of the contract, and put it in the same document as the reporting they are measured against. An agency tagging its own way is not being careless. It is using the convention from its last client, because nobody gave it yours.
Where a locked vocabulary stops
A tagging convention controls what a link says about itself. It has no opinion at all about whether that value survives the trip from the click to the registration row, and on a hosted registration platform the value is dropped often enough that clean tagging alone will not give you clean reporting. The hops where the tag dies are B2's subject, and they are worth testing before you conclude that a low paid social number is a demand problem.
A convention also does not tell you which channel a source and medium pair belongs to when the report has eight rows on it. That mapping is a separate rule set with its own ordering problem, which B5 covers, and keeping the two apart is deliberate: the vocabulary describes what happened, the taxonomy decides how it is presented.
The honest limit is that no vocabulary reaches the registrations that were never tagged at all. Somebody registering after reading a printed programme, or after a colleague pasted a link into a team chat, arrives with an empty source column no matter how disciplined the link builder is. Those rows have their own decomposition, which B7 works through, and on most shows they are a larger share of the file than any single paid channel.
Start with the query rather than the policy. Pull the distinct values of the source column for your current edition with a count against each, sort by count ascending, and read the bottom forty rows. That list is your convention document written backwards, and by the time you reach the end of it you will know which fields your team is actually using and which ones they have been quietly overloading. Then write the legal list, and put it in the same folder as the campaign calendar where the person building the next link will find it. The full acquisition and attribution picture rests on that column being one value per platform.
Questions people ask about utm tagging conventions
- What should utm_source be set to for event marketing?
- Set source to the platform or property where the click started, using one legal spelling per platform. Linkedin, google, meta, bing, and for a media partner the publication's domain without the www prefix. The platform name never changes because the format changed, so a sponsored post and a text ad on the same platform share a source and differ by medium.
- How do you fix inconsistent utm tags from previous years?
- Do not rewrite history in the registration file. Build a lookup table that maps every legacy value to a canonical one, apply it at report time, and keep the raw value in its own column. A show with five editions behind it usually needs between forty and eighty mappings, and the table is written once and extended by exception.
- Should the campaign parameter contain the year?
- It should contain an edition code rather than a year, because shows move dates and some run twice a year. An edition code such as tech26 identifies one instance of one show, and appending the audience segment after it lets you read acquisition by segment without a second field. Keep the two parts separated by a single hyphen.
Related reading
- Build a channel grouping taxonomy before you argue about attribution models
- How registration source tracking breaks between the ad click and the record
- What to do with the unattributed registrations sitting in your file