UTM Naming Conventions for Affiliates: A Schema You Can Join On

Most UTM advice is written for a marketing team with one website, one analytics property and a shared spreadsheet. Affiliates have none of those things. You have four traffic sources, eleven angles, a redirect chain, a checkout on somebody else's domain, and revenue that arrives in instalments over the following two months.

So the goal here is narrower and more useful than tidy reporting. The goal is a join key. When a rebill posts on day 30, you need to be able to say which creative caused it, and the only way that sentence is ever true is if you decided on the naming scheme before the click, not after the money.

This is the schema I would set up on day one if I were starting again.

Disclosure: ClickerVolt is our product. We aim for fairness in every comparison: we credit competitors where they excel and only highlight genuine gaps. All pricing and features are verified against live sources.

The Rule That Matters More Than the Schema

Lowercase everything. All six parameters, all values, no exceptions, forever.

GA4 treats UTM values as case sensitive. utm_source=Facebook and utm_source=facebook are recorded as two different source values and show up as two separate rows in acquisition reports. GA4 does not lowercase before storing, it does not merge rows that differ only by case, and once a value is recorded you cannot retroactively rename it. This behaviour is reported consistently by every analytics practitioner I checked on 2026-08-20; Google does not publish an explicit statement about normalisation, so treat it as strongly reported rather than vendor-quoted, and then behave as if it is true, because the downside of being wrong in the other direction is a permanently split report.

Same rule for separators. Pick hyphens and never use anything else. Spaces become %20 and then become a different value than the same word without the space. Underscores inside values collide visually with the underscore in the parameter names when you are reading a raw URL at midnight.

Lowercase, hyphens, no spaces, no ampersands inside values. That is the whole style guide and it prevents more damage than the rest of this article combined.

The Six Slots

Six slots, one job each Parameter Answers Example value utm_source Which platform sent the click facebook utm_medium What kind of traffic it was paid-social utm_campaign Which offer and which angle cb-keto-fear-us utm_content Which creative and which lander vid07-lp3 utm_term Which audience or keyword lal1-purch-45plus utm_id The stable token everything joins on fb-2608-ktf-07 FIVE DESCRIBE. ONE JOINS. Click identifiers decay Google keeps a GCLID for 90 days, then the upload is refused outright Your own token does not utm_id is yours, it never expires, and it survives every rename upstream

Five parameters exist so a human can read the report; the sixth exists so a machine can join a day-30 rebill back to a click.

utm_source: the platform, never the account

One word, one platform. facebook, google, tiktok, taboola, newsletter. Not facebook-ads-account-2, not fb, not FB. If you run six ad accounts on Meta they are all facebook, because the source answers "where did this human come from" and the human did not come from account 2.

utm_medium: a closed list you write down once

This is the field everyone improvises and then regrets. Fix the vocabulary on day one and never add to it without deciding it belongs: paid-social, paid-search, native, push, pop, email, organic-social, referral. Eight values. If a ninth is genuinely needed, add it to the written list rather than typing it into a URL builder at two in the morning.

utm_campaign: offer, angle, geo

Three components, hyphen separated, in the same order forever. cb-keto-fear-us reads as ClickBank keto offer, fear angle, US traffic. Whatever segments you choose, the point is positional consistency: the second segment is always the offer, the third is always the angle. That is what makes the field sortable six months later.

utm_content: creative and lander together

vid07-lp3. Creative identifier, then the landing page variant. This pairing is the one that answers your most common actual question, which is whether the winning combination was the video or the page. Keep the creative identifier stable across platforms so the same asset carries the same name everywhere.

utm_term: the audience, not just the keyword

Search borrowed this field for keywords, but on paid social it is the natural home for the targeting: lal1-purch-45plus. Fill it in. An empty slot is a question you will not be able to answer later.

utm_id: the one that actually matters

This is the field affiliates skip and should not. GA4 recognises utm_id as the campaign identifier and it is the field designed to line your data up with an imported cost or conversion file. More importantly for this business, it is a token you invent, which means it does not expire, does not change when someone renames a campaign in Ads Manager, and does not care that Google will refuse a GCLID upload 90 days after the click.

Keep it short, structured and unique per launch: fb-2608-ktf-07 for the Facebook launch on 26 August of the keto fear angle, creative seven. That string is the primary key of your entire attribution story.

Why the Join Key Is the Whole Point

Here is the sequence that decides whether your reporting is real.

Day 0: the click arrives with all six parameters. Your tracker parses them and stores them against the click record alongside whatever click identifier the platform supplied.

Day 0: the sale posts back from the network. It carries your sub-ID, and your sub-ID carries the utm_id, so the sale joins cleanly.

Day 30: the rebill posts. It carries the same sub-ID. It joins to the same utm_id. You can now say, truthfully, that creative seven produced continuity revenue.

Day 45: the refund posts. Same join, opposite sign.

At no point in that sequence did you need the platform's click identifier to still be valid. That matters, because the platform's identifier is on a clock and yours is not. Google keeps a GCLID for 90 days and refuses an offline conversion uploaded after that. Your own token has no expiry because nobody else issued it.

Two honest limits, because this is a tutorial and not a pitch. A clean UTM schema does not extend Meta's seven-day Conversions API window by a single hour, and nothing in this article claims it does. And utm_id only survives to the postback if you actually pass it into your sub-ID, which is a configuration step in your network's link builder, not something the schema does for you.

Passing It Through the Chain

Three failure points, all of them common.

The redirect. Every hop that does not forward query strings deletes your parameters. Test the full chain end to end with a real click and read what arrives, rather than trusting that a shortener preserves them.

The sub-ID. Networks give you two to five sub-ID slots. Put the utm_id in the first one, always the same one, on every offer. Consistency here is worth more than cleverness, because a postback that returns fields in a different order per network is unjoinable in aggregate.

The lander. If the visitor moves from your prelander to a second page of yours, the parameters have to travel with them or the checkout-side session starts anonymous. Append them to the outbound link.

The Five-Minute Audit

Run this before your next launch.

  1. Take one live link and click it yourself. Copy the URL that lands. Are all six parameters present and lowercase?
  2. Open your tracker's click detail for that click. Are all six stored as separate fields, not concatenated into one string?
  3. Find a conversion from last month. Does it show a utm_id, and does that utm_id match a launch you can name?
  4. Sort your source report. Do you see the same platform twice with different capitalisation? If so, that split is permanent for the historical rows, so fix the emitter today and annotate the date.
  5. Check one postback payload. Is the sub-ID carrying the utm_id, or is it carrying a network click reference that means nothing on your side?

If step three fails, everything downstream of it is guesswork dressed up as a dashboard.

Where This Leaves You

A UTM schema is not reporting hygiene. It is the only durable identifier you control in a chain where every other identifier belongs to somebody else and expires on their schedule.

ClickerVolt stores the parsed parameters against the click record so a later conversion joins on your token rather than on a platform identifier that may already have aged out, and you can see the click detail view here. That is standard tracker behaviour and I am not going to dress it up as a differentiator.

The part that is genuinely yours to fix is the naming. Write the six slots and the closed medium list into a document this afternoon, put it where whoever builds your links can see it, and stop improvising values into a URL builder. It is the cheapest thing on this entire site and it is the reason a day-30 rebill either has a name attached or does not.

Ready to Track Smarter?
Start for free — every feature, no credit card, no trial countdown.
Try ClickerVolt Free →
500 events/month free · All features included · No credit card