UTM Tracking for FlexOffers: How to Build and Validate Affiliate Campaign Links
To add UTM tracking for FlexOffers, add UTM parameters to the advertiser destination URL — the landing page URL you configure in your FlexOffers program settings inside the advertiser dashboard — not to the publisher-facing affiliate tracking links that FlexOffers generates. GA4 reads UTM parameters from the page URL at the moment the tracking tag fires, which is after FlexOffers’ tracking redirect resolves to your destination page. Use MissingLinkz mlz build to generate a normalized destination URL with correctly cased, hyphenated UTM values and mlz check to validate that the FlexOffers redirect chain delivers those parameters intact to your landing page. That is the correct setup. But here is where advertisers lose attribution data silently: even when UTM parameters are correctly placed on the FlexOffers program destination URL, a redirect on the advertiser’s own side — a CDN edge rule, a platform canonical URL enforcement, or an HTTP-to-HTTPS rewrite — can strip query parameters before GA4 fires. A parameter format checker cannot detect this. mlz check follows the entire redirect chain from your destination URL and confirms parameters survive to the final page load.
How FlexOffers’ tracking architecture interacts with UTM parameters
FlexOffers is one of the largest US-based affiliate marketing networks, founded in 2008. It operates as a two-sided marketplace: advertisers (merchants) create programs and upload creatives; publishers (affiliates) browse those programs, apply to join, and promote the advertiser’s products or services to their audiences through content, email, coupon sites, and paid placements. FlexOffers is used by thousands of brands across retail, travel, finance, software, and subscription services.
When a publisher promotes a FlexOffers program, they use affiliate tracking links generated by the FlexOffers platform. A publisher’s click on one of these links routes through FlexOffers’ tracking infrastructure, which records the click event for commission attribution, identifies the publisher and the specific creative or deeplink, and then redirects the browser to the advertiser’s configured destination URL. FlexOffers’ own tracking parameters — which the platform uses for click attribution and commission payouts — are entirely separate from GA4 UTM tracking and do not interfere with it.
The consequence for UTM tracking: UTM parameters belong on the destination URL you configure in the FlexOffers advertiser dashboard for your program, not on the publisher-facing affiliate link. The publisher link is formatted and controlled by FlexOffers and is not a reliable place to append advertiser-side UTM parameters. The configuration point you control as an advertiser is the landing page or destination URL in your program settings.
GA4 attribution works by reading utm_source, utm_medium, and utm_campaign from the URL at the moment the GA4 measurement tag fires. For a FlexOffers-driven visit, this is after FlexOffers’ redirect resolves and your landing page loads. If any redirect between FlexOffers’ forward and the final page load strips query parameters, GA4 records the session as Direct or Organic with no FlexOffers attribution. FlexOffers itself tracks the conversion for commission purposes using its own click attribution and does not depend on UTM parameters.
Both attribution systems coexist independently: FlexOffers tracks publisher commissions through its own click records; GA4 tracks channel attribution through UTM parameters on the destination URL. For the full context of UTM parameters and redirect chain validation across affiliate networks, see the UTM tracking for developers guide.
Building FlexOffers destination URLs with mlz build
The most common UTM data quality problem in FlexOffers programs is casing inconsistency: one operator types utm_source=FlexOffers (capital F), another types utm_source=flexoffers, and a third types utm_source=flex-offers. GA4 treats these as three separate sources, fragmenting the affiliate channel data and making it impossible to report total FlexOffers performance accurately. mlz build eliminates this problem by enforcing lowercase-hyphenated values from structured input, regardless of what case the operator uses as input.
The standard naming convention for FlexOffers programs is utm_source=flexoffers or utm_source=flexoffers-[publisher-type], utm_medium=affiliate, and utm_campaign=[program-name-or-season]. Use utm_content to differentiate between different creatives or landing pages within the same program configuration.
$ mlz build \
--url "https://shop.example.com/landing" \
--source "flexoffers-content" \
--medium "affiliate" \
--campaign "summer-sale-2026" \
--content "homepage-offer" \
--validate
{
"tracked_url": "https://shop.example.com/landing?utm_source=flexoffers-content&utm_medium=affiliate&utm_campaign=summer-sale-2026&utm_content=homepage-offer",
"params": {
"utm_source": "flexoffers-content",
"utm_medium": "affiliate",
"utm_campaign": "summer-sale-2026",
"utm_content": "homepage-offer"
},
"destination_url": "https://shop.example.com/landing",
"link_id": "lnk_fo_hw_ss26",
"campaign_id": "cmp_summer-sale-2026",
"stored": true,
"created_at": "2026-07-01T09:15:00.000Z"
}
The tracked_url value is what you paste into the Destination URL or Landing Page URL field in the FlexOffers advertiser dashboard when creating or editing your program. If your FlexOffers program includes multiple ad creatives pointing to different landing pages, generate a distinct destination URL for each one using mlz build with a different utm_content value:
mlz build --url "https://shop.example.com/sale" --source "flexoffers-content" --medium "affiliate" --campaign "summer-sale-2026" --content "sale-landing"
For naming conventions and how consistent casing prevents GA4 data fragmentation across affiliate sources, see the UTM naming conventions guide. To generate destination URLs programmatically across a large FlexOffers catalog via the REST API, see how to build UTM links programmatically.
Validating the FlexOffers redirect chain with mlz check
Once you have a UTM-tagged destination URL, validate it end-to-end with mlz check before entering it into the FlexOffers advertiser dashboard. mlz check follows the complete redirect chain from your destination URL, confirms the server responds with a 200, and verifies query parameters are not stripped at any hop. Run this before your FlexOffers program goes live, and re-run it after any infrastructure change that touches URL handling on your site.
$ mlz check "https://shop.example.com/landing?utm_source=flexoffers-content&utm_medium=affiliate&utm_campaign=summer-sale-2026"
{
"url": "https://shop.example.com/landing?utm_source=flexoffers-content&utm_medium=affiliate&utm_campaign=summer-sale-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": 228 } },
{ "check": "redirects", "status": "pass", "message": "No redirects detected." },
{ "check": "response_time", "status": "pass", "message": "Response time: 228ms.", "details": { "response_time_ms": 228 } }
],
"status_code": 200,
"response_time_ms": 228,
"validated_at": "2026-07-01T09:16:40.000Z"
}
A valid: true result means the destination URL resolves correctly and query parameters survive to the final page load. If valid is false, the checks array pinpoints the failing hop. The most common failure modes for FlexOffers programs are e-commerce platform URL normalization rules and CDN trailing-slash or HTTPS redirect rules that were configured without accounting for query parameter preservation. For a detailed walkthrough of diagnosing redirect chain failures, see how to check if a redirect strips UTM parameters.
FlexOffers UTM tracking gotchas for advertisers
- Configure UTM parameters on the destination URL, not on the FlexOffers publisher link
- FlexOffers generates publisher-facing affiliate links in a fixed format managed by the platform. As an advertiser, you do not directly control the structure of the publisher link. The configuration point you own is the Destination URL or Landing Page URL in the FlexOffers advertiser dashboard for your program. Paste the UTM-tagged URL generated by
mlz buildthere. When a publisher shares their affiliate link and a visitor clicks it, FlexOffers routes the click through its tracking infrastructure and forwards to your configured destination URL, delivering the UTM parameters to your landing page. - Deeplinks in FlexOffers programs need individual UTM validation
- FlexOffers allows advertisers to enable deeplinks — publisher-created links that point to specific product pages or category pages rather than a single program landing page. When publishers create deeplinks, they construct the destination URL themselves, often without UTM parameters. If you want UTM tracking on deeplink traffic, you have two options: instruct publishers on the correct UTM parameter format for your program (error-prone), or ensure your deeplinked pages have a default attribution fallback via a landing page configuration that FlexOffers routes all traffic through. For programs where deeplink attribution matters, use
mlz checkto validate a representative set of deeplink destination URLs regularly. - E-commerce platform URL normalization strips UTM parameters on product pages
- Platforms including Shopify and BigCommerce enforce canonical URL formats on product and collection pages. A Shopify canonical redirect can, for example, convert
/products/blue-widget?utm_source=flexoffers-contentto/products/blue-widgetif the platform treats the UTM-tagged URL as a variant of the canonical page URL. This stripping happens server-side before the GA4 tag fires. Test representative product page destination URLs withmlz checkto confirm query parameters survive. If stripping occurs, use a dedicated landing page (outside the product page URL structure) as the FlexOffers program destination. - Casing inconsistency across FlexOffers offers fragments GA4 channel data
- FlexOffers advertisers who configure multiple programs or rotate seasonal offers often introduce casing variations:
utm_source=FlexOffersin one program andutm_source=flexoffersin another. GA4 is case-sensitive — it records these as two separate traffic sources and you lose the ability to report total FlexOffers network performance.mlz buildautomatically lowercases all input values and replaces spaces with hyphens, producing consistent output regardless of what the operator typed as input. For the full explanation of why GA4 case sensitivity matters, see are UTM parameters case sensitive in GA4? - Re-validate destination URLs after platform or CDN configuration changes
- A FlexOffers destination URL that validated correctly when the program launched can fail months later if a CDN configuration, TLS certificate renewal, or e-commerce platform upgrade changes URL handling behaviour. New trailing-slash redirect rules, HTTPS upgrade rules, or platform version changes that modify query-string handling are common culprits. Validate destination URLs again whenever you change CDN provider, upgrade your e-commerce platform, or modify server redirect rules. For programs that rotate offers frequently, consider automating this validation check in a CI/CD pipeline as described in automating campaign link validation in CI/CD.
Frequently asked questions
- Where do I add UTM parameters in the FlexOffers advertiser dashboard?
- In the FlexOffers advertiser dashboard, navigate to your Program settings and find the Destination URL or Landing Page URL field. This is where you paste the UTM-tagged URL generated by
mlz build. The URL format is:https://shop.example.com/landing?utm_source=flexoffers-content&utm_medium=affiliate&utm_campaign=summer-sale-2026. FlexOffers will use this as the final destination when routing publisher clicks through its tracking redirect. For programs with multiple offers or seasonal landing pages, create separate program configurations with distinct UTM-tagged destination URLs for each. - Does the FlexOffers tracking redirect strip UTM parameters?
- FlexOffers’ tracking redirect is designed to forward the advertiser-configured destination URL intact, including all query parameters. Parameter stripping typically occurs on the advertiser’s server side after FlexOffers delivers the visitor: e-commerce platform canonical URL rewrites, CDN edge redirect rules, or HTTP-to-HTTPS upgrade redirects that were not configured to preserve query strings. Run
mlz checkagainst your destination URL to confirm parameters survive the full chain to the final page load before activating your FlexOffers program. - What utm_source value should I use for FlexOffers traffic?
- Use
utm_source=flexoffersorutm_source=flexoffers-contentas a baseline. If you operate multiple FlexOffers programs for different product lines or geographies, a more granularutm_source=flexoffers-[program-type]pattern lets you segment performance by program in GA4. Keep all values lowercase and hyphenated —mlz buildenforces this automatically. Setutm_medium=affiliateconsistently across all affiliate network traffic so GA4’s default channel grouping correctly identifies the Affiliate channel. - How do I track different FlexOffers publishers separately in GA4?
- FlexOffers does not typically expose publisher-level tracking to advertisers via UTM parameters — the network’s own reporting shows publisher-level performance through its internal click attribution. For GA4, you distinguish between content types by using different
utm_contentvalues for different offer creatives or landing pages. If you need publisher-granularity in GA4 specifically, FlexOffers offers a sub-ID mechanism that some advertisers use to pass publisher identifiers, but this requires publisher cooperation and custom URL structures. For standard GA4 attribution, theutm_source=flexoffersandutm_medium=affiliatecombination identifies FlexOffers network traffic as a distinct channel. - Should I validate FlexOffers destination URLs in an automated pipeline?
- For programs with a high volume of offers or frequent promotional rotations, automated validation in a CI/CD pipeline is a practical safeguard. Use
mlz checkin a script that tests each destination URL before the offer is submitted to FlexOffers, failing the submission if any URL returnsvalid: false. This prevents infrastructure changes from silently breaking affiliate attribution across all active offers in your FlexOffers program. For a complete implementation guide including GitHub Actions workflow templates, see automating campaign link validation in CI/CD.
Build FlexOffers-ready UTM destination URLs and validate every redirect chain before your program activates
mlz build generates normalized, consistently cased UTM destination URLs for your FlexOffers program. mlz check validates the full redirect chain — catching the e-commerce platform rewrites and CDN redirect rules that silently strip UTM parameters before GA4 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.