UTM Tracking for Northbeam: How to Build and Validate Campaign Links

Northbeam uses UTM parameters as its primary attribution mechanism for DTC and ecommerce brands. The Northbeam pixel fires on pageview, reads utm_source, utm_medium, utm_campaign, utm_content, and utm_term from the URL, and stores them in a first-party cookie — bypassing the third-party cookie restrictions that degrade cross-session attribution on other platforms. Northbeam's channel grouping uses exact string matching against these parameter values. A utm_source of Facebook (capitalized) does not match the rule for facebook — it creates a separate Unknown entry in channel reporting instead of consolidating with your other Paid Social traffic. A utm_medium of Paid Social (with space and capital) breaks the same match. Missing utm_campaign makes campaign-level ROAS reporting impossible. Build tracked URLs with mlz build --source "facebook" --medium "paid-social" --campaign "your-slug" to enforce the lowercase-hyphenated formatting Northbeam requires, and validate with mlz check before campaigns launch.

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

How Northbeam reads UTM parameters for multi-touch attribution

Northbeam's attribution model is built on top of UTM parameters read by the Northbeam pixel — a first-party JavaScript pixel typically installed via Shopify or a tag manager. When a visitor lands on the site, the pixel fires on pageview, reads any UTM parameters present in the URL, and stores them in a first-party cookie. Because this is first-party data scoped to the store domain, the UTM values persist across Northbeam's attribution window even in browser environments that restrict third-party cookies.

Northbeam supports multiple attribution models simultaneously — Last Click, First Click, Linear, Position-Based, and its data-driven model — and all of them read from the UTM values captured by the pixel at session time. For multi-touch journeys (a customer clicks a Meta ad, then sees a TikTok ad, then converts via email), each touchpoint's UTM parameters are captured separately. This means every paid channel link driving traffic to the store must have correctly formatted UTM parameters, or that touchpoint becomes invisible to Northbeam's models.

Northbeam's channel grouping maps specific utm_source and utm_medium combinations to channels using exact string matching. The channel table drives the "Channel ROAS" and "Channel LTV" views that most DTC brands rely on for spend decisions:

utm_source utm_medium Northbeam channel
facebook paid-social Paid Social
google cpc Paid Search
tiktok paid-social Paid Social
klaviyo email Email
Facebook (capitalized) paid-social Unknown
facebook Paid Social (space + capital) Misclassified
fb (abbreviation) paid-social Unknown

Because Northbeam operates on exact string matching, a single capitalization variant from one team member is enough to fragment your channel ROAS table. DTC brands typically run campaigns across multiple ad platforms, from multiple team members generating links in separate tools — each with their own manual conventions. Attribution fragmentation accumulates quietly: Unknown channel entries, split ROAS across variants of the same source, campaign-level reporting that can't consolidate because campaign slugs don't match.

Building UTM-tagged links for Northbeam campaigns with mlz build

mlz build generates UTM-tagged URLs with normalized, lowercase-hyphenated parameter values — the format Northbeam's channel grouping expects. Pass the destination URL, source, medium, campaign, and optional content or term values. The output tracked_url is ready to paste into the ad platform's destination URL field. Add --validate to confirm the destination resolves before Northbeam's pixel fires on the first session.

mlz build — Northbeam campaign links by channel
# Meta / Facebook Ads campaign
$ mlz build \
  --url "https://store.com/product" \
  --source "facebook" \
  --medium "paid-social" \
  --campaign "summer-sale-jun-2026" \
  --content "carousel-product" \
  --validate

{
  "tracked_url": "https://store.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
}

# TikTok Ads campaign
$ mlz build \
  --url "https://store.com/landing" \
  --source "tiktok" \
  --medium "paid-social" \
  --campaign "ugc-launch-jun-2026" \
  --content "video-15s-ugc" \
  --validate

{
  "tracked_url": "https://store.com/landing?utm_source=tiktok&utm_medium=paid-social&utm_campaign=ugc-launch-jun-2026&utm_content=video-15s-ugc",
  "stored": true
}

# Google Shopping campaign
$ mlz build \
  --url "https://store.com/category" \
  --source "google" \
  --medium "cpc" \
  --campaign "brand-shopping-jun-2026" \
  --term "product-name" \
  --validate

{
  "tracked_url": "https://store.com/category?utm_source=google&utm_medium=cpc&utm_campaign=brand-shopping-jun-2026&utm_term=product-name",
  "stored": true
}

mlz build always produces lowercase parameter values. There is no way to accidentally generate utm_source=Facebook or utm_medium=Paid Social through the CLI — normalization is enforced at generation time, before the link is distributed. This prevents the case fragmentation that splits Northbeam's channel ROAS table across capitalization variants produced by different team members using different tools.

