Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.linkutm.com/llms.txt

Use this file to discover all available pages before exploring further.

Why this matters

Every marketer on your team types UTMs differently. Newsletter vs newsletter vs news_letter creates three separate rows in GA4. Six months later, your channel attribution is split across dozens of near-duplicate source/medium combos and no one can tell you what drove pipeline last quarter. A naming convention costs 30 minutes to set up. The cleanup it prevents costs weeks.
This is an opinionated default. Pick the parts that fit your team, enforce them with UTM Rules, and update the vocab list quarterly. A convention that gets followed beats a perfect one that doesn’t.

The format

utm_source   = {channel}
utm_medium   = {traffic-type}
utm_campaign = {quarter}-{theme}
utm_content  = {creative-variant}
utm_term     = {paid-keyword}          ← paid search only
Rules that apply everywhere:
  • Lowercase only: google not Google
  • Hyphens between words: q2-launch not q2_launch not Q2 Launch
  • No spaces, no slashes, no special characters
  • No dates inside utm_campaign (the date is in your analytics tool, not your UTM)
  • No PII: no email addresses, user IDs, or names

Parameter guide

utm_source: where the traffic came from

Use the platform name, lowercase, hyphen-separated. Lock this to a fixed vocab list.
ValueUse for
googleGoogle Ads, Google Shopping
metaFacebook Ads, Instagram Ads
linkedinLinkedIn Ads
tiktokTikTok Ads
xX (Twitter) Ads
newsletterYour own email sends
youtubeYouTube Ads or organic video
podcastPodcast sponsorships
affiliateAffiliate/referral partners
partner-{name}Named partnerships, e.g. partner-hubspot
directQR codes, offline, vanity URLs
organic-socialNon-paid social posts (Instagram, LinkedIn, X)
Don’t use email as a source. It’s ambiguous. Is it your newsletter, a cold outreach sequence, or a transactional send? Use newsletter, outbound, or transactional instead.
Enforce it: Add an allowed_values rule on utm_source in UTM Rules. Anyone using an off-list value gets a rejection on save, not a messy row in GA4 three weeks later.

utm_medium: what kind of traffic

Medium = the marketing mechanism, not the platform.
ValueUse for
cpcCost-per-click paid search (Google, Bing)
paid-socialAny paid social placement
emailAll email: newsletter, nurture, outbound
displayBanner/programmatic display
videoPre-roll, connected TV, YouTube TrueView
affiliateRevenue-share or performance partner links
organic-socialNon-paid social posts
podcastAudio sponsorship read
qrQR codes (physical → digital)
referralInbound from other sites (unpaid)
GA4 uses medium to populate the Default channel grouping report. Stick to these values and your channels will auto-group correctly. Invent your own and they fall into “Unassigned.”

Pattern: {quarter}-{theme}
q1-brand-search
q2-pricing-relaunch
q3-enterprise-outbound
q4-black-friday
evergreen-free-trial
Rules:
  • Always start with the quarter (q1 / q2 / q3 / q4) or evergreen for always-on
  • Theme is 1-3 words, hyphen-separated, describing the campaign’s purpose
  • No year in the value; your analytics date filter handles that
  • Same campaign name across all channels that belong to one campaign
If your Google Ads and your newsletter and your LinkedIn post are all promoting the same Q2 pricing page, they should all share utm_campaign=q2-pricing-relaunch. That’s how you see cross-channel campaign performance in one row.

utm_content: which creative or placement

Use utm_content to tell variants apart within a campaign + channel combo. Common patterns:
PatternExampleUse for
{creative-name}hero-cta-blueA/B ad creative variants
{placement}sidebar footer inlinePlacement within a page/email
{subject-line-variant}subject-a subject-bEmail subject line tests
{cta-copy}start-free-trial see-pricingCTA copy variants
{format}video static carouselAd format
Leave utm_content blank in templates; fill it per link. If you bake it into a template, every link inherits the same content value and the variant data is useless.

