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

Bloomreach Engagement (formerly Exponea) is a customer data platform with built-in marketing automation covering email, SMS, push notifications, and web push. Unlike most marketing platforms, Bloomreach can auto-append UTM parameters to email links in some Scenario configurations — but those auto-generated values often use generic defaults like utm_source=bloomreach_email that conflict with your own taxonomy or produce fragmented GA4 reports. The reliable approach is to build your own tracked URLs with mlz build --source "bloomreach" --medium "email" (or the channel-appropriate medium) before entering them in Bloomreach Scenarios, then validate each destination URL resolves correctly before the Scenario triggers. Push notifications and SMS still require manually tagged URLs because Bloomreach does not auto-append UTM parameters to those channel types.

Terminal showing mlz build command with utm_source=bloomreach and utm_medium=email, four channel cards showing the correct utm_medium for email, SMS, push, and web push, a utm_source=bloomreach card, a yellow warning panel about checking Bloomreach's auto-UTM setting, and a validated URL pill at the bottom.

Why Bloomreach UTM tracking requires careful setup

Bloomreach Engagement has an optional UTM auto-tagging feature in its email template settings and Campaign configuration. When enabled, Bloomreach appends UTM parameters to all links in an email using values you configure at the campaign level — typically something like utm_source=bloomreach_email&utm_medium=email&utm_campaign={{campaign_name}}. This is more thoughtful than platforms that do nothing, but it creates two practical problems: first, the auto-generated source value (bloomreach_email) is a non-standard compound that some teams prefer to split (utm_source=bloomreach + utm_medium=email); second, Bloomreach's auto-UTM does not apply to SMS, push notifications, or web push — those channels always require manually tagged URLs.

The recommended approach for consistent taxonomy across all Bloomreach channels is to build all your tracked URLs manually with mlz build, then disable or verify Bloomreach's auto-UTM feature to ensure it does not overwrite your manually tagged parameters. If Bloomreach's auto-UTM is enabled and a link already has UTM parameters, Bloomreach may append additional UTM parameters alongside yours, creating duplicate or conflicting UTM values in the final URL that GA4 cannot resolve cleanly.

Push notifications in Bloomreach — both mobile push and web push — have no HTTP referrer. When a user taps a push notification, the device opens the destination URL with no referrer header, and GA4 classifies the session as Direct traffic unless UTM parameters are present in the URL.

Bloomreach channel Auto-UTM available? Without manual UTM Recommended utm_medium
Email (Campaigns / Scenarios) Optional (check settings) May get generic auto-UTM or Email email
SMS No Direct in GA4 sms
Mobile push notification No Direct in GA4 push
Web push notification No Direct in GA4 web-push

Building tracked Bloomreach campaign URLs with mlz build

Build your tracked URLs with mlz build before opening Bloomreach's email designer, push notification editor, or SMS campaign builder. For email, paste the tracked_url into each hyperlink in the email template. For push notifications, paste it into the notification's Action URL or Redirect URL field. For SMS, paste it into the message text before Bloomreach applies any link shortening. Add --validate to each build command to confirm the destination URL resolves correctly before the Scenario or Campaign goes live.

mlz build — Bloomreach multi-channel Scenario
# Email step in a Bloomreach Scenario
$ mlz build \
  --url "https://shop.example.com/summer-sale" \
  --source "bloomreach" \
  --medium "email" \
  --campaign "summer-sale-jun-2026" \
  --validate

{
  "tracked_url": "https://shop.example.com/summer-sale?utm_source=bloomreach&utm_medium=email&utm_campaign=summer-sale-jun-2026",
  "params": {
    "utm_source": "bloomreach",
    "utm_medium": "email",
    "utm_campaign": "summer-sale-jun-2026"
  },
  "stored": true
}

# SMS step in the same Scenario (same campaign, different medium)
$ mlz build \
  --url "https://shop.example.com/summer-sale" \
  --source "bloomreach" \
  --medium "sms" \
  --campaign "summer-sale-jun-2026" \
  --validate

{
  "tracked_url": "https://shop.example.com/summer-sale?utm_source=bloomreach&utm_medium=sms&utm_campaign=summer-sale-jun-2026"
}