The tracked_url from the JSON output is ready to paste into Meta Ads Manager's destination URL field, TikTok Ads' landing page URL field, Google Ads' final URL field, or any other platform. The stored field confirms the link was saved to your MissingLinkz campaign library for auditing and reference.

Validating campaign links with mlz check before Northbeam pixel fires

Northbeam's pixel fires on pageview. If the destination URL is unreachable when a paid visitor lands, or if a redirect in the chain strips UTM parameters before the page loads, Northbeam records no attribution for that session — the ad spend is invisible to the attribution model. mlz check validates the destination before the campaign launches: it confirms the URL resolves with a 200, HTTPS is configured, no redirect strips UTM parameters, and response time is acceptable.

mlz check — validate destination before Northbeam pixel fires
$ mlz check "https://store.com/product?utm_source=facebook&utm_medium=paid-social&utm_campaign=summer-sale-jun-2026"

{
  "url": "https://store.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": 224 } },
    { "check": "redirects", "status": "pass", "message": "No redirects detected." },
    { "check": "response_time", "status": "pass", "message": "Response time: 224ms.", "details": { "response_time_ms": 224 } }
  ],
  "status_code": 200,
  "response_time_ms": 224,
  "validated_at": "2026-06-17T09:20:14.000Z"
}

Run mlz check on every campaign link before the ad activates. This is especially important for Shopify stores where product pages can redirect based on URL structure changes, variant availability, or collections rerouting — a Shopify redirect that strips query strings will drop all UTM values and break Northbeam attribution for every session that lands on it. The redirects check confirms whether any redirect in the chain has dropped query parameters before the page loads and Northbeam's pixel fires.

Northbeam UTM tracking gotchas

Northbeam is case-sensitive — exactly like GA4 and Triple Whale
Northbeam'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 Paid Social. Paid Social and paid-social create different groupings; only the lowercase-hyphenated form maps to the correct Northbeam channel. This case fragmentation is invisible in the ad platforms (Meta Ads Manager accepts any capitalization) but immediately visible in Northbeam's channel attribution table as unexplained Unknown entries and split ROAS figures. Use mlz build to enforce lowercase-hyphenated values at generation time — the output always normalizes to lowercase, preventing the fragmentation before it can accumulate.
Missing utm_campaign breaks Northbeam's campaign-level ROAS
Northbeam calculates ROAS at the campaign level by joining ad spend data (pulled from Meta, Google, TikTok, and other ad platform integrations) with attributed revenue (from pixel sessions tagged with UTM parameters). If utm_campaign is missing from a link, Northbeam can't assign attributed revenue to a specific campaign for the spend-to-revenue ROAS calculation. If the utm_campaign slug doesn't match how the campaign is named in the ad platform, the join fails silently and ROAS reporting shows incomplete data. Always include --campaign in mlz build for any paid campaign link, and use a slug that corresponds to the campaign name in the ad platform.
Northbeam's MTA models all depend on consistent UTM structure
Northbeam's multi-touch attribution models (Last Click, First Click, Linear, Position-Based, Northbeam's proprietary model) operate on the UTM values stored in the first-party cookie across the customer journey. A touchpoint where utm_medium was paid_social instead of paid-social creates a touchpoint that Northbeam can't assign to a channel — it appears in the journey but can't contribute to channel-level ROAS or cohort attribution. Inconsistent naming across team members generates attribution noise that compounds over every campaign flight. Standardizing on mlz build for all link generation enforces a consistent naming taxonomy across channels and team members.
Shopify redirect rules can silently strip Northbeam's UTM parameters
Shopify stores frequently accumulate redirect rules: URL structure changes after a platform migration, product variant URL rewrites, deprecated collection paths redirected to new ones. Any Shopify redirect that doesn't preserve query strings drops all UTM parameters before Northbeam's pixel fires — attributing the session to Direct instead of the paid channel that drove the click. This is especially common with 301 redirects created during store migrations or theme changes. Run mlz check on every campaign destination URL before launch to verify no redirect in the chain is stripping query strings. The redirects check in the output confirms whether UTM parameters survive the full hop sequence.
Northbeam's paid social channel combines Meta, TikTok, Pinterest, and Snapchat
Northbeam's default channel grouping combines multiple paid social platforms under a single "Paid Social" channel using utm_medium=paid-social. To see channel-level spend breakdown for individual platforms, use utm_source to distinguish them (facebook, tiktok, pinterest, snapchat) while using utm_medium=paid-social consistently across all of them. Northbeam's platform-level view then separates them by source. Never use the platform name as the medium — utm_medium=tiktok doesn't map to Northbeam's Paid Social channel and will fall through to Unknown.

Northbeam UTM naming conventions