utm_term: paid search keywords only

utm_term = the keyword that triggered the ad. Used almost exclusively for paid search.
utm_term=utm+tracking+tool
utm_term=link+shortener+for+marketing
utm_term=bitly+alternative
If you’re not running paid search: leave it empty. Don’t repurpose utm_term for audience segments or targeting notes; that data belongs in your ad platform, not your UTM.

Channel cheatsheet

Copy-paste starting points per channel. Fill utm_campaign and utm_content per link.

Bad to good examples

BeforeProblemAfter
utm_source=EmailCaps → splits from email in GA4utm_source=newsletter
utm_source=emailAmbiguous. Which email type?utm_source=newsletter
utm_medium=Social MediaSpaces + capsutm_medium=paid-social
utm_campaign=Q2 2025 CampaignSpaces, caps, yearutm_campaign=q2-brand-awareness
utm_campaign=newsletter_may_19_2025Date baked in, will duplicate each weekutm_campaign=q2-weekly-digest
utm_content= (empty)No way to tell creative variants apartutm_content=hero-cta
utm_term=linkedinTerm field used for channelDelete; that’s what source/medium is for
utm_source=FBAbbreviation, won’t match meta filterutm_source=meta
utm_campaign=testWill pollute prod data, no meaningBlock with UTM Rules prohibited values

Enforce it with UTM Rules

Setting this convention once doesn’t help if someone ignores it two weeks later. Pair this playbook with UTM Rules to make the convention self-enforcing. Minimum ruleset to configure:
1

Force lowercase + hyphen

Enable forceLowercase: true and set spaceCharacter: "-". This catches 80% of drift automatically.
2

Lock utm_source to your vocab

Add a Required Field rule: validationType=allowed_values on utm_source. Paste in your approved source list. Anyone using FB, Email, or Insta gets rejected on save.
3

Lock utm_medium to your vocab

Same rule on utm_medium. Your allowed list: cpc, paid-social, email, display, video, affiliate, organic-social, podcast, qr, referral.
4

Require utm_campaign

Required Field rule: validationType=not_empty on campaign. No campaign name, no link saved.
5

Block test / draft values

Add prohibitedValues: ["test", "draft", "tbd", "todo", "xxx"]. Prevents test links from leaking into production data.
6

Auto-fill medium from source (optional)

Add Conditional Logic rules for common pairs:
  • if source=google → set medium=cpc
  • if source=newsletter → set medium=email
  • if source=meta → set medium=paid-social
Reduces manual entry errors on high-volume link creation.

Governance

A naming convention rots if no one owns it. Assign these before you ship.
RoleResponsibilityCadence
Convention owner (usually MOPs lead)Approves new source/medium values, updates UTM Rules allowed lists, resolves disputesOn-demand + quarterly review
All link creatorsUse linkutm templates for every new link; never hand-type UTMsPer link
Analytics ownerFlags new GA4 “Unassigned” rows as signal that convention has driftedWeekly
Adding a new source or medium:
  1. Convention owner approves the new value
  2. Add it to the allowed_values list in UTM Rules
  3. Create a new template for the channel (see Create a template)
  4. Update this playbook
Don’t let individuals add new values ad hoc. One rogue utm_source=IG takes one week to create and six months to clean up.

Quick-start checklist

1

Copy the allowed source and medium lists above

Edit them to match your actual channels. Delete any you don’t use.
2

Configure UTM Rules

Minimum: forceLowercase, source allowed_values, medium allowed_values, campaign not_empty.
3

Create templates for your top 5 channels

Newsletter, Google Ads, Meta, LinkedIn, and your highest-volume partner. See Create a template.
4

Run your existing links through the audit

Filter GA4 → Source/Medium report → look for rows with caps, spaces, or off-list values. Those are your cleanup targets.
5

Share this page with the team

Bookmark it. Link to it in your team wiki. This is the source of truth, not a Notion doc only you can find.