UTM parameter setup
How Prism reads your campaign URLs, a per-platform cheat sheet, and the tagging mistakes we see most often.
UTM parameters are the single most important thing you control that affects how accurate Prism's attribution is. Bad UTMs don't show up as broken — they show up as inflated "Direct" traffic, mysterious orders from channels you stopped advertising on weeks ago, and ROAS numbers that don't match reality.
This guide covers what UTMs are, the five parameters, what Prism actually does with them, naming conventions, per-platform setup, and the mistakes we see most often.
If you just want the answer for one platform, jump to the per-platform cheat sheet.
The 60-second version
UTMs are query string parameters you bolt onto a URL to tell analytics tools where the traffic came from. They look like this:
There are five UTMs. The two that matter most for channel classification are
utm_source and utm_medium. The other three (utm_campaign, utm_content,
utm_term) are for breakdowns inside a channel.
If you're spending money on a paid platform, every link in every ad should have UTMs. If you're sending an email or SMS, every link should have UTMs. If you're posting organically on social, UTMs are nice-to-have but not strictly required (Prism can usually figure it out from the referrer).
How Prism classifies channels (the real answer)
When Prism receives a page view, it runs through a priority-ordered list of rules and uses the first one that matches. Understanding this order is the difference between "I'll tag everything carefully" and "I'll tag everything carefully and still know what Prism is going to do with it."
The priority order, from highest to lowest:
- Platform click IDs (
gclid,fbclid,gbraid,wbraid,ttclid,msclkid,li_fat_id,epik,ScCid,rdt_cid,twclid) - UTM combinations for paid traffic (e.g.,
utm_source=google+utm_medium=cpc→ Google Ads) - UTM medium for owned channels (e.g.,
utm_medium=email→ Email) - Referrer domain for organic traffic (e.g., referrer ends with
instagram.comand no paid medium → Meta Organic) - Referrer fallback — any external referrer that didn't match a known pattern → Referral
- Direct — no referrer, no UTM → Direct
- Other — anything left over → Other
Two consequences of this order that surprise people:
- Click IDs always win. If Meta's auto-tagging slaps an
fbclidonto a URL that you've already taggedutm_source=email, the visit gets classified asmeta_paid. The click ID rule has higher priority than the UTM rule. Always. - Your
utm_sourcecan get ignored. Rules at priority 2 need bothutm_sourceANDutm_mediumto match. If you setutm_source=metabututm_medium=email, the paid-Meta rule fails, and the email rule (which only needsutm_medium) wins. You'll see this traffic as "Email", not "Meta Ads." See contradictory combos below.
A note on case sensitivity
Prism lowercases utm_source and utm_medium before matching, so Email,
EMAIL, and email all resolve to the same channel. But other tools in your
stack — GA4, Klaviyo, Shopify reports — don't all normalize case. Use lowercase
everywhere so the same campaign reads the same across every dashboard you look at.
The five parameters
| Parameter | Required? | What it represents | Example |
|---|---|---|---|
utm_source | Yes (for paid) | The platform or site sending the traffic | meta, google, klaviyo, partner-name |
utm_medium | Yes (for paid) | The type of traffic | paid_social, cpc, email, sms, affiliate |
utm_campaign | Strongly recommended | Your campaign's name | spring-sale-2026, welcome-flow, bf-cyber-monday |
utm_content | Optional | Distinguishes ads within a campaign (different creatives, ad copy A/B) | video-15s, carousel-3, cta-shop-now |
utm_term | Optional | The keyword (for paid search) | running+shoes, vegan-protein |
Do I need to manually set this up in all ad channels?
No, most major ad platforms handle this by default. But you always have the optionality to manually set it up across campaigns/ads, if you wish to customize.
What happens if you skip utm_campaign: The visit still classifies into the
right channel, but the Campaign Drill-Down view in Prism shows it as
(no campaign). You lose the ability to compare campaigns against each other
within a channel, which is most of the value of campaign-level reporting. Tag it.
What happens if you skip utm_content and utm_term: Nothing breaks. These
only matter if you want ad-level or keyword-level breakdowns in addition to
campaign-level. For most stores, campaign-level is enough.
Naming conventions
These aren't rules Prism enforces — they're conventions that prevent you from
having spring_sale, spring-sale, Spring Sale, and SpringSale show up as
four different campaigns in your reports.
| Rule | Why |
|---|---|
| Always lowercase. | Other analytics tools (GA4, Klaviyo) treat Email and email as different values. Even though Prism normalizes case, your other tools won't. |
| Hyphens, not underscores or spaces. | Underscores work but read poorly in URLs. Spaces get encoded to %20, which is ugly and easy to break. bf-cyber-monday not bf cyber monday or bf_cyber_monday. |
| No special characters. | &, ?, =, #, +, % will all break your URL parsing if not properly encoded. Stick to letters, numbers, and hyphens. |
| Use a consistent date format. | 2026-03 is better than mar-2026 because it sorts correctly alphabetically. |
| Pick a convention and write it down. | Whatever you decide — even an imperfect convention applied consistently is better than a perfect convention applied half the time. Document it somewhere your team can see it. |
A workable convention for most stores:
Per-platform cheat sheet
These are the values you should use on each platform. If you're using auto-tagging features (notes after the table), you can sometimes skip manual tagging — but the cheat sheet shows what Prism is expecting to see, regardless of who put it there.
| Platform | utm_source | utm_medium | Notes |
|---|---|---|---|
| Meta Ads (Facebook + Instagram paid) | meta, facebook, instagram, fb, or ig | paid_social, paid-social, cpc, ppc, or paid | The fbclid click ID will classify the click as Meta even without UTMs, but tag anyway so utm_campaign flows through. |
| Meta Organic (Facebook + Instagram posts) | meta, facebook, instagram | omit, or use a non-paid medium like social | The referrer from facebook.com / instagram.com will catch this automatically; UTMs are optional. |
| Google Ads | google | cpc, ppc, paid, or paidsearch | If you've enabled auto-tagging in Google Ads (the default), you'll get gclid automatically and don't need manual UTMs. See note below. |
| Google Organic | (auto-detected from referrer) | (auto-detected) | Don't tag organic Google traffic. Let the referrer do it. |
| Microsoft Ads (Bing) | bing or microsoft | cpc, ppc, or paid | The msclkid click ID is the strongest signal. |
| TikTok Ads | tiktok | paid_social, paid-social, cpc, ppc, or paid | ttclid click ID also works. |
| TikTok Organic | (referrer-based) | — | Bio links and organic posts caught via referrer. |
| LinkedIn Ads | linkedin | paid_social, cpc, ppc, or paid | li_fat_id click ID. |
| Pinterest Ads | pinterest | paid_social, cpc, ppc, or paid | epik click ID. |
| X / Twitter Ads | twitter or x | paid_social, cpc, ppc, or paid | twclid click ID. |
| Snapchat Ads | snapchat or snap | paid_social, cpc, ppc, or paid | ScCid click ID. |
| Reddit Ads | reddit | paid_social, cpc, ppc, or paid | rdt_cid click ID. |
| YouTube Ads | youtube or yt | cpc, ppc, paid, or video | YouTube ads run through Google Ads. |
| Klaviyo email | klaviyo | email | Klaviyo will auto-append these if you turn on UTM tracking in Settings → UTM Tracking. |
| Mailchimp email | mailchimp | email | Turn on link tracking in your campaign settings. |
| Generic email | newsletter or email | email | Anything with utm_medium=email classifies as Email. |
| SMS (Klaviyo, Postscript, Attentive, etc.) | Your SMS provider name | sms or text | Most SMS tools have a "shorten and append UTM" setting. |
| Push notifications | Your push tool | push or push-notification | — |
| Affiliate / influencer link | The partner's name or your affiliate platform (refersion, impact) | affiliate | Both work — utm_medium=affiliate alone is enough to classify as Affiliate. |
| Display / programmatic banner | The DSP name | display, banner, or cpm | Catches anything served on a display network. |
Auto-tagging vs manual tagging
Some platforms attach their own tracking parameter automatically, with no work on your side. These are reliable and Prism prefers them when available:
- Google Ads — auto-tagging is on by default in modern Google Ads accounts. It appends
gclidto your final URL. You can leave manual UTMs blank if you trust yourgclid. Most operators still setutm_campaignso they get a clean campaign name in non-Google tools. - Meta Ads — does not auto-tag with UTMs. You have to set them manually in the Ads Manager URL Parameters field. The
fbclidclick ID is appended by Facebook's link redirector and Prism recognizes it, but you still need UTMs for campaign-level rollup. - TikTok Ads — has an auto-tagging toggle in the Tracking section of each ad. Turn it on; it sets
ttclid. - Email/SMS tools — most (Klaviyo, Mailchimp, Postscript, Attentive) have a setting that auto-appends UTMs to every link. Turn it on once and stop thinking about it.
Worked examples
Here are concrete URLs and what Prism does with each. These all come from the same classification rules that run in production — they're not aspirational. (Every URL below is replayed through the live classifier in our test suite, so this section can't quietly drift out of date.)
Example 1: A clean Meta paid URL
utm_source=metamatches the Meta paid rule.utm_medium=paid_socialis on the paid-medium list.- Classified as Meta Ads (
meta_paid). - Campaign drill-down shows
2026-03_spring-sale. Ad creative showsvideo-15s.
Example 2: A Google Ads click with auto-tagging only
gclidclick ID detected → highest priority rule fires immediately.- Classified as Google Ads (
google_paid). - No
utm_campaignset, so campaign drill-down shows(no campaign). This is fine if you're cross-referencing in Google Ads' own dashboard, less fine if you want everything in Prism.
Example 3: A Klaviyo welcome flow email
utm_medium=emailmatches the Email rule.- Classified as Email (
email). - Campaign drill-down shows
welcome-flow-day-1.
Example 4: An influencer link
utm_medium=affiliatematches the Affiliate rule.- Classified as Affiliate.
- Campaign drill-down shows
jane-launch-q1. You can see Jane's performance specifically by filtering onutm_source=jane-instagram.
Example 5: An organic Instagram link in bio (no UTMs)
- No UTMs, no click IDs.
- Referrer domain is
instagram.com→ matches the Meta Organic referrer rule. - Classified as Meta Organic (
meta_organic).
Example 6: A Meta ad that contradicts itself
utm_medium=emailis NOT in the paid-medium list, so the Meta Paid rule (which requires both source AND medium to match) fails.- The Email rule fires on
utm_medium=emailalone. - Classified as Email (
email). Theutm_source=metais ignored. - This is the most common contradictory-combo mistake — see below.
Common mistakes
Missing utm_campaign
The visit still classifies into the right channel, but every report that groups
by campaign collapses these orders into (no campaign). You lose the ability to
compare "spring sale" against "winter clearance" within Meta. Easy fix; just
tag it.
Typos in parameter names
utm_meduim (instead of utm_medium), utm_camapign, utm_soruce. These get
silently ignored by Prism's classifier — the rule for "utm_medium contains
paid" never sees the misspelled key, so it falls through. The traffic ends up
classified by referrer (probably Referral or Direct) and you'll have no idea why
your Meta spend looks like it's not driving anything.
Use a UTM builder template that copy-pastes a known-good URL, or a tool like Klaviyo's UTM Tracking settings that prevents typos by giving you dropdowns.
Tagging internal links
If a customer clicks an internal link on your site (say, a "Shop the Sale" button on your homepage) and that link has UTMs on it, the session restarts attribution. Prism sees the UTMs on the new page and treats it like a new visit from that source.
We see this most often when an internal navigation tile in a homepage hero is
built with the same URL template as the marketing team uses for their Klaviyo
emails — and the URL has ?utm_source=klaviyo&utm_medium=email baked in. The
result: every customer who clicks that homepage tile gets re-attributed to email
mid-journey.
Never put UTM parameters on links your own site uses. Strip them before publishing.
Tagging your own domain in utm_source
Don't do this. We've seen merchants use their own domain in utm_source to
track "newsletter signup popup → product page" navigation. The result: Prism's
referrer fallback rule treats the traffic as Referral from your own domain,
which inflates Referral and skews your channel mix.
If you want to track internal funnel steps, use an event tracker or a separate
URL parameter that isn't utm_*.
Contradictory UTM combinations
The most common one is utm_source=meta + utm_medium=email, usually because
someone copy-pasted a base URL and didn't update both fields. As shown in
Example 6 above, the channel ends
up as Email — utm_source is effectively ignored.
Other contradictions we've seen:
utm_source=google&utm_medium=email(Google email blast?) → classifies as Email. Theutm_medium=emailrule wins.utm_source=email&utm_medium=cpc→ classifies as Email.utm_source=emailis enough to trigger the Email rule on its own, so thecpcmedium is ignored.
The pattern in both: when a source or medium value matches an owned-channel rule (like Email), that rule fires and the rest of the URL stops mattering. Audit your URLs before launching a campaign. If you'd want a person reading the URL to interpret it the same way Prism does, you're probably fine.
Auto-tagging on top of manual tagging
If you set utm_source=google&utm_medium=cpc manually AND Google auto-tagging is
on, you'll get both UTMs and gclid on the same URL. The click ID wins (it's
higher priority), so the manual UTMs get ignored — but utm_campaign still flows
through for campaign drill-down. No harm done, just be aware that your manual
utm_source value isn't actually doing anything.
Verifying your UTMs in Prism
After you set up tagging on a campaign, the fastest way to verify is to:
- Click your own ad (or send yourself the email) from a private/incognito window. Use your phone if you don't want to mess with browser sessions on desktop.
- Land on your site, click around a bit, maybe add something to cart.
- Wait 2–3 minutes.
- Open Prism → Attribution → filter by today's date.
- You should see a session attributed to the channel you expected.
For deeper verification, open the Customer Journey Sankey diagram and look at the most recent paths. You should see your test visit's channel as one of the entry points.
If a click is showing up as the wrong channel:
- Check the URL parameters in your browser's address bar after you land on your site (sometimes ad platforms strip or rewrite them).
- Cross-check the priority order in the How Prism classifies channels section. Click IDs always win.
- Look for typos in the parameter names.
- If you're auto-tagged by Google or another platform, the platform's tag may be overriding what you set manually.
When to ask for help
If you've gone through this guide and your channels still don't look right, email hello@theprismapp.com with:
- A specific example URL that's classifying wrong
- The channel you expected it to be
- The channel Prism actually shows
We'll trace it through the classifier and tell you what happened. If the issue is on Prism's side, we fix it. If it's a tagging mistake, we'll show you exactly what to change.