UTMs: the five query params that decide your channel

UTMs are five query parameters you add to a URL so the landing page — and everything downstream — knows which campaign, source and medium sent the visit. They are boring. They are also the only reason "Google / CPC" and "newsletter / email" are not both filed under Direct.

If you ship a vibe-coded app and then run ads, UTMs are the first thing that breaks, because nobody owns them. The ad account has one convention. The founder pastes another. GA4 invents a third.

The five fields

Param

What it is

Example

utm_source

Who sent the click

meta, google, newsletter

utm_medium

The mechanism

cpc, email, organic

utm_campaign

The named effort

prospecting-us, launch-week

utm_content

The creative or link

blue-hook, footer

utm_term

The keyword (search)

marketing attribution

You need source, medium and campaign. Content and term are optional and useful. Everything else (utm_id, custom params) is gravy.

How they become a channel

FunnelKeeper resolves a channel from UTM + click IDs + referrer, in that order. A gclid still wins as Google Ads even if someone forgot the UTM. A Meta click with utm_source=facebook and one with utm_source=meta are the same channel if you map them — and two channels if you do not.

Pick one vocabulary and write it down:

  • Sources: meta, google, newsletter, linkedin

  • Mediums: cpc, email, organic, referral

  • Campaigns: yyyy-mm-name, lowercase, hyphens

Then use that list in every ad account, every email tool, and the first-party snippet. FunnelKeeper's browser snippet keeps first-touch and last-touch in localStorage so a later signup still carries the original UTM.

The mistakes that dump paid into Direct

  1. No UTMs on the ads. The landing URL is the naked domain. The click ID may still save you on Google; Meta is less forgiving once the referrer is stripped.

  2. In-page redirects that drop the query string. A pretty /go that 302s to / without forwarding location.search wipes the only evidence.

  3. Mixed case and synonyms. Facebook vs facebook vs fb vs meta. Pick one.

  4. Tagging internal links. UTMs on your own nav overwrite first-touch and make "the campaign" equal "the user clicked pricing."

  5. Using the ad platform's auto-tag and then also a handmade UTM that disagrees. One source of truth. Prefer the platform template, documented.

A template you can paste

https://yoursite.com/start?utm_source=meta&utm_medium=cpc&utm_campaign=2026-08-prospecting&utm_content=hook-a

In Google Ads, use ValueTrack:

{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={keyword}

Do not invent a sixth param named ref and hope GA4 notices.

What FunnelKeeper does with them

MySQL event maps can carry utm / gclid / referrer / channel columns. Those resolve through the same attribution helper that the first-party snippet uses, and they write events.channel plus identity first/last touch so revenue can attribute. Email-only identity maps no longer mint duplicate people.

If you never send UTMs, we will still join what we can (click IDs, GA4 channel grouping). The leftover is unattributed, on its own line. Start free and we will not smear it.

FAQ

Do I need UTMs if I have gclid / fbclid? Click IDs identify the ad click. UTMs name the campaign in your own vocabulary. Use both. Do not make them disagree.

Should every link on the site have UTMs? No. External campaigns yes. Internal navigation no.

What about utm_source=chatgpt? Fine, if you actually control that URL. Most AI-referred visits arrive as Direct. Ask on the signup form; do not invent a UTM you never put on a link.