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.
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.
# 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.
# 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=bloomreachmay 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 throughmlz 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 buildfirst, 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. Usemlz build --validateto 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 fromutm_medium=pushused 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=weblayerand 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, usingutm_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 withmlz buildusing 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:
bloomreachfor 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 onutm_mediumfor channel breakdown. Avoidbloomreach_emailorbloomreach_pushas source values — compound source-medium values inutm_sourcemake filtering more complex and produce double-counting in some GA4 channel grouping rules. - utm_medium: Match the delivery channel —
emailfor email Campaigns and Scenario email nodes;smsfor SMS Campaigns and Scenario SMS nodes;pushfor mobile push notifications;web-pushfor web push notifications;weblayerfor Weblayer CTA buttons that link externally;recommendationfor Recommendation widget links. Add GA4 custom channel grouping rules (Admin > Data Display > Channel Groups) forutm_medium=push,utm_medium=web-push, andutm_medium=weblayersince 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_sourcevalue, which defaults to something likebloomreach_emailin some configurations. The safest approach for consistent cross-channel attribution is to disable auto-UTM and manage all parameters throughmlz build. - What utm_source should I use for Bloomreach?
- Use
utm_source=bloomreachfor all campaigns and Scenarios sent through Bloomreach Engagement across all channels. Avoid channel-specific source values likeutm_source=bloomreach-emailorutm_source=bloomreach-sms— the channel distinction belongs inutm_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 onutm_mediumto compare channel performance. - How do I track Bloomreach Scenarios (automated journeys) in GA4?
- Use a consistent
utm_campaignslug for all nodes in the Scenario, matchutm_mediumto the channel of each node (push, email, sms, web-push), and useutm_contentto identify each node (e.g.,push-30min,email-4h,sms-24h). In GA4, filter byutm_campaignto see all sessions from the Scenario across all channels, then pivot onutm_mediumto compare channel contributions and onutm_contentto 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--validateflag 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, runmlz 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.
Related reading
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.