UTM Tracking for Triple Whale: How to Build and Validate Campaign Links
Triple Whale reads UTM parameters via its first-party pixel (Triple Pixel) to power multi-touch attribution for Shopify stores. Unlike mobile MMPs with their own tracking link formats, Triple Whale uses UTM parameters as its native attribution mechanism — there is no Triplewhale link format, no tracking URL to configure. Every attribution model (First Click, Last Click, Linear, Position-Based, Data-Driven) reads directly from the utm_source, utm_medium, utm_campaign, utm_content, and utm_term values stored in the first-party cookie when Triple Pixel fires on pageview. Inconsistent formatting — a capitalized utm_source of Facebook instead of facebook, a non-standard utm_medium of Social instead of paid-social, a missing utm_campaign — silently breaks Triple Whale's channel grouping and campaign-level ROAS reporting without raising any errors. Build tracked URLs with mlz build --source "facebook" --medium "paid-social" --campaign "your-slug" to enforce the lowercase-hyphenated formatting Triple Whale requires, and validate with mlz check before the campaign goes live.
How Triple Whale reads UTM parameters for attribution
Triple Whale's attribution infrastructure is built on top of UTM parameters read by Triple Pixel, a first-party JavaScript pixel installed on the Shopify store. When a visitor lands on the store, Triple Pixel fires on pageview, reads any UTM parameters present in the URL, and stores them in a first-party cookie scoped to the store's domain. This avoids the third-party cookie restrictions that degrade multi-touch attribution on other platforms — because Triple Pixel writes to a first-party cookie, the UTM data persists across the attribution window configured in the Triple Whale dashboard.
Every attribution model in Triple Whale — First Click, Last Click, Linear, Position-Based, Data-Driven — reads from the UTM values stored in this cookie. For a multi-touch sequence (a customer clicks a Facebook ad, then a Google Shopping ad, then converts), each touchpoint's UTM parameters are captured separately and weighted according to the attribution model. This means every paid channel link driving traffic to the Shopify store needs correctly formatted UTM parameters or the touchpoint is invisible to Triple Whale's attribution models.
Triple Whale's channel grouping maps specific utm_source and utm_medium combinations to channels. This mapping is based on exact string matching. A UTM source value of Facebook (capitalized) does not match the channel rule for facebook (lowercase) — Triple Whale creates a separate unknown channel entry rather than grouping it with your other Facebook traffic. The same behavior applies to utm_medium: paid-social maps to the Paid Social channel, but Social, PAID_SOCIAL, or paidSocial fail the channel match and attribute to Unknown.
| utm_source | utm_medium | Triple Whale channel |
|---|---|---|
facebook |
paid-social |
✓ Paid Social |
google |
cpc |
✓ Paid Search |
klaviyo |
email |
|
Facebook (capitalized) |
paid-social |
✗ Unknown |
facebook |
Social (capitalized) |
✗ Misclassified |
Because Triple Whale operates on exact string matches, a single team member manually typing a UTM source with a capital letter is enough to fragment your channel reporting. DTC brands typically run campaigns from multiple team members across multiple ad platforms and email tools — each generating links with their own manual conventions. The result is attribution fragmentation that quietly accumulates over time: multiple channel entries for what should be a single source, ROAS figures split across variants of the same channel name, and campaign-level reporting broken by mismatched campaign slugs.
Building UTM-tagged links for Triple Whale campaigns with mlz build
mlz build generates UTM-tagged URLs with normalized, lowercase-hyphenated parameter values — the format Triple Whale's channel grouping expects. Pass the destination URL, source, medium, campaign, and optional content or term flags. Add --validate to confirm the destination resolves before Triple Pixel fires. The output tracked_url is ready to paste into your ad platform, email tool, or SMS platform link field.
# Meta / Facebook Ads campaign
$ mlz build \
--url "https://example.com/product" \
--source "facebook" \
--medium "paid-social" \
--campaign "summer-sale-jun-2026" \
--content "carousel-product" \
--validate
{
"tracked_url": "https://example.com/product?utm_source=facebook&utm_medium=paid-social&utm_campaign=summer-sale-jun-2026&utm_content=carousel-product",
"params": {
"utm_source": "facebook",
"utm_medium": "paid-social",
"utm_campaign": "summer-sale-jun-2026",
"utm_content": "carousel-product"
},
"stored": true
}
# Google Shopping campaign
$ mlz build \
--url "https://example.com/category" \
--source "google" \
--medium "cpc" \
--campaign "brand-shopping-jun-2026" \
--term "product-name" \
--validate
{
"tracked_url": "https://example.com/category?utm_source=google&utm_medium=cpc&utm_campaign=brand-shopping-jun-2026&utm_term=product-name",
"stored": true
}
# Klaviyo email campaign
$ mlz build \
--url "https://example.com/landing" \
--source "klaviyo" \
--medium "email" \
--campaign "abandon-cart-jun-2026" \
--content "email-1" \
--validate
{
"tracked_url": "https://example.com/landing?utm_source=klaviyo&utm_medium=email&utm_campaign=abandon-cart-jun-2026&utm_content=email-1",
"stored": true
}
mlz build always outputs lowercase parameter values. There is no way to accidentally produce utm_source=Facebook or utm_medium=Social through the CLI — the normalization is enforced at generation time, before the link is distributed to the ad platform. This is how you prevent the case fragmentation that silently splits Triple Whale channel reporting across capitalization variants generated by different team members or tools.
The tracked_url value from the JSON response is ready to paste directly into Facebook Ads Manager's destination URL field, Google Ads' final URL field, Klaviyo's email link field, or any other platform. The stored field confirms the link was saved to your MissingLinkz campaign library for future reference and link auditing.
Validating campaign links with mlz check before Triple Whale fires
Triple Pixel fires on pageview. If the destination URL is unreachable when a paid visitor lands on the page, or if a redirect in the chain strips the UTM parameters before the page loads, Triple Whale records no attribution for that session — the spend is invisible to the attribution model. mlz check validates the destination before the campaign launches: it confirms the URL resolves with a 200, that HTTPS is configured, that no redirect in the chain strips UTM parameters, and that response time is acceptable.
$ mlz check "https://example.com/product?utm_source=facebook&utm_medium=paid-social&utm_campaign=summer-sale-jun-2026"
{
"url": "https://example.com/product?utm_source=facebook&utm_medium=paid-social&utm_campaign=summer-sale-jun-2026",
"valid": true,
"checks": [
{ "check": "url_format", "status": "pass", "message": "URL format is valid." },
{ "check": "ssl", "status": "pass", "message": "URL uses HTTPS." },
{ "check": "resolution", "status": "pass", "message": "Destination responded with 200.", "details": { "status_code": 200, "response_time_ms": 218 } },
{ "check": "redirects", "status": "pass", "message": "No redirects detected." },
{ "check": "response_time", "status": "pass", "message": "Response time: 218ms.", "details": { "response_time_ms": 218 } }
],
"status_code": 200,
"response_time_ms": 218,
"validated_at": "2026-06-14T09:15:22.000Z"
}
Run mlz check on every campaign link before the ad goes live. This is especially important for Shopify stores where product and collection pages may redirect based on URL structure changes — a Shopify redirect that strips query parameters will silently drop all UTM values and break Triple Whale attribution for every session that lands on it. The redirects check confirms whether any redirect in the chain has dropped UTM parameters before the Shopify page loads and Triple Pixel fires.
Triple Whale UTM tracking gotchas
- Triple Whale is case-sensitive for utm_source and utm_medium — exactly like GA4
- Triple Whale's channel grouping uses exact string matching against UTM parameter values.
Facebookandfacebookare treated as different sources — they produce separate channel entries rather than consolidating into a single Paid Social grouping.Paid Socialandpaid-socialcreate different channel groupings; only the lowercase-hyphenated form maps correctly to Triple Whale's Paid Social channel. This case fragmentation is invisible in the ad platforms (Facebook Ads Manager will accept any capitalization in the UTM field) but immediately visible in Triple Whale's channel performance tables as unexplained "Unknown" channels and split attribution. Usemlz buildto enforce lowercase-hyphenated values — the output always normalizes to lowercase, preventing the case fragmentation that breaks Triple Whale channel groupings. - Missing utm_campaign breaks Triple Whale's campaign-level ROAS reporting
- Triple Whale calculates ROAS at the campaign level by joining ad spend data (pulled from Meta, Google, TikTok, and other ad platform APIs via Triple Whale's integrations) with attributed revenue (from Triple Pixel sessions tagged with UTM parameters). If
utm_campaignis missing from a link, Triple Whale can't assign the attributed revenue to a campaign for the spend-to-revenue ROAS calculation. Ifutm_campaigndoesn't match the campaign name or identifier expected by Triple Whale's ad platform integration, the join fails silently. Always include--campaigninmlz buildfor any paid campaign link, and use a campaign slug that corresponds to how the campaign is named in the ad platform. - Triple Whale's New Visitor Override and attribution windows depend on consistent UTM structure
- Triple Whale offers configurable attribution windows (1-day, 7-day, 14-day, 30-day click windows and view-through windows) and override rules such as "always attribute to the most recent paid touch." These rules operate on the UTM data stored in the Triple Pixel first-party cookie. Inconsistent
utm_mediumvalues across channels — a mix ofcpc,CPC,paid-search, andPPCused interchangeably across team members — cause sessions to match different attribution rules or fall through to unknown attribution entirely.mlz buildenforces a consistent naming taxonomy across all channels and team members by generating links from a single validated command rather than from individual manual entry. - Triple Whale's Sonar post-purchase survey also maps to UTM channels
- Triple Whale Sonar presents a post-purchase survey asking customers how they discovered the store. The survey response options are mapped to the same UTM-based channel taxonomy that Triple Whale's attribution models use. If UTM channels are malformed — a customer arrived via a link with
utm_source=Facebookinstead ofutm_source=facebook— the Sonar channel comparison data is also unreliable, because the self-reported channel can't be mapped back to a consistent attribution channel. Consistent UTM formatting frommlz buildensures Sonar survey data aligns with attribution model data across every channel, making the Sonar vs. attribution comparison meaningful rather than comparing inconsistent channel definitions.
Triple Whale UTM naming conventions
Recommended UTM parameter values for Triple Whale campaigns, aligned with Triple Whale's channel grouping expectations and a lowercase-hyphenated taxonomy enforced by mlz build:
- utm_source: lowercase platform name.
facebookfor Meta and Instagram (both platforms use the same source — useutm_contentorutm_mediumto distinguish placements).googlefor all Google Ads placements.tiktokfor TikTok Ads.klaviyofor Klaviyo email and SMS.attentivefor Attentive SMS.pinterestfor Pinterest Ads. Avoid brand variations: noFB,Google Ads,Instagramas a separate source fromfacebook, orMeta. Triple Whale's channel grouping rules map specific source strings to channels — deviation from the expected strings creates Unknown channel attribution. - utm_medium: must match Triple Whale's channel grouping expectations.
paid-socialfor Meta, TikTok, Pinterest, and Snapchat paid placements.cpcfor Google Search, Microsoft Search, and other paid search.displayfor Google Display Network and programmatic display.emailfor all email platform campaigns.smsfor SMS platforms.organicfor organic social posts.referralfor referral link sources. Do not usesocial,Social,paid_social, orpaidsocial— these do not match Triple Whale's Paid Social channel rule. - utm_campaign: lowercase-hyphenated campaign identifier. Include the time period to support ROAS reporting across campaign flights:
summer-sale-jun-2026,brand-search-always-on,abandon-cart-jun-2026. Triple Whale joins attributed revenue to ad spend using campaign identifiers — the more consistently theutm_campaignvalue maps back to a campaign in the ad platform, the more accurate the ROAS calculation. - utm_content: creative or ad set identifier for A/B testing and creative-level attribution.
carousel-lifestyle,static-product,video-15s-ugc. Triple Whale usesutm_contentfor creative-level attribution, making it the right place to distinguish ad creative variants running within the same campaign. Keep values lowercase-hyphenated to avoid splitting the same creative across capitalization variants. - utm_term: keyword or audience segment for search campaigns.
competitor-brand,product-category-keywords. Omit for social campaigns where keyword-level attribution is not applicable.
See the UTM naming conventions guide for the full cross-platform taxonomy reference and channel grouping alignment table.
FAQ
- Why does Triple Whale show "Unknown" for some of my traffic sources?
- Unknown channel attribution in Triple Whale almost always means the
utm_sourceorutm_mediumvalue doesn't match Triple Whale's channel grouping rules. The most common causes: capitalization variants (Facebookinstead offacebook), non-standard medium values (Socialinstead ofpaid-social), or missing UTM parameters entirely (sessions where no UTM was present when Triple Pixel fired). Usemlz buildto regenerate the affected campaign links with normalized values, update the links in the ad platforms, and monitor Triple Whale's channel grouping over the next campaign flight to confirm the Unknown percentage drops. Historical sessions that were captured with malformed UTMs will remain attributed to Unknown — the fix only applies prospectively to newly generated links. - Does Triple Whale work without UTM parameters?
- Triple Whale can still record sessions without UTM parameters, but it cannot attribute them to a specific channel, campaign, or creative. Sessions without UTM data appear as Direct in Triple Whale's attribution reports. Triple Whale's ad platform integrations (Meta, Google, TikTok) pull spend data regardless of UTM coverage — but without UTM data on the corresponding sessions, Triple Whale cannot calculate ROAS, cannot attribute revenue to specific campaigns, and cannot run multi-touch attribution models. UTM parameters are the minimum required input for Triple Whale's attribution to function. Every paid channel link driving traffic to the Shopify store needs UTM parameters present and correctly formatted.
- How do I fix split traffic sources in Triple Whale (e.g., "Facebook" vs "facebook")?
- Fixing split traffic sources requires updating the UTM values on the live campaign links. In Facebook Ads Manager, update the destination URL (or website URL field) for each affected ad to use the lowercase
utm_source=facebookvalue generated bymlz build. In Google Ads, update the final URL suffix or tracking template. New sessions after the link update will attribute to the correct channel. Sessions already recorded with the malformed UTM are historical and cannot be retroactively re-attributed — Triple Whale stores the UTM values captured at session time. To prevent future fragmentation, standardize onmlz buildfor all link generation across the team so no one is manually typing UTM values with different capitalizations. - Can I use Triple Whale and GA4 together with the same UTM parameters?
- Yes. Triple Whale and GA4 both read standard UTM parameters from the URL. Triple Pixel reads UTM parameters when it fires on pageview and stores them in a first-party cookie. GA4's measurement tag reads the same UTM parameters from the same URL query string and records them as session attribution in GA4. Both tools receive the same parameter values from the same URL. This means a correctly formatted UTM link — lowercase source, hyphenated medium, campaign slug — works simultaneously for Triple Whale's multi-touch attribution and GA4's session attribution without any modification.
mlz buildgenerates links that satisfy both platforms' formatting requirements in a single command. - Do I need to set up UTM parameters differently for Triple Whale vs GA4?
- No, the UTM parameter format is identical for both platforms. Both Triple Whale and GA4 read standard
utm_source,utm_medium,utm_campaign,utm_content, andutm_termparameters from the URL. Both platforms are case-sensitive and both have channel grouping rules that depend on exact string matching. The difference is which channel grouping rules each platform applies — Triple Whale's Paid Social channel maps toutm_medium=paid-social, which also maps to GA4's default "Paid Social" channel grouping. Use the same lowercase-hyphenated UTM values generated bymlz buildfor both platforms and they will both attribute the session correctly. See the UTM case sensitivity guide for detail on how case affects GA4 attribution alongside Triple Whale.
Related reading
Build Triple Whale-compatible tracked links from the terminal
mlz build enforces the lowercase-hyphenated formatting Triple Whale requires for accurate channel grouping and campaign-level ROAS reporting. Generate validated tracked URLs from the terminal or CI pipeline — no manual UTM entry, no capitalization variants, no unknown channels. Run mlz check on every link before the campaign launches to confirm the destination resolves and no redirect strips UTM parameters before Triple Pixel fires.
npm install -g missinglinkz
Free plan: 1,000 links/month. No credit card. See the UTM tracking for developers guide for the full programmatic workflow including API and MCP integration.