# Push notification step: same campaign slug, utm_medium=push
$ mlz build \
  --url "https://shop.example.com/summer-sale" \
  --source "bloomreach" \
  --medium "push" \
  --campaign "summer-sale-jun-2026" \
  --validate

{
  "tracked_url": "https://shop.example.com/summer-sale?utm_source=bloomreach&utm_medium=push&utm_campaign=summer-sale-jun-2026"
}

In GA4, filter by utm_campaign=summer-sale-jun-2026 to see all sessions from this Bloomreach Scenario across all channels. Pivot on utm_medium to compare email, SMS, and push contributions side by side. The consistent utm_campaign slug groups every channel touchpoint into a single campaign row in GA4, while distinct utm_medium values separate them by channel for attribution analysis.

UTM tracking for Bloomreach Scenarios (multi-step automation)

Bloomreach Scenarios are the platform's visual automation builder — similar to journey or workflow builders in other platforms. A Scenario can include email, SMS, push, and web push nodes in a coordinated sequence, triggered by events like a purchase, an abandoned cart, or a custom event from the Bloomreach SDK. For each Scenario node that includes a URL to an external destination, build a separate tracked URL with mlz build, using a consistent utm_campaign slug for all nodes in the Scenario and matching utm_medium to the channel of each node. Use utm_content to identify individual Scenario steps.

mlz build — Bloomreach cart abandonment Scenario
# Node 1: Push notification (30 minutes after cart abandonment)
$ mlz build \
  --url "https://shop.example.com/cart" \
  --source "bloomreach" \
  --medium "push" \
  --campaign "cart-abandon-scenario" \
  --content "push-30min" \
  --validate

{
  "tracked_url": "https://shop.example.com/cart?utm_source=bloomreach&utm_medium=push&utm_campaign=cart-abandon-scenario&utm_content=push-30min"
}

# Node 2: Email (4 hours after abandonment)
$ mlz build \
  --url "https://shop.example.com/cart" \
  --source "bloomreach" \
  --medium "email" \
  --campaign "cart-abandon-scenario" \
  --content "email-4h" \
  --validate

{
  "tracked_url": "https://shop.example.com/cart?utm_source=bloomreach&utm_medium=email&utm_campaign=cart-abandon-scenario&utm_content=email-4h"
}

# Node 3: SMS with discount (24 hours after abandonment)
$ mlz build \
  --url "https://shop.example.com/cart?discount=SAVE10" \
  --source "bloomreach" \
  --medium "sms" \
  --campaign "cart-abandon-scenario" \
  --content "sms-24h-discount" \
  --validate

{
  "tracked_url": "https://shop.example.com/cart?discount=SAVE10&utm_source=bloomreach&utm_medium=sms&utm_campaign=cart-abandon-scenario&utm_content=sms-24h-discount"
}

With this tagging structure, GA4's campaign report for utm_campaign=cart-abandon-scenario shows all sessions and cart recoveries attributable to the Bloomreach Scenario across all three channels. The utm_medium dimension breaks down which channel drove each recovery, and utm_content shows which Scenario node was the last touchpoint before conversion. Note that for the SMS node, the discount parameter (discount=SAVE10) is a separate query parameter that coexists cleanly with UTM parameters — mlz build appends UTM parameters alongside any existing query parameters in the destination URL.

Bloomreach UTM tracking gotchas

