UTM Parameters
Chapter 7 — UTM Tagging Best Practices
By Shad Malik
Updated on Feb 14, 2026
UTMs only work when every click carries clean, consistent values from the first URL to the final page load. Discipline on casing, separators, and redirect behavior prevents split reporting and “(not set)” noise. Lock simple habits now to protect board-level attribution later.
Myth Debunk:
Casing “doesn’t matter.”
Many analytics and downstream tools treat parameter values as case-sensitive. “Facebook,” “facebook,” and “FB” are three different sources. Lowercase by rule, or edge-enforce it, to avoid fragmented reporting.
Many analytics and downstream tools treat parameter values as case-sensitive. “Facebook,” “facebook,” and “FB” are three different sources. Lowercase by rule, or edge-enforce it, to avoid fragmented reporting.
Consistency prevents split attribution
- Standardize lowercase for all parameter values.
- Pick one separator (hyphen or underscore) and use it everywhere.
- Lock one value per concept (e.g.,
utm_source=facebook) across all teams and tools. - Always include
utm_source,utm_medium, andutm_campaignon every trackable link.
Tagging habits that keep attribution clean
- Use all lowercase for parameter values.
- Avoid spaces and special characters; use one separator consistently.
- Always include source, medium, and campaign.
- Keep values human-readable and descriptive.
- Never include PII (emails, names, company domains).
- URL-encode values only when required; place UTMs before any # fragment.
- If aesthetics matter, shorten the final, fully tagged URL (not the base URL).
- Test every link through real placements, redirects, mobile, and email clients.
Behaviors that trigger data loss—and the fix
| Practice | Don’t | Do | Why It Matters |
|---|---|---|---|
| Casing | utm_source=Facebook |
utm_source=facebook |
Mixing case creates separate rows in analytics and CRMs. Two LinkedIn ad owners using “LinkedIn” vs “linkedin” split performance. Lowercase unifies data. |
| Separators | utm_campaign=spring launch |
utm_campaign=spring-launch |
Spaces are inconsistently encoded by tools, causing mismatched values between platforms. Hyphens preserve a single, readable value end-to-end. |
| Required params | Omit utm_medium |
utm_source=linkedin&utm_medium=paid-social&utm_campaign=finserv-demo |
Missing a primary parameter often maps to “(direct)” or “(none).” Revenue by channel disappears because the medium is blank. |
| Readability | utm_campaign=sp26lch |
utm_campaign=2026-spring-launch |
Opaque codes slow audits and cause mapping errors. Clear names speed QA and dashboard reviews, especially during executive readouts. |
| PII | utm_content=jane.smith@prospectco.com |
utm_content=abm-email-cta-a |
PII in URLs leaks via logs, screenshots, and forwards. Use neutral descriptors and variants like “cta-a” instead of identifiers. |
| Encoding hygiene | utm_campaign=EMEA Q1 |
utm_campaign=emea-q1 |
Email tools auto-encode spaces differently from ad platforms, creating duplicate campaign values. Remove spaces early. |
| Shorteners | Shorten first, then add UTMs | Build full UTM URL, then shorten | Shortened links redirect to the target you set. If you add UTMs after shortening, the redirect target won’t include them. Shorten the final tagged URL. |
| Redirects | /demo → /get-demo (drops query) | Ensure redirects pass the full query string | Some vanity or CDN rules strip queries. That breaks attribution. Enable “pass query string” on every hop. |
| Fragments | https://site.com/page#section?utm_source=... |
https://site.com/page?utm_source=...#section |
Anything after # is not sent to the server. Put UTMs before the # so analytics can read them. |
| Abbreviations | utm_medium=ps |
utm_medium=paid-social |
Ambiguous short codes derail channel mapping in BI and CRMs. Use explicit channel names your team recognizes. |
Why these habits stop common data loss
- Complete primary parameters prevent “(direct)/(none).” A sales email with no
utm_mediumoften lands as “direct,” masking email impact. - Lowercase and one separator prevent fractured datasets. “Newsletter,” “email,” and “Email” become three mediums, breaking channel rollups.
- Human-readable values reduce dashboard errors. When the CMO asks which campaign grew DACH, “dach-q2-expansion” is unambiguous during live analysis.
- PII avoidance reduces legal and reputational risk. URLs are logged, shared, and cached. Keep parameters clean of names and emails.
- Encoding discipline avoids tool-by-tool mutations. Removing spaces and reserved characters at the source keeps values consistent across platforms.
Run the UTM Survival Test (5 steps)
Use this quick loop before launch and during audits.
1) Click from the real placement
- From the live ad, email, or post, click the link. Confirm UTMs are present in the address bar before any # fragment.
2) Redirect integrity
- If you use vanity domains, link shorteners, or routing rules, ensure the final landing URL still has the exact query string. On CDNs/reverse proxies, enable “pass query string.”
3) Cross-environment checks
- Mobile: Test iOS and Android. Ensure deep links or app routing do not drop UTMs.
- Email: Send a staging email to Outlook and Gmail. Some clients rewrite links; the parameters must persist.
4) Analytics receipt
- Verify the destination analytics or app ingests the exact values and does not create new, unintended variants.
5) Shortener validation
- Expand the short link’s final destination. It must match your full, tagged URL exactly.
Guardrails that prevent silent failures
- Length discipline
- Keep the total URL under ~2,000 characters for broad compatibility.
- Keep each value under ~60–80 characters for readability and safe copies.
- Character hygiene
- Allowed: a–z, 0–9, hyphen (-), underscore (_).
- Avoid: spaces, ampersands in values, slashes, and punctuation that forces encoding.
- Controlled vocabulary
- Maintain a short, shared list of allowed values for each parameter (e.g., sources: google, linkedin, facebook; mediums: paid-search, paid-social, email). This is enough to align teams without designing a full naming convention here.
TrackFunnels Expert Tip:
If you control a CDN or reverse proxy, add a transform that lowercases only known UTM keys (
Clean UTMs are a small habit with outsized payoff. Lowercase, stable separators, complete parameters, zero PII, and a 5-minute survival test will keep your attribution intact when traffic hits real systems.
utm_source, utm_medium, utm_campaign, utm_content, utm_term) on incoming requests. Do not lowercase opaque identifiers like gclid or fbclid. Test on a staging host before rollout.Clean UTMs are a small habit with outsized payoff. Lowercase, stable separators, complete parameters, zero PII, and a 5-minute survival test will keep your attribution intact when traffic hits real systems.
Try This Now Assignment
Open your browser’s DevTools > Network tab. Click a live, tagged link from an ad or email.
- Observe each request until the final 200 OK.
- Each 301/302 should carry the full query string.
- If a hop drops UTMs, fix that redirect rule (enable “preserve query string” or update the target to include $query_string).
Test your knowledge
Loading quiz questions...