Your first client is free.

UTM Naming Convention Template

A taxonomy that keeps one channel on one row. Most broken UTM reporting is not missing tags, it is the same channel spelled three ways.

Lowercase everywhere. GA4 treats Meta and meta as two sources.
utm_sourceutm_medium
metapaid_social
tiktokpaid_social
linkedinpaid_social
googlecpc
googledisplay
youtubevideo
newsletteremail
partnerreferral

The five parameters, filled in

Pick a channel and a campaign to see the whole set, and the URL it produces.

utm_source
metaThe platform. One spelling per platform, forever.
utm_medium
paid_socialHow it was paid for. Groups channels in reporting.
utm_campaign
nike_meta_pur_nl_brdMatches the campaign name in the ad account.
utm_term
brdAudience on social, keyword on search.
utm_content
ugc_painpoint_hook03_sarah_v2The creative. The column that tells you what worked.
Resulting URL

https://example.com/product?utm_source=meta&utm_medium=paid_social&utm_campaign=nike_meta_pur_nl_brd&utm_content=ugc_painpoint_hook03_sarah_v2&utm_term=brd

The rules that actually matter

Lowercase, without exception

This is the single highest-value rule. Analytics tools do not fold case, so one capital letter creates a duplicate row that will quietly split your numbers for months before anyone notices.

One separator

Underscores inside values, nothing else. Spaces get encoded inconsistently, hyphens are fine but must not be mixed in, and a value containing both is impossible to split back apart.

Source is the platform, medium is how you paid

Getting these the wrong way round is common and breaks the default channel grouping. meta / paid_social, not paid_social / meta.

Campaign mirrors the ad account

The utm_campaign value should match the campaign name where the money is spent. Anything else means joining spend to sessions by hand.

Never tag internal links

A UTM on a link between your own pages restarts the session and reassigns the conversion away from whatever paid for the visit. Inbound only.

Leave a parameter out rather than empty

utm_term= is a value as far as most tools are concerned. If a channel has no keyword, omit the parameter entirely.