Check whether Bloomreach's email auto-UTM is enabled before building manual URLs
Bloomreach Engagement has a UTM parameter setting in email Campaign and template configurations. If this setting is enabled, Bloomreach appends its own UTM values to all email links when the email sends — even if you have already added UTM parameters to the URL. A URL that already has utm_source=bloomreach may end up with duplicate UTM parameters appended by Bloomreach's auto-tagging, which some URL parsers and GA4 handle unpredictably. Before building manual URLs for Bloomreach email campaigns, check the email Campaign settings (and the email template editor) for a UTM tracking option and either disable it or ensure it is set to values consistent with your taxonomy. The safest approach is to disable auto-UTM in Bloomreach and manage all UTM parameters through mlz build.
Bloomreach SMS links may be shortened — add UTM parameters before shortening
Bloomreach SMS campaigns can use built-in link shortening, which wraps the destination URL in a Bloomreach short URL. If you plan to use Bloomreach's link shortening for SMS, build the fully tagged URL with mlz build first, then paste that tagged URL into the Bloomreach SMS editor before Bloomreach creates the short link. The short URL wraps the complete tagged URL as a unit, and the redirect from the short link to the destination typically preserves query string parameters including UTM values. Use mlz build --validate to confirm the destination URL resolves before handing the URL to Bloomreach's SMS editor.
Bloomreach web push URLs need the same manual UTM treatment as mobile push
Bloomreach supports web push notifications (browser push) in addition to mobile push. Web push notifications, like mobile push, have no HTTP referrer when clicked — the browser opens the notification URL directly without passing a referrer header. Web push clicks appear as Direct traffic in GA4 without UTM parameters. Build tracked URLs for web push with utm_medium=web-push (distinct from utm_medium=push used for mobile push) so GA4 can distinguish web push traffic from mobile app push traffic in reports. Enter the tracked URL in Bloomreach's web push notification URL field before the notification goes out.
Bloomreach Recommendations and Weblayers also link to external URLs
Bloomreach Engagement includes additional campaign types beyond email, SMS, and push: Recommendations (personalized product recommendations shown on the website) and Weblayers (on-site pop-ups, banners, and overlays). Weblayer CTA buttons that link to external URLs are another source of trackable traffic. For Weblayer campaigns that link to product pages, landing pages, or other external destinations, build tracked URLs with utm_source=bloomreach&utm_medium=weblayer and enter them as the Weblayer CTA URLs. Recommendation widgets embedded on the site can also be tracked with UTM parameters appended to the recommended product URLs, using utm_medium=recommendation.
Bloomreach's Jinja templating can generate invalid UTM values if not sanitized
Bloomreach uses Jinja2 templating to personalize campaign content, including URLs. It is possible to build UTM values dynamically using customer attributes — for example, utm_content={{ customer.segment }} to tag links with the customer's segment. However, if the Jinja expression returns a value that contains spaces, uppercase letters, or special characters, the resulting UTM parameter will be malformed (GA4 will create multiple data rows for the same nominal segment). Always sanitize dynamic UTM values in Jinja with a filter or use a hardcoded set of segment slugs that conform to lowercase-hyphenated naming. For UTM values derived from customer attributes, test with mlz build using representative segment values to verify the resulting URL is well-formed before deploying the Scenario.

Bloomreach UTM naming conventions

Recommended UTM parameter values for Bloomreach Engagement, aligned with GA4 channel reporting and a lowercase-hyphenated taxonomy:

  • utm_source: bloomreach for all sends from the Bloomreach Engagement platform across all channels. Always lowercase. A single source value for all Bloomreach channels (email, SMS, push, web push, weblayer) makes it easy to filter GA4 acquisition reports to see all Bloomreach-attributed traffic, then pivot on utm_medium for channel breakdown. Avoid bloomreach_email or bloomreach_push as source values — compound source-medium values in utm_source make filtering more complex and produce double-counting in some GA4 channel grouping rules.
  • utm_medium: Match the delivery channel — email for email Campaigns and Scenario email nodes; sms for SMS Campaigns and Scenario SMS nodes; push for mobile push notifications; web-push for web push notifications; weblayer for Weblayer CTA buttons that link externally; recommendation for Recommendation widget links. Add GA4 custom channel grouping rules (Admin > Data Display > Channel Groups) for utm_medium=push, utm_medium=web-push, and utm_medium=weblayer since GA4's default grouping does not include these channel types.
  • utm_campaign: A consistent slug per Campaign or Scenario. For one-off email campaigns: summer-sale-jun-2026, product-launch-jun. For automated Scenarios: cart-abandon-scenario, post-purchase-scenario, win-back-60d, onboarding-scenario. Use the same slug across all channel nodes in a Scenario so GA4 groups them together in campaign reports.
  • utm_content: Scenario node identifier or A/B variant label. For multi-step Scenarios: push-30min, email-4h, sms-24h-discount. For A/B tested variants: variant-a, variant-b. For Weblayers: homepage-banner, exit-intent-popup. Omit when a campaign has a single CTA and no variants.
  • utm_term: Rarely used for Bloomreach campaigns. Use only for audience segmentation where the same Scenario is triggered for meaningfully different segments: utm_term=vip-segment, utm_term=lapsed-30d, utm_term=high-ltv.

