A UTM link in an email that's forwarded to someone else arrives with the original sender's UTM parameters intact — attributing that new visitor's session to the original campaign — which means email forwarding silently inflates campaign metrics in ways that are nearly impossible to detect and correct after the fact
The previous articles on this site covered UTM governance and naming, GA4 attribution models, UTM and duplicate content, and UTM attribution accuracy. This article addresses UTM parameter hygiene in edge cases — the specific scenarios where UTM parameters produce systematically wrong attribution data, and the architectural decisions that reduce these problems.
The email forwarding attribution problem
When someone forwards a marketing email, all the links inside it retain their UTM parameters. If the original email had utm_source=email&utm_medium=newsletter&utm_campaign=october-digest, a forwarded recipient who clicks the link is attributed to the newsletter campaign — even though they received the email through forwarding, not directly from the mailing list.
The scale of this problem is difficult to estimate because analytics can't distinguish a direct recipient from a forwarded recipient. In B2B contexts where procurement decisions involve sharing vendor emails with colleagues, forwarding rates can be substantial — potentially 5-20% of "email" attributed sessions may actually be forwarded links.
Partial mitigations:
- Link expiry: use time-limited UTM parameters (or redirect links that expire) so forwarded emails after a certain date return a landing page without UTM attribution
- Personalized URLs (PURLs): generate unique landing page URLs per recipient that can identify when the same URL is accessed by someone whose email doesn't match the original recipient's profile
- Accept the noise: for most use cases, the measurement error from forwarding is within the noise level of other attribution uncertainties
Click ID parameters and UTM co-existence
Advertising platforms add their own tracking parameters alongside UTMs — and these can interact in unexpected ways:
Facebook (Meta) Ads: adds fbclid=... — a click identifier that allows Facebook's conversion API to match conversions back to specific ad interactions
Google Ads: adds gclid=... (Google Click Identifier) — as covered in the previous attribution article, this interacts with manually-added UTM parameters in Google Ads
Microsoft Ads: adds msclkid=...
TikTok Ads: adds ttclid=...
The problem: these click ID parameters can make URLs extremely long and can conflict with custom URL parameters your site uses. More importantly, when a user copies a URL from their browser and shares it (via messaging, email, or social media), the click ID parameters travel with it — attributing the recipient's session to the original paid click.
This is the click ID equivalent of email forwarding: a product URL copied from an ad click, pasted into a Slack message, and clicked by three colleagues, attributes all four sessions (original + three colleagues) to the paid ad click.
The mitigation: strip click ID parameters from shareable URLs after the conversion measurement is complete — some analytics platforms can be configured to clean these from canonical URLs, or CleanURI.js patterns can strip them client-side after capturing them for analytics.
UTM parameters in subdomains: the cross-domain tracking problem
For sites spanning multiple subdomains (e.g., www.example.com, shop.example.com, blog.example.com), UTM parameters have a specific tracking gap:
When a user arrives at www.example.com from a UTM-tagged email link, the session is attributed correctly. When they navigate to shop.example.com to complete a purchase, most analytics implementations lose the UTM session — because the cross-subdomain navigation is treated as a new session, attributed to "direct" or "referral" from www.example.com.
GA4's cross-domain measurement solves this by propagating session data across configured domains and subdomains via a URL parameter (_gl=...). This requires:
- Configuring all subdomains in the GA4 cross-domain settings
- Verifying that the
_glparameter is being appended to cross-subdomain links - Testing the full funnel across subdomains to confirm UTM attribution persists
Without this configuration, UTM data from acquisition campaigns won't attribute to conversions that complete on a different subdomain — underreporting campaign conversion rates.
Single-page applications and UTM capture
SPAs (Single-Page Applications) built with React, Vue, or Angular handle routing client-side — the URL changes without a full page reload. This creates a UTM capture challenge:
The problem: when a UTM-tagged URL loads an SPA, the initial page load captures the UTM parameters in analytics. If the SPA's router then immediately redirects to a "clean" URL (removing query parameters for cleaner appearance), the UTM parameters may be lost before they're fully processed.
Timing matters: GA4's page_view event fires when the analytics library initializes. If the client-side redirect happens before initialization completes, the UTM may not be captured.
The correct pattern for SPAs:
- Capture UTM parameters from
window.location.searchimmediately on page load - Store them in sessionStorage
- Attach them to subsequent conversion events even if the URL has changed
- Pass them to server-side event tracking (via GA4 Measurement Protocol or similar) for conversion attribution
UTM in multi-touch attribution reports
UTM parameters capture the session's acquisition source. GA4 and most analytics tools can report on UTM data in two models:
Last-touch attribution: the UTM from the most recent session before conversion gets full credit. A user who arrived from Google Ads, returned via email, then converted — the email gets 100% credit.
First-touch attribution: the first UTM-tagged session gets credit. In the same example, Google Ads gets 100% credit.
Linear/time-decay/data-driven attribution: credit is distributed across all touchpoints. These models require understanding the complete UTM history of the user's journey.
The UTM capture limitation: GA4's UTM data is session-level — it captures the source of each session, but a user's full multi-session journey (across days or weeks) is only visible in GA4's Attribution reports, not in basic session-level reporting. Users who clear cookies or switch devices may have their journey fragmented.
How to use the UTM Builder on sadiqbd.com
- For email campaigns: always include utm_content to identify the specific link within an email (which CTA was clicked) — this distinguishes conversion signals from different links in the same newsletter
- For cross-subdomain campaigns: verify cross-domain measurement is configured in GA4 before launching any campaign that involves a conversion path crossing subdomains — otherwise UTM attribution will be lost at the subdomain boundary
- For paid ads with auto-tagging (Google Ads): don't add manual UTM parameters to Google Ads destination URLs — let GCLID handle attribution and configure the GA4-Google Ads link instead
Frequently Asked Questions
Can UTM parameters be set programmatically in JavaScript without appearing in the URL?
Not directly — UTM parameters are URL-based by design. However, GA4's set command and the Measurement Protocol allow sending session/event data with source/medium/campaign attributes without those attributes being in the URL. Some implementations capture UTMs from the landing URL and then re-send them with subsequent events server-side — maintaining attribution without UTM parameters persisting in all subsequent URLs the user sees. This is useful for SPAs or for clean URL aesthetics, but requires custom server-side analytics implementation rather than basic client-side GA4 tag setup.
Is the UTM Builder free? Yes — completely free, no sign-up required.
Try the UTM Builder free at sadiqbd.com — build properly formatted UTM tracking URLs for any channel and campaign.