UTM Tracking The Omni Standard
UTMs are the connective tissue between ad spend and revenue. Without a consistent standard, every dashboard lies — Meta claims the lead, Google claims the lead, and the client stops trusting the numbers. This is the single source of truth for how Wundertre tags every clickable link in every campaign.
Why UTMs belong in the Omni system
UTMs are what let LeadSprout, GA4, and CRM reporting tell the same story. When a lead comes in, four answers must be immediate: which channel, which campaign, which ad set or ad group, which creative. Without them, you cannot optimize — you're guessing. Three Omni tenets depend on this discipline.
Most businesses vs. The Omni Way
- Mix "Meta", "meta", "facebook-ads", and "fb" in the same account
- Hardcode campaign names into the UTM instead of using macros
- Skip utm_content — no idea which ad drove the lead
- Tag internal navigation links and overwrite the original source
- Route clicks through redirects that strip parameters
- Turn off auto-tagging in Google Ads and lose gclid
- Canonical platform names — facebook, google, tiktok, linkedin, bing, reddit
- Dynamic macros so every ad self-tags from its object name
- utm_content on every creative for ad-level attribution
- Zero UTMs on internal links — attribution stays intact
- Every click ID passed through so LeadSprout can dedupe and match
- Auto-tagging ON everywhere it exists (gclid, fbclid, msclkid, li_fat_id)
The five UTM parameters
Every tagged URL uses the same five keys. What changes is how you fill them in — always via the platform's dynamic macro, never hardcoded per ad.
facebook, google, tiktok, linkedin, bing, reddit, youtube. GA4's default channel groupings key off these exact strings. Never use the client's brand name here.paid_social, cpc, video, display, email, sms. This matches the OS defaults and GA4's channel-grouping rules; a hyphen breaks the classification.{campaignname} (Google), {{campaign.name}} (Meta), __CAMPAIGN_NAME__ (TikTok). The macro resolves to the campaign object's name, so the name is the tag. Enforce the naming convention on the campaign, not the URL.{adgroupname}, {{adset.name}}, {creative.name}. This is what lets you tell which hook, image, or video actually drove the lead.{keyword} or {QueryString}. Paid social: the ad-name macro ({{ad.name}}) or audience name. The most granular dimension in the tag.Wundertre OS tracking templates
These are the exact strings the Wundertre OS applies by default. Paste them into the field named in each card — do not modify the macros or parameter order. Names in { } and {{ }} are platform-side macros that resolve at click time from your campaign, ad set, and ad names.
gclid; this suffix layers keyword, ad, and campaign detail on top.fbclid; the UTMs below pull campaign / ad set / ad names.ttclid for click-ID passback.li_fat_id.msclkid; suffix layers keyword, match type, and campaign detail.Per-channel values at a glance
When you're wiring a new channel or auditing an existing one, this is the reference for what should be in utm_source, utm_medium, and which click ID to expect.
| Channel | utm_source | utm_medium | Click ID |
|---|---|---|---|
| Meta (Facebook / Instagram) | facebook | paid_social | fbclid · auto |
| Google Search | google | cpc | gclid · auto |
| Google Performance Max / Display | google | pmax or display | gclid · auto |
| YouTube Ads | youtube | video | gclid · auto |
| TikTok Ads | tiktok | paid_social | ttclid · macro |
| LinkedIn Ads | linkedin | paid_social | li_fat_id · auto |
| Microsoft (Bing) Ads | bing | cpc | msclkid · auto |
| Reddit Ads | reddit | paid_social | rdt_cid · macro |
| Programmatic / DV360 | dv360 or stackadapt | display or video | platform-specific |
| CTV / Streaming | ctv | video | n/a |
| Email (broadcast) | email | email | n/a |
| SMS | sms | sms | n/a |
| QR / print / billboard / mailer | qr | print, ooh, or direct-mail | n/a |
Non-negotiables before you go live
Every campaign clears this checklist before spend starts. A missing UTM found post-launch means backfilled attribution gaps you'll never fully recover.
- Tracking template pasted into the correct field (Final URL suffix / URL Parameters / Tracking URL / Destination URL).
- Campaign, ad set, and ad names follow the Wundertre naming convention — those names become the UTM values through the macros.
- Auto-tagging is ON everywhere it exists — gclid, fbclid, msclkid, li_fat_id.
- Test click on the ad preview — GA4 Realtime and LeadSprout show the correct source within 60 seconds.
- No UTM tags on internal links (site nav, footer, buttons on landing pages).
- Redirects (bit.ly, vanity domains) pass parameters through — verify with a live test click.
- utm_medium uses underscores (
paid_social), not hyphens. - utm_source uses the platform's canonical name (
facebook, notmeta;bing, notmicrosoft).
Common mistakes — and what they cost you
meta instead of facebookpaid-social)Facebook vs facebook)utm_content. Ad-level attribution is destroyed — you'll never know which creative won.ttclid or rdt_cidThe Omni UTM standard, one screen
- Lowercase everywhere
- utm_medium uses underscores
- Hyphens inside values, never spaces
- Canonical platform names only
- utm_campaign = campaign macro
- utm_content = ad-set / ad-group macro
- utm_term = keyword or ad macro
- Naming convention lives on the object
- Auto-tagging ON — gclid, fbclid, msclkid, li_fat_id
- Manual macros — ttclid, rdt_cid
- Test click before launch
- Never UTM an internal link
