UTM Tracking for Rockerbox: How to Build and Validate Campaign Links
Rockerbox is a multi-touch attribution platform built for DTC and ecommerce brands that want ROAS data independent of ad platform self-reporting. The Rockerbox pixel fires on pageview and reads utm_source, utm_medium, utm_campaign, utm_content, and utm_term from the URL, storing them in a first-party cookie that persists across the customer journey within the attribution window. Rockerbox's channel mapping rules use string matching against these values to assign sessions to channels like Paid Social, Paid Search, Email, and Organic — but the matching only works if the parameter values are consistent and correctly formatted. A utm_source of TikTok (capitalized) does not match the tiktok pattern in your channel mapping configuration, creating an Unattributed entry instead of contributing to Paid Social ROAS. A utm_medium of Paid Social or paidsocial breaks channel grouping and splits your ROAS table. Missing utm_campaign makes campaign-level attribution reporting impossible. Build tracked URLs with mlz build --source "tiktok" --medium "paid-social" --campaign "your-slug" to enforce the lowercase-hyphenated formatting Rockerbox channel mapping expects, and validate destinations with mlz check before every campaign launches.
How Rockerbox reads UTM parameters for multi-touch attribution
Rockerbox's attribution model is pixel-based. The Rockerbox JavaScript pixel — typically installed via Shopify, Google Tag Manager, or direct script embed — fires on pageview and reads any UTM parameters present in the URL at that moment. The values are stored in a first-party cookie scoped to your store domain, where they persist across the attribution window (typically 30, 60, or 90 days depending on your Rockerbox configuration). This first-party approach means Rockerbox can build a multi-touch view of the customer journey that isn't broken by third-party cookie restrictions — but it also means every paid touchpoint must be UTM-tagged with consistently formatted parameters, or the touchpoint is unattributable.
Rockerbox processes channel attribution using a "Channel Mapping" configuration you set up in the Rockerbox dashboard. Channel groups are defined by matching rules against utm_source and utm_medium values. These rules can use exact matching, prefix matching, or wildcard matching depending on your configuration — but the common failure mode is when a URL uses a parameter value that doesn't match any defined rule. Sessions with unmatched UTM values fall through to an Unattributed bucket. Once a session is recorded as Unattributed, it cannot be retroactively reassigned to the correct channel — the historical attribution is permanently broken for that session.
Rockerbox's standard channel grouping maps these UTM combinations:
| utm_source | utm_medium | Rockerbox channel |
|---|---|---|
facebook |
paid-social |
✓ Paid Social |
tiktok |
paid-social |
✓ Paid Social |
google |
cpc |
✓ Paid Search |
klaviyo |
email |
|
TikTok (capitalized) |
paid-social |
✗ Unattributed |
facebook |
Paid Social (space + capital) |
✗ Unattributed |
fb (abbreviation) |
paid-social |
✗ Unattributed |
The Unattributed bucket in Rockerbox represents real ad spend with no visible ROAS. Every session in Unattributed corresponds to a paid visit where Rockerbox recorded a touchpoint in the customer journey but cannot assign it to a channel — making the ROAS for that channel appear artificially lower than actual performance. DTC brands running campaigns across Meta, TikTok, Google, Pinterest, and email simultaneously accumulate Unattributed volume quickly whenever different team members generate UTM links with different formatting conventions.
Building UTM-tagged links for Rockerbox campaigns with mlz build
mlz build generates UTM-tagged URLs with normalized, lowercase-hyphenated parameter values — the format Rockerbox channel mapping expects. Pass the destination URL, source, medium, campaign, and optional content or term values. The output tracked_url is ready to paste directly into the ad platform's destination URL field. Add --validate to confirm the destination resolves before the Rockerbox pixel fires on the first session.
# TikTok Ads campaign
$ mlz build \
--url "https://store.com/sale" \
--source "tiktok" \
--medium "paid-social" \
--campaign "bfcm-2026" \
--content "video-ugc-15s" \
--validate
{
"tracked_url": "https://store.com/sale?utm_source=tiktok&utm_medium=paid-social&utm_campaign=bfcm-2026&utm_content=video-ugc-15s",
"params": {
"utm_source": "tiktok",
"utm_medium": "paid-social",
"utm_campaign": "bfcm-2026",
"utm_content": "video-ugc-15s"
},
"stored": true
}
# Meta / Facebook Ads campaign
$ mlz build \
--url "https://store.com/product" \
--source "facebook" \
--medium "paid-social" \
--campaign "bfcm-2026" \
--content "carousel-lifestyle" \
--validate
{
"tracked_url": "https://store.com/product?utm_source=facebook&utm_medium=paid-social&utm_campaign=bfcm-2026&utm_content=carousel-lifestyle",
"stored": true
}
# Google Ads — branded search
$ mlz build \
--url "https://store.com/" \
--source "google" \
--medium "cpc" \
--campaign "brand-search-2026" \
--term "brand-keywords" \
--validate
{
"tracked_url": "https://store.com/?utm_source=google&utm_medium=cpc&utm_campaign=brand-search-2026&utm_term=brand-keywords",
"stored": true
}
mlz build always normalizes parameter values to lowercase-hyphenated format. There is no way to accidentally generate utm_source=TikTok, utm_medium=Paid Social, or utm_campaign=BFCM 2026 through the CLI — normalization is enforced at generation time, before the link is distributed. This prevents the case and format fragmentation that splits Rockerbox's channel attribution table across variants produced by different team members using spreadsheets or manual URL builders.
The tracked_url from the JSON output is ready to paste into TikTok Ads' landing page URL field, Meta Ads Manager's destination URL field, Google Ads' final URL field, or any other platform. The stored field confirms the link was saved to your MissingLinkz campaign library, giving you an audit trail of every generated link for campaign review.
Validating campaign links with mlz check before Rockerbox pixel fires
Rockerbox's pixel fires on pageview — if the destination URL redirects to a page that strips UTM parameters, or if the destination is unreachable when a paid visitor lands, Rockerbox records no attribution for that session. mlz check validates the destination before the campaign launches: it confirms the URL resolves with a 200 status, HTTPS is configured, no redirect in the chain strips UTM parameters, and response time is acceptable for paid traffic.
$ mlz check "https://store.com/sale?utm_source=tiktok&utm_medium=paid-social&utm_campaign=bfcm-2026"
{
"url": "https://store.com/sale?utm_source=tiktok&utm_medium=paid-social&utm_campaign=bfcm-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-18T08:14:22.000Z"
}
Run mlz check on every campaign link before activating the ad. This is especially important for Shopify stores where product pages, collection pages, and sale landing pages can redirect based on URL structure changes, product availability, or theme migrations. A Shopify redirect that doesn't preserve query strings silently drops all UTM parameters — the Rockerbox pixel fires on the final page but reads no UTM values, assigning the session to Direct instead of the paid channel. The redirects check in the output confirms whether any redirect in the chain drops query parameters before the page loads and the pixel fires.
Rockerbox UTM tracking gotchas
- Rockerbox channel mapping uses string matching — case variants create Unattributed sessions
- Rockerbox's channel mapping rules match against the exact string values in
utm_sourceandutm_medium. A rule configured fortiktokdoes not matchTikTok,TIKTOK, orTikTok Ads— each creates a separate, unmatched entry that falls through to Unattributed. This case fragmentation is invisible at the ad platform level (TikTok Ads Manager accepts any capitalization in the destination URL field) but immediately visible in Rockerbox as growing Unattributed volume and artificially depressed channel ROAS. Regenerate affected links withmlz buildusing normalized source values to prevent the fragmentation from recurring. Historical sessions with case-mismatched UTMs remain Unattributed — the fix only applies prospectively to newly generated links. - Non-standard medium values break Rockerbox channel grouping
- Rockerbox recognizes
paid-social,cpc,display,email,sms,organic,affiliate, andreferralas standard medium values that map to defined channels. Non-standard variants —paidsocial,social_paid,paid_social,Paid-Social, orsocial— do not match and create Unattributed channel entries. The most common source of non-standard medium values is manual UTM entry where team members use slightly different conventions: one usespaid-social, another usespaidsocial, a third usessocial.mlz buildenforces a consistent taxonomy across all team members — anyone generating links through the CLI gets the same normalized values. - Missing utm_campaign breaks Rockerbox campaign-level ROAS
- Rockerbox calculates ROAS at the campaign level by joining attributed revenue (from pixel sessions tagged with UTM parameters) with ad spend data pulled from platform integrations (Meta, Google, TikTok, etc.). The join key is the campaign name as reported by the platform integration, matched against the
utm_campaignvalue in the UTM-tagged session. Ifutm_campaignis missing from the link, or if the slug doesn't match how the campaign is named in the ad platform, the ROAS join fails silently. Always include--campaigninmlz buildfor any paid campaign, using a slug that corresponds as closely as possible to the campaign name in the ad platform. - Rockerbox's Unattributed bucket permanently captures malformed UTM sessions
- Unlike GA4, which sometimes allows retroactive reprocessing for certain attribution changes, Rockerbox captures sessions at pageview time and stores the UTM values as recorded. A session attributed to Unattributed due to a malformed UTM cannot be retroactively moved to the correct channel — the historical data is fixed at the time the pixel fired. This means the cost of a UTM formatting error in Rockerbox is permanent for the affected sessions: the ROAS data for that flight is understated for the correct channel and the error accumulates for as long as the malformed link is active in the ad platform. Catching formatting errors before link distribution — with
mlz buildfor generation andmlz checkfor destination validation — prevents permanent attribution gaps. - Shopify redirect rules can silently strip UTM parameters before the Rockerbox pixel fires
- Shopify stores frequently accumulate redirect rules from URL structure changes, product variant rewrites, and deprecated collection paths. Any redirect that doesn't preserve query strings drops all UTM parameters before the Rockerbox pixel fires on the final page. This is especially common with
301redirects created during Shopify theme migrations or URL canonicalization. The Rockerbox pixel fires on the final destination, reads no UTM values from the URL, and records the session as Direct. Runmlz checkon every campaign destination URL before launch to verify the full redirect chain preserves UTM parameters. Theredirectscheck confirms whether UTM parameters survive from the initial click URL to the final destination page.
Rockerbox UTM naming conventions
Recommended UTM parameter values for Rockerbox campaigns, aligned with Rockerbox's standard channel mapping and enforced by mlz build:
- utm_source: lowercase platform name with no spaces or abbreviations.
facebookfor all Meta placements (Facebook Feed, Instagram Feed, Stories, Reels — useutm_contentto distinguish placements).tiktokfor TikTok Ads.googlefor all Google Ads formats.pinterestfor Pinterest Ads.snapchatfor Snapchat Ads.klaviyofor Klaviyo email and SMS.attentivefor Attentive SMS.youtubefor YouTube Ads. Avoid abbreviations (fb,tt,gg) and branded variants (Meta,Google Ads,TikTok Ads) that won't match Rockerbox channel rules. - utm_medium:
paid-socialfor Meta, TikTok, Pinterest, and Snapchat paid placements.cpcfor Google Search, Microsoft Search, and all paid search.displayfor Google Display Network and programmatic display.emailfor all email marketing platforms.smsfor SMS platforms.organicfor organic social posts you want to track.affiliatefor affiliate and influencer campaigns. Do not use variants likesocial,paid_social,paidsocial, orPaid-Social— these break Rockerbox's channel grouping. - utm_campaign: lowercase-hyphenated campaign slug. Include a time or flight identifier for campaign-level ROAS join accuracy:
bfcm-2026,spring-sale-apr-2026,brand-search-always-on. The slug must match how the campaign is named in Rockerbox's platform integration as closely as possible to ensure accurate spend-to-revenue joins. - utm_content: creative or ad variant identifier for creative-level attribution.
carousel-lifestyle,video-ugc-15s,static-product-hero,story-swipe-up. Rockerbox usesutm_contentfor creative-level breakdowns in the Channels report. Always lowercase-hyphenated. - utm_term: keyword identifier for search campaigns only.
branded-keywords,competitor-brand,product-category. Omit for paid social campaigns.
For the full cross-platform UTM naming reference, see the UTM naming conventions guide and UTM tracking for developers.
FAQ
- Why does Rockerbox show high Unattributed in my channel report?
- Unattributed volume in Rockerbox almost always means
utm_sourceorutm_mediumvalues don't match any channel mapping rule. Check for capitalization variants (TikTokinstead oftiktok), non-standard medium values (social,paidsocial), missing UTM parameters on some links, or source abbreviations that don't match the channel rules. Export the Unattributed sessions from Rockerbox, identify the common malformed patterns, regenerate those links withmlz build, and update them in the ad platforms. New sessions will attribute correctly; historical Unattributed sessions cannot be retroactively reassigned. - Can I use the same UTM parameters for Rockerbox and GA4?
- Yes. Rockerbox and GA4 both read standard UTM parameters from the URL query string independently. Rockerbox's pixel reads them when it fires on pageview and stores them in a first-party cookie for attribution. GA4's measurement tag reads the same parameters from the same URL and records them as session attribution. Both tools receive the same parameter values from the same tracked URL. A
mlz buildoutput works simultaneously for Rockerbox multi-touch attribution and GA4 session attribution without any modification. See are UTM parameters case sensitive in GA4? for how GA4 handles the same case sensitivity issues Rockerbox faces. - Does Rockerbox work without UTM parameters?
- Rockerbox can record sessions without UTM data but cannot attribute them to a paid channel. Sessions without UTM parameters appear as Direct in Rockerbox's reports. Rockerbox's platform integrations pull ad spend from Meta, Google, TikTok, and other platforms regardless of UTM data — but without UTM-tagged sessions to match against, ROAS calculations have no attributed revenue to pair with the spend. Every paid channel link driving traffic to your store needs UTM parameters that match Rockerbox's channel mapping rules.
- How does Rockerbox handle multi-touch attribution windows?
- Rockerbox captures every UTM-tagged touchpoint within the attribution window (typically 30, 60, or 90 days, configurable per account). Each touchpoint is stored in the first-party cookie with its UTM values. Rockerbox's multi-touch models (First Touch, Last Touch, Linear, and Rockerbox's own data-driven model) then distribute conversion credit across all touchpoints in the window. A touchpoint with malformed UTM values that falls to Unattributed is excluded from all attribution models — the credit it would have received is either lost or redistributed to other touchpoints, distorting the model for every channel involved in that customer journey.
- How do I validate Rockerbox campaign links in bulk before a campaign flight?
- Run
mlz checkin a shell loop over your campaign URL list, or call thePOST /v1/preflightREST API endpoint from a script to validate in parallel. For CI/CD integration, see the GitHub Actions campaign link validation guide — the workflow works for any set of tracked URLs including Rockerbox campaign links. Theredirectscheck confirms whether UTM parameters survive the full redirect chain to the final destination, which is the critical check for Shopify stores with accumulated redirect rules.
Related reading
Build Rockerbox-compatible tracked links from the terminal
mlz build enforces the lowercase-hyphenated formatting Rockerbox channel mapping requires. Generate normalized tracked URLs in the terminal or CI pipeline — no manual UTM entry, no case variants, no Unattributed sessions. Validate destinations with mlz check before every campaign launches to confirm the full redirect chain preserves UTM parameters when the Rockerbox pixel fires.
1,000 links/month free. No credit card.
Your API key
Save this now — it won't be shown again.
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.