Marketing

UTM tagging that survives a real campaign

Campaign links get tagged in a hurry by four different people and the report comes out unreadable. Here is what each parameter is for, the failure modes that split one campaign into nine rows, and the convention worth agreeing before anything goes out.

By Rehan Idrisi · · 7 min read

Part of: Marketing

The campaign runs for six weeks. Then someone opens the report and finds one campaign spread across nine rows, three of them spelled differently, one of them crediting your own homepage as the traffic source. Nothing looked broken while it was live. The tagging was inconsistent from the very first link, and no amount of reporting fixes that after the money is spent.

UTM parameters are plain text stuck on the end of a URL. There is no validation, no autocorrect, and no warning when you get one wrong.

What each parameter carries

Five parameters exist. Three of them do almost all of the work.

  • utm_source: where the click came from. A platform or a property name, such as google, instagram or newsletter.
  • utm_medium: the type of traffic. cpc, email, social, affiliate. This is the field channel grouping keys off, so a typo here misfiles the entire campaign.
  • utm_campaign: the specific campaign a link belongs to. A sale, a launch week, an offer code.
  • utm_term: the paid keyword. Largely a legacy field now that ad platforms pass keyword data through their own integrations.
  • utm_content: the way to tell two links inside one campaign apart. Header button versus footer link, creative A versus creative B.

Analytics tools read these differently. GA4 derives its default channel grouping from source and medium together, so a utm_medium value outside the set it recognises lands your paid traffic in a bucket you did not intend. Ad platforms and email platforms usually report on their own click data and ignore your UTMs completely. Two dashboards disagreeing about the same campaign normally means each one is counting a different event, not that one of them is broken.

Case sensitivity quietly splits one campaign into several rows

Analytics treats Newsletter, newsletter and NEWSLETTER as three separate values. Nothing warns you. Clicks keep arriving, the campaign keeps running, and the total you wanted sits fragmented across rows that each look too small to bother with. Mixed separators make it worse, because diwali_sale, diwali-sale and diwali%20sale are three more distinct values stacked on top of the capitalisation problem.

Lowercase every UTM value, every time. Pick one separator and never mix it with another. That single rule removes most of the fragmentation teams spend hours cleaning up later.

Agree the convention before the campaign, not after it

A convention living in one person's head survives until the second person builds a link. The agency, the freelancer, whoever schedules the newsletter and whoever runs the paid account are all producing tagged URLs, often in the same week. Left to themselves, each will invent a perfectly reasonable convention of their own, and none of them will match.

  1. Fix the vocabulary. Write out the exact allowed utm_source and utm_medium values and treat anything outside that list as an error.
  2. Fix the format. Lowercase only, one separator, no spaces, no punctuation beyond the separator.
  3. Fix the campaign naming pattern, something like offer-season-year, so links sort sensibly and a name from last year still reads clearly.
  4. Keep one shared sheet of every tagged URL in the campaign, with its destination and who built it.
  5. Open the first link of every campaign in a browser and confirm it lands where you expect before anyone sends it anywhere.

Tagging internal links breaks attribution

This one catches experienced teams. A UTM on a link from your own homepage to your own product page tells analytics that a brand new campaign just delivered a visit, so the tool ends the current session and opens a fresh one attributed to whatever you typed. Whatever really brought that person to the site is gone from that point onward.

The damage compounds. Sessions inflate, because a single visit is now counted as two. Conversions get credited to an internal banner instead of the paid click or the organic search that earned them. Plenty of setups also throw a self-referral, where your own domain turns up in the source report sitting next to real traffic sources, which makes the whole table harder to read.

Track internal navigation with events. If you need to know a homepage banner drove product views, fire an event on the click or use a parameter your analytics does not treat as campaign data. Keep UTMs for links arriving from somewhere you do not own.

Redirects, shorteners and printed links

A UTM survives a redirect only when the redirect carries the query string forward. Plenty do not. A vanity URL rule written to send /sale to /collections/sale will strip everything after the question mark unless it was written to preserve it, and the visitor lands on exactly the right page with no campaign attached to the visit. Link shorteners vary too: some forward parameters untouched, some append their own, some drop them. Test the short link itself, not the long URL you pasted into the shortener.

Offline links need the same discipline. A QR code on a flyer, an insert card in a parcel or a sticker in a shop window is a measurable traffic source, and it stays invisible unless the URL it encodes carries its own tags. Tag first, generate second. Our QR code generator encodes whatever URL you hand it, parameters included, so the tagging decision happens before the code exists and not after five thousand flyers come back from the printer.

Never append to a URL without reading it first

Filtered collection pages, search results and some product URLs already carry a query string. The first parameter on a URL needs a question mark and every parameter after it needs an ampersand. Get that wrong and you produce a URL with two question marks, where everything after the second one gets read as part of a value. Your campaign data disappears into a filter parameter, and some servers reject the request outright.

Spaces are the other trap. A campaign name typed with a space in it gets percent-encoded by one tool, passed through untouched by another and turned into a plus sign by a third. Choose the separator, keep spaces out, and the question stops coming up.

Every unusable campaign report we have been handed failed for the same reason. Nobody agreed how to spell things before the links went out.

Auditing a campaign that already shipped is mechanical work. Pull every link out of the email HTML or the ad export, drop them into one column, and read the tags as a set instead of one at a time. Our text extractor lifts every URL out of a pasted block, and the inconsistencies become obvious the moment they sit next to each other.

Why do UTM links show the wrong source in analytics?

Usually the links were tagged inconsistently, or tagged internally. Different capitalisation and mixed separators split one campaign across several rows. A UTM on a link between two of your own pages ends the visitor's session and starts a new one, replacing the real original source with whatever that internal link happened to say.

Share this guideLinkedInXWhatsAppFacebook
All guides