Recommended UTM parameter values for Northbeam campaigns, aligned with Northbeam's channel grouping and a lowercase-hyphenated taxonomy enforced by mlz build:

  • utm_source: lowercase platform name. facebook for Meta and Instagram (both platforms share the same Northbeam source — use utm_content or utm_medium placement modifiers to distinguish them). tiktok for TikTok Ads. google for all Google Ads formats. klaviyo for Klaviyo email and SMS. attentive for Attentive SMS. postscript for Postscript SMS. pinterest for Pinterest Ads. snapchat for Snapchat Ads. Avoid abbreviations and brand variants: no FB, Meta, IG, Google Ads. Northbeam's channel rules map specific source strings — deviation creates Unknown attribution.
  • utm_medium: must match Northbeam's channel grouping expectations. paid-social for Meta, TikTok, Pinterest, and Snapchat paid placements. cpc for Google Search, Microsoft Search, and paid search placements. display for Google Display Network and programmatic display. email for email campaigns across all platforms. sms for SMS platforms. organic for organic social content. Do not use social, paid_social, paidsocial, or Paid Social — these do not match Northbeam's Paid Social channel grouping rule.
  • utm_campaign: lowercase-hyphenated campaign identifier. Include the time period so Northbeam's campaign-level ROAS joins correctly across campaign flights: summer-sale-jun-2026, brand-search-always-on, abandon-cart-jun-2026. The utm_campaign value is how Northbeam maps attributed revenue to ad spend from the platform integrations — match the slug as closely as possible to how the campaign is named in the ad platform.
  • utm_content: creative or ad variant identifier. carousel-lifestyle, static-product, video-15s-ugc, story-reels. Northbeam uses utm_content for creative-level attribution, making it the right place to distinguish ad variants running within the same campaign. Keep values lowercase-hyphenated.
  • utm_term: keyword identifier for search campaigns. competitor-brand, product-category-keywords. Omit for paid social campaigns where keyword-level attribution doesn't apply.

For the full cross-platform UTM naming reference, see the UTM naming conventions guide and the UTM tracking for developers guide.

FAQ

Why does Northbeam show Unknown channels for some of my traffic?
Unknown channel attribution in Northbeam almost always means utm_source or utm_medium doesn't match Northbeam's channel grouping rules. The most common causes: capitalization variants (Facebook instead of facebook), non-standard medium values (Paid Social instead of paid-social), abbreviations (fb instead of facebook), or missing UTM parameters entirely. Regenerate affected campaign links with mlz build using normalized values, update the URLs in the ad platforms, and monitor Northbeam's channel attribution over the next campaign flight. Historical sessions with malformed UTMs remain attributed to Unknown — the fix only applies prospectively to newly generated links.
Can I use Northbeam and GA4 with the same UTM parameters?
Yes. Northbeam and GA4 both read standard UTM parameters from the URL. Northbeam's pixel reads them 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. Both tools receive identical parameter values from the same URL. A correctly formatted UTM link — lowercase source, hyphenated medium, campaign slug — works simultaneously for Northbeam multi-touch attribution and GA4 session attribution without modification. mlz build generates links that satisfy both platforms' format requirements in a single command. For detail on GA4's own case sensitivity rules, see are UTM parameters case sensitive in GA4?
Does Northbeam work without UTM parameters?
Northbeam can record sessions without UTM parameters but cannot attribute them to a channel, campaign, or creative. Sessions without UTM data appear as Direct in Northbeam's attribution reports. Northbeam's ad platform integrations still pull spend data, but without corresponding UTM-tagged sessions to match against, ROAS calculations and multi-touch attribution models have no data to work with. Every paid channel link driving traffic to the store needs UTM parameters present and correctly formatted.
What's the difference between Northbeam and GA4 attribution for DTC brands?
GA4 uses session-scoped attribution — it assigns the conversion to the last-click session by default (other models available). Northbeam uses multi-touch attribution that tracks the full customer journey across all UTM-tagged touchpoints, applies multiple attribution models simultaneously, and integrates ad spend from platform APIs to calculate channel and campaign ROAS. Both tools read from the same UTM parameters. Northbeam gives DTC brands the cross-channel ROAS view that GA4's session-based model can't produce. For this reason, accurate UTM parameter formatting matters even more for Northbeam than for GA4 — a malformed UTM creates an attribution gap in a multi-touch model that may span 7 to 30 days of customer journey data.
How do I validate Northbeam campaign links in bulk before a campaign launch?
Run mlz check in a shell loop over your campaign URL list, or call the POST /v1/preflight REST API endpoint from a script to validate in parallel. For CI/CD integration, see the GitHub Actions campaign link validation guide — the same workflow works for Northbeam campaign links. The redirects check in each result confirms whether UTM parameters survive the redirect chain to the final destination, which is the critical check for Shopify stores with redirect rules.

Build Northbeam-compatible tracked links from the terminal

mlz build enforces the lowercase-hyphenated formatting Northbeam 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 destinations resolve and no Shopify redirect strips UTM parameters before the Northbeam 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.