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.

Terminal showing mlz build generating Triple Whale UTM parameters, correct lowercase facebook/paid-social (green check) vs malformed Facebook/Social (red cross) blocks, and assembled tracked URL pill.

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 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.

mlz build — Triple Whale campaign links by channel
# 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 — validate destination before Triple Pixel fires
$ 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. Facebook and facebook are treated as different sources — they produce separate channel entries rather than consolidating into a single Paid Social grouping. Paid Social and paid-social create 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. Use mlz build to 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_campaign is missing from a link, Triple Whale can't assign the attributed revenue to a campaign for the spend-to-revenue ROAS calculation. If utm_campaign doesn't match the campaign name or identifier expected by Triple Whale's ad platform integration, the join fails silently. Always include --campaign in mlz build for 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_medium values across channels — a mix of cpc, CPC, paid-search, and PPC used interchangeably across team members — cause sessions to match different attribution rules or fall through to unknown attribution entirely. mlz build enforces 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=Facebook instead of utm_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 from mlz build ensures 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. facebook for Meta and Instagram (both platforms use the same source — use utm_content or utm_medium to distinguish placements). google for all Google Ads placements. tiktok for TikTok Ads. klaviyo for Klaviyo email and SMS. attentive for Attentive SMS. pinterest for Pinterest Ads. Avoid brand variations: no FB, Google Ads, Instagram as a separate source from facebook, or Meta. 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-social for Meta, TikTok, Pinterest, and Snapchat paid placements. cpc for Google Search, Microsoft Search, and other paid search. display for Google Display Network and programmatic display. email for all email platform campaigns. sms for SMS platforms. organic for organic social posts. referral for referral link sources. Do not use social, Social, paid_social, or paidsocial — 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 the utm_campaign value 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 uses utm_content for 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_source or utm_medium value doesn't match Triple Whale's channel grouping rules. The most common causes: capitalization variants (Facebook instead of facebook), non-standard medium values (Social instead of paid-social), or missing UTM parameters entirely (sessions where no UTM was present when Triple Pixel fired). Use mlz build to 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=facebook value generated by mlz 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 on mlz build for 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 build generates 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, and utm_term parameters 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 to utm_medium=paid-social, which also maps to GA4's default "Paid Social" channel grouping. Use the same lowercase-hyphenated UTM values generated by mlz build for 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.

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.