Skip to content

6 min read

UTM naming convention: a simple lowercase system that lasts

A UTM naming convention for founders: what each parameter is for, lowercase rules, example tags for X, Reddit, newsletters and podcasts, and the mistakes to avoid.

It's common to open the source report of a young SaaS and find Twitter, twitter, x, x.com and tweet as five separate rows. One channel, five names, and none of them can be compared month to month without a cleanup first. Someone tagged links by hand, a little differently each time.

A UTM naming convention prevents this. It doesn't need to be clever. It needs to be short enough to remember, written down somewhere you'll see it, and applied to every link you create from now on.

What each UTM parameter is for

There are five standard parameters. Each answers one question, and most mistakes come from making one parameter answer another's question.

  • utm_source: where the click came from. The platform, site or publication: x, reddit, newsletter, producthunt.
  • utm_medium: what kind of channel it is. Pick from a short fixed list: social, email, community, podcast, cpc, referral.
  • utm_campaign: which effort it belongs to. A launch, a post you're promoting, a sponsorship: pricing-launch-2026-03, stripe-metadata-post.
  • utm_content: which link within that effort. The placement or variant: story, bio, thread, show-notes.
  • utm_term: the paid search keyword. It was designed for search ads. If you aren't running them, leave it empty.

A good way to hold it in your head: source and medium together name the channel, campaign names the push, content names the specific link.

A lowercase UTM convention you can keep

These rules fit on an index card.

  1. Lowercase everything. Most analytics tools treat Reddit and reddit as different values. Lowercase removes the decision entirely.
  2. Hyphens between words. No spaces, no underscores, no camelCase. Spaces get encoded as %20 or + depending on who built the link, and then you have two values again.
  3. Source is a platform, never a piece of content. reddit, not my-launch-post.
  4. Medium comes from a fixed list. Six values is plenty. Write them down and don't add a seventh without a reason.
  5. Campaigns are stable and readable. Use the slug of the thing you're promoting, or a short name plus the month: black-friday-2025-11. You should be able to tell what it was a year later.
  6. Log every link. A spreadsheet with the date, the full URL and where you posted it. This is the step people skip and the one that saves the most time.

One judgment call to make once: whether forums and launch sites count as social or get their own medium. The convention below uses social for social networks (X, Reddit, Instagram) and community for founder forums and launch sites (Indie Hackers, Product Hunt). Either choice is fine. Mixing them is not.

Example UTM tags for X, Reddit, newsletters and podcasts

Where the link goesutm_sourceutm_mediumutm_campaignutm_content
Post on Xxsocialstripe-metadata-postthread
Your own newsletternewsletteremailissue-2026-03header-link
Reddit postredditsocialpricing-launch-2026-03r-saas
Indie Hackers postindiehackerscommunitymilestone-postpost
Product Hunt launchproducthuntcommunitypricing-launch-2026-03listing
Instagram storyinstagramsocialblack-friday-2025-11story
Podcast guest spotshow-namepodcastguest-episode-2026-03show-notes

Put together, the Reddit row becomes:

https://example.com/pricing?utm_source=reddit&utm_medium=social&utm_campaign=pricing-launch-2026-03&utm_content=r-saas

A few notes on specific rows.

Newsletters. For your own list, newsletter as the source is fine. For a sponsorship in someone else's newsletter, the source is that publication's name, and the medium stays email.

Instagram. Stories with a link sticker and the link in your bio are separate placements, so give them different utm_content values. Bio links have quirks of their own, covered in Instagram link-in-bio tracking.

Podcasts. Nobody types a tagged URL they heard out loud. Give the host a short path like example.com/podcast and make it redirect to the full tagged URL. The visitor's browser lands on the final address with the parameters intact, so your tracking sees them. The show notes can carry the tagged link directly.

Common UTM mistakes

Tagging internal links

UTM parameters describe how someone arrived at your site. Putting them on a banner from your blog to your pricing page tells your analytics the visitor just arrived from a campaign. In session-based and last touch reports, that replaces the real source, so the Google visitor who clicked your banner now looks like campaign traffic. Use plain links internally. If you want to know which internal links get clicked, that's an event, not a UTM.

Mixed case and inconsistent spelling

This is the one from the opening. X, x and twitter split one channel into three rows. Lowercase plus a written list of source names fixes it going forward. For old data, you'll have to merge values by hand in whatever report you use.

Using utm_source for the post title

It's tempting to tag a promoted post as utm_source=my-stripe-post because that's the thing you care about. Then every channel report fills with post titles, and you can no longer answer "how much came from Reddit". The post belongs in utm_campaign. The platform belongs in utm_source. The landing page itself is already recorded by any tool that tracks visits, so you rarely need to encode it at all.

Medium values your analytics tool doesn't recognize

If you use GA4, its default channel grouping reads utm_medium and expects familiar values such as email, social, cpc and referral. Custom values it doesn't recognize, like community or podcast, can end up in an Unassigned bucket. That's a reason to check how your tool groups channels before you finalize your list, not necessarily a reason to drop useful mediums. More on the differences between tools in GA4 vs Plausible for SaaS.

Forgetting that tagged links travel

Someone copies your tagged link from X and pastes it into a Discord. Every click from there is credited to X. There's no clean fix. Expect a small amount of this noise and don't read too much into a single surprising row.

How UTMs interact with attribution

UTMs matter most for the first visit, because that's the one a first touch model keeps. A clean tag on the link that introduced a customer stays attached to them for as long as you report on them. The trade-offs between crediting that first visit or the last one are in first touch vs last touch attribution.

In Joinsight, UTM source and medium are the first thing checked when assigning a visit to a channel, ahead of ad click IDs and the referrer, so a consistent convention shows up directly in the channel report. There's a campaign link builder in the app, which keeps link building in one place instead of in a dozen browser tabs.

See what makes you money.

Connect Stripe or RevenueCat and Search Console, and you see combined MRR and 16 months of search history on day one. Page and keyword revenue follow as the snippet collects first touches.

No card required. The trial clock starts when your first revenue source connects.