See the UTM naming conventions guide for the full cross-platform reference and the UTM tracking for developers guide for programmatic generation and validation at scale.

FAQ

Does Bloomreach auto-append UTM parameters to campaign links?
Bloomreach Engagement has an optional UTM tracking feature for email Campaigns that can auto-append UTM parameters to email links. This feature is not enabled by default for all accounts — it must be configured in the email Campaign settings or email template. For SMS, push notifications, and web push, Bloomreach does not auto-append UTM parameters. If you use Bloomreach's auto-UTM for email, check that the auto-generated values match your taxonomy — particularly the utm_source value, which defaults to something like bloomreach_email in some configurations. The safest approach for consistent cross-channel attribution is to disable auto-UTM and manage all parameters through mlz build.
What utm_source should I use for Bloomreach?
Use utm_source=bloomreach for all campaigns and Scenarios sent through Bloomreach Engagement across all channels. Avoid channel-specific source values like utm_source=bloomreach-email or utm_source=bloomreach-sms — the channel distinction belongs in utm_medium. A single source value for all Bloomreach channels makes it easy to filter GA4 to see all Bloomreach-attributed traffic in one view, then pivot on utm_medium to compare channel performance.
How do I track Bloomreach Scenarios (automated journeys) in GA4?
Use a consistent utm_campaign slug for all nodes in the Scenario, match utm_medium to the channel of each node (push, email, sms, web-push), and use utm_content to identify each node (e.g., push-30min, email-4h, sms-24h). In GA4, filter by utm_campaign to see all sessions from the Scenario across all channels, then pivot on utm_medium to compare channel contributions and on utm_content to compare individual node performance. This approach gives you full multi-touch Scenario attribution in standard GA4 reports without requiring custom dimensions or BigQuery export.
Bloomreach has built-in analytics — do I still need UTM parameters for GA4?
Yes. Bloomreach's analytics (available in the Bloomreach Engagement dashboard) reports on Bloomreach-native events: email delivered, email opened, email clicked, push notification displayed, push notification clicked, SMS delivered, SMS clicked, and conversion events you define in Bloomreach. These events are tracked in Bloomreach's own data layer and do not populate GA4's acquisition and channel reports. GA4's session attribution is based on UTM parameters and referrer headers — it has no visibility into Bloomreach's internal event data. UTM parameters on every Bloomreach campaign URL are required for GA4's channel reports to correctly attribute sessions to Bloomreach campaigns.
How do I validate Bloomreach campaign URLs before a Scenario sends?
Run mlz build --url "your-destination-url" --source "bloomreach" --medium "email" --campaign "your-campaign-slug" --validate (or the channel-appropriate medium) for each campaign URL before entering it in Bloomreach. The --validate flag confirms HTTPS, resolution (200 response), redirect chain integrity, and query string preservation through any redirects. For email campaign landing pages that will also be shared on social or referenced in other channels, run mlz inspect "your-tracked-url" to verify OG tags, Twitter Card metadata, and viewport configuration — catching a missing OG image before the email campaign sends avoids the embarrassment of a blank social card if recipients share the landing page link. See the campaign link preflight check guide for the full pre-launch validation workflow.

Build Bloomreach campaign links from the terminal

Use mlz build --source "bloomreach" --medium "email" (or the channel-appropriate medium) to generate tracked URLs for every Bloomreach Campaign and Scenario before entering them in the Bloomreach editor. Build a separate URL per channel node within each Scenario — using the same --campaign slug but a different --medium for each channel step. Add --content "push-30min", --content "email-4h", etc. to identify individual Scenario nodes in GA4 reports. Add --validate to confirm each destination URL resolves correctly before the Scenario goes live. For email campaigns, check whether Bloomreach's auto-UTM feature is enabled and disable it to avoid duplicate or conflicting UTM parameters on outgoing links.

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.