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.
- Lowercase everything. Most analytics tools treat
Redditandredditas different values. Lowercase removes the decision entirely. - Hyphens between words. No spaces, no underscores, no camelCase. Spaces get encoded as
%20or+depending on who built the link, and then you have two values again. - Source is a platform, never a piece of content.
reddit, notmy-launch-post. - Medium comes from a fixed list. Six values is plenty. Write them down and don't add a seventh without a reason.
- 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. - 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 goes | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Post on X | x | social | stripe-metadata-post | thread |
| Your own newsletter | newsletter | email | issue-2026-03 | header-link |
| Reddit post | reddit | social | pricing-launch-2026-03 | r-saas |
| Indie Hackers post | indiehackers | community | milestone-post | post |
| Product Hunt launch | producthunt | community | pricing-launch-2026-03 | listing |
| Instagram story | instagram | social | black-friday-2025-11 | story |
| Podcast guest spot | show-name | podcast | guest-episode-2026-03 | show-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.