Guide4 min read

UTM links, explained for people who hate UTM links

What UTM links are, the tags worth using, how to name them so your reports stay clean, and how to see which post made the sale, not just which app.

You posted a video on TikTok, a carousel on Instagram and a link in your newsletter. Sales came in. Now your analytics says most of them came from “Direct”, which tells you nothing.

UTM links fix that. They look ugly, the name means nothing, and most guides make them sound like a spreadsheet job. They’re simpler than that. Here’s everything you need, and nothing you don’t.

A UTM link is your normal link with a few labels on the end. This is a plain link:

Text
https://yourshop.com/presets

And this is the same link with labels:

Text
https://yourshop.com/presets?utm_source=tiktok&utm_medium=social&utm_campaign=spring-drop

Both open the same page, and your visitor sees nothing different. But when they land, your analytics reads the labels and files the visit under TikTok, social, spring drop. The labels travel with the click, so they work even when the app the visitor came from doesn’t say where they were.

That last part matters more than it sounds. Many apps open links in their own built-in browser, and those don’t always pass along where the visitor came from. Without a label, those visits can end up counted as Direct. With one, they’re counted where they belong.

The five tags, and the ones worth using

There are five UTM tags. You need three of them most of the time, and a fourth once you post a lot.

  • utm_source: where the click came from. tiktok, instagram, youtube, newsletter.
  • utm_medium: what kind of traffic it is. social, email, or cpc for paid ads.
  • utm_campaign: which push it belongs to. spring-drop, black-friday, launch.
  • utm_content: which post or version. unboxing-video, carousel-3. This is the one that tells two posts on the same app apart.
  • utm_term: the keyword, for paid search ads. Skip it unless you run those.

Name them once, the same way every time

Most UTM pain comes from names that drift. UTM values are kept exactly as you typed them, so TikTok, tiktok and tik-tok become three separate rows that should have been one. A few rules keep things clean:

  1. Use lowercase for everything.
  2. Use hyphens instead of spaces: spring-drop, not Spring Drop.
  3. Pick one name per place and never vary it. If it’s tiktok today, it’s tiktok next year.
  4. Keep mediums to a short, fixed list: social, email, cpc, referral.
  5. Keep a note of the names you’ve used, so next month’s links match this month’s.

The medium is worth getting right, because it decides the channel a visit lands in. In odo, a medium of social files the visit under Organic Social, email or newsletter under Email, and cpc, ppc or anything starting with paid under Paid. Get the medium wrong and a paid ad can pass for free traffic.

A worked example

Say you sell a $29 preset pack and post three videos this week. Give each one its own link, changing only utm_content:

Text
?utm_source=tiktok&utm_medium=social&utm_campaign=spring-drop&utm_content=before-after
?utm_source=tiktok&utm_medium=social&utm_campaign=spring-drop&utm_content=tutorial
?utm_source=tiktok&utm_medium=social&utm_campaign=spring-drop&utm_content=day-in-life

A week later, the numbers might look like this (example numbers):

  • before-after: 900 visits, 3 sales
  • tutorial: 250 visits, 7 sales
  • day-in-life: 400 visits, no sales

The video that sent the most people didn’t sell the most. Without utm_content, all three would be one line called TikTok: 1,550 visits, 10 sales, and no idea which video to make more of.

Each post gets its own link, so visits, sales and revenue add up per post, not per app.

Where to put them, and where not to

Use a tagged link anywhere you share your site from somewhere else:

  • your link in bio (change utm_content when you change which post it’s for)
  • YouTube descriptions and pinned comments
  • newsletter buttons
  • posts in communities and Discord servers
  • ads, unless the ad platform already tags them for you

Don’t tag links between your own pages. A visitor who’s already on your site arrived from somewhere, and that’s what you want to keep. Tagging your own menu or buttons only muddles it.

odo reads all five tags from the page a visit starts on, along with where the visitor came from. Tags win over the referrer, so a tagged link opened in an in-app browser still lands in the right place. odo also understands the shorter ref, via and source parameters, and the click ids that ad networks like Google, Microsoft and TikTok add to their links, which file a visit under Paid.

In the Sources card you can switch between Channel, Source and Campaign, and tap any row to narrow the whole dashboard to it: its visitors, its pages, its countries and, once your payments are connected, its sales.

The campaign follows the sale, too. When a sale odo has traced lands on your dashboard, its card says where the buyer came from, campaign included, with your hyphens read as spaces: TikTok · “spring drop” · Berlin.

You also don’t have to build links by hand. odo makes a tracked link for each post: choose the platform, name the post, and it writes the UTM link for you, then shows the visits, sales and revenue that link brought in. Which post made the sale walks through it end to end.

One honest limit. For a sale to count against a link, odo has to trace the payment back to the visit. That works with Stripe, Lemon Squeezy, Polar, Paddle, Gumroad, Dodo Payments, Shopify and WooCommerce, and with purchases your own site reports to odo. Sales from platforms like Tebex, Patreon or Ko-fi still count in your total, but they can’t be tied to a visit.

A tagged visit, followed from the post to the landing page, the checkout and the sale.

Once your links are tagged, the next question is which visitors are worth the most: revenue per visitor covers that. Plans are priced by your website traffic, and every one traces sales to visits: see pricing.

Keep reading