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

Adjust is a mobile measurement and attribution platform used by app marketers to track installs, re-engagements, and in-app events across paid and organic channels. Adjust tracking links (app.adjust.com/...) are the core of Adjust's measurement infrastructure — every paid campaign using Adjust as the attribution platform routes clicks through an Adjust tracking link, which records the click and redirect to either the app store or a web destination. The UTM attribution gap with Adjust is a common source of confusion: Adjust tracks mobile attribution with its own parameter set (adjust_t, adjust_creative, adjust_adgroup), but these are Adjust's internal parameters and do not populate GA4 web session attribution. When an Adjust tracking link redirects to a web landing page — which happens for web-to-app campaigns, retargeting campaigns where some users open on desktop, or any campaign driving traffic to a web destination before app download — the resulting GA4 web session will show as Direct unless you append UTM parameters to the destination URL. The solution is to build a tracked destination URL with mlz build --source "adjust" --medium "[channel]" --campaign "your-slug" --validate and use that tracked URL as the deeplink_url parameter in your Adjust tracking link. Run mlz check on the full Adjust tracking link to confirm UTM parameters survive the Adjust redirect before the campaign goes live.

Terminal showing mlz build command generating utm_source=adjust and utm_medium=cpc tracked URL, a redirect chain diagram showing the Adjust tracking link redirecting to the destination with UTM parameters intact, a warning panel distinguishing adjust_t mobile attribution tokens from utm_campaign web parameters, and a validated URL pill at the bottom.

Why Adjust campaigns need separate UTM parameters for GA4

Adjust and GA4 are two different measurement systems that serve different purposes and operate at different levels of the attribution funnel. Adjust measures mobile attribution: which ad networks, campaigns, creatives, and keywords drove app installs and re-engagements on iOS and Android devices. GA4 measures web session behavior: how users interact with web pages, landing pages, and web conversion funnels. The two systems overlap when a campaign uses Adjust for attribution tracking and that campaign also drives traffic to web destinations — which is nearly always the case for web-to-app campaigns (where a user visits a landing page before downloading the app) and for retargeting campaigns where some users may be on desktop.

Adjust tracking links use their own parameter format for attribution. When you create an Adjust tracking link in the Adjust dashboard, Adjust appends its own parameters to the destination URL during the redirect — parameters like adjust_t (the Adjust attribution token), adjust_creative, and adjust_adgroup. These are read by the Adjust SDK in the app after install, not by GA4's web analytics. GA4 ignores Adjust parameters and attributes the web session based on standard UTM parameters (utm_source, utm_medium, utm_campaign) or HTTP referrer headers. If neither is present in the URL that opens in the browser, GA4 classifies the session as Direct.

There is also a common scenario where teams using Adjust for mobile attribution set up retargeting campaigns that serve ads to both mobile app users (who are re-engaged through the app) and desktop users or mobile web users (who land on a web page). The Adjust tracking link handles mobile attribution for the app-install or re-engagement flow, but the web session — the part that shows up in GA4 — needs UTM parameters to be attributed correctly. Without UTM parameters on the web destination URL, the GA4 report for a successful Adjust retargeting campaign will show a spike in Direct traffic with no campaign attribution.

Parameter type Where it appears What it tracks Used by
adjust_t Adjust tracking link URL App install / re-engagement attribution Adjust SDK (mobile)
utm_source=adjust Destination URL Web session source in GA4 GA4 (web)
utm_medium Destination URL Channel classification in GA4 GA4 (web)
utm_campaign Destination URL Campaign grouping in GA4 reports GA4 (web)

The two parameter sets coexist on the same URL without conflict. Adjust reads its own token from the tracking link and applies it to mobile attribution. GA4 reads UTM parameters from the destination URL query string and applies them to web session attribution. Both can be active simultaneously and neither interferes with the other.

Building tracked Adjust destination URLs with mlz build

In Adjust, every tracking link has a "Redirect URL" or deeplink_url — the destination URL that users land on after Adjust records the click. This is where UTM parameters go. Build your tracked destination URL with mlz build before creating or updating the Adjust tracking link, then paste the resulting tracked_url as the deeplink_url value in your Adjust tracking link configuration. Add --validate to confirm the destination resolves correctly and UTM parameters survive any redirect chain — including the Adjust redirect itself, which you should test separately using mlz check on the full Adjust tracking link URL.

mlz build — Adjust campaign destination URLs by channel
# Paid social campaign driving traffic to web landing page
$ mlz build \
  --url "https://example.com/install-page" \
  --source "adjust" \
  --medium "social" \
  --campaign "ios-acquisition-jun-2026" \
  --validate

{
  "tracked_url": "https://example.com/install-page?utm_source=adjust&utm_medium=social&utm_campaign=ios-acquisition-jun-2026",
  "params": {
    "utm_source": "adjust",
    "utm_medium": "social",
    "utm_campaign": "ios-acquisition-jun-2026"
  },
  "stored": true
}

# Paid search retargeting (CPC)
$ mlz build \
  --url "https://example.com/offer" \
  --source "adjust" \
  --medium "cpc" \
  --campaign "retargeting-lapsed-jun-2026" \
  --content "banner-300x250" \
  --validate

{
  "tracked_url": "https://example.com/offer?utm_source=adjust&utm_medium=cpc&utm_campaign=retargeting-lapsed-jun-2026&utm_content=banner-300x250"
}

# Email re-engagement campaign via Adjust email integration
$ mlz build \
  --url "https://example.com/come-back" \
  --source "adjust" \
  --medium "email" \
  --campaign "reengagement-email-jun-2026" \
  --validate

{
  "tracked_url": "https://example.com/come-back?utm_source=adjust&utm_medium=email&utm_campaign=reengagement-email-jun-2026"
}

Set the tracked_url as the redirect destination (the deeplink_url parameter or the "Redirect URL" field) in your Adjust tracking link. When a user clicks the Adjust tracking link, Adjust records the attribution event and redirects to the tracked_url. GA4 reads the UTM parameters from the destination URL and attributes the web session to the correct campaign — simultaneously with Adjust recording its mobile attribution click.

Validating UTM parameters survive the Adjust redirect chain

Adjust tracking links include one or more redirects before the browser reaches the final destination. On mobile devices, Adjust may redirect through the app store before falling back to the web URL (for users without the app). On desktop, Adjust redirects directly to the deeplink_url. The risk is that query parameters — including your UTM parameters — are stripped during one of these redirect hops. This can happen if the Adjust tracking link is configured without proper URL encoding, if an intermediate landing page server strips query strings, or if a CDN or load balancer rewrites URLs before they reach your destination page.

After setting your tracked destination URL in the Adjust tracking link, validate the full Adjust tracking link URL to confirm UTM parameters survive the complete redirect chain to the final destination.

mlz check — validate UTM parameters survive Adjust redirect chain
# Check the full Adjust tracking link (not just the destination)
# Confirms UTM parameters survive the Adjust redirect to the final URL
$ mlz check "https://app.adjust.com/your-token?deeplink_url=https%3A%2F%2Fexample.com%2Foffer%3Futm_source%3Dadjust%26utm_medium%3Dcpc%26utm_campaign%3Dretargeting-jun-2026"

{
  "url": "https://app.adjust.com/your-token?deeplink_url=...",
  "valid": true,
  "checks": [
    { "check": "ssl", "status": "pass", "message": "URL uses HTTPS." },
    { "check": "resolution", "status": "pass", "message": "Destination responded with 200." },
    { "check": "redirects", "status": "pass", "message": "2 redirects detected. UTM parameters present at final destination." }
  ],
  "status_code": 200
}

The redirect check confirms that UTM parameters present in the deeplink_url are still present at the final destination after all Adjust redirect hops complete. If the redirect check shows a failure or warning about missing UTM parameters at the final destination, check that your deeplink_url value is properly URL-encoded in the Adjust tracking link and that no intermediate server is stripping query strings. See the guide to detecting redirect-based UTM stripping for diagnosis steps.

Adjust UTM tracking gotchas

Adjust attribution tokens (adjust_t) are not the same as UTM parameters and are not readable by GA4
When Adjust records a click on a tracking link, it appends its own attribution parameters (adjust_t, adjust_creative, adjust_adgroup) to the destination URL for the Adjust SDK to read after app install. GA4 does not know about Adjust's parameter format and will not use adjust_t for web session attribution. Only standard utm_source, utm_medium, and utm_campaign parameters in the URL query string affect GA4's web session attribution model. This is why Adjust and UTM parameters need to coexist: Adjust parameters handle mobile attribution in the Adjust SDK; UTM parameters handle web session attribution in GA4.
Adjust's "Impression Tracking URLs" and "Click Tracking URLs" serve different functions — only click URLs have a web destination that needs UTM parameters
Adjust generates both impression tracking URLs (for tracking ad impressions, no click required, no redirect to a web destination) and click tracking URLs (for tracking ad clicks, with a redirect to the app store or web destination). UTM parameters are only relevant for click tracking URLs that have a web destination — either a web landing page or the web fallback URL for app store redirects when the app is not installed. Impression tracking pixels do not open a browser and do not create GA4 sessions, so they do not need UTM parameters.
Adjust's SmartBanner product has its own attribution for web-to-app flows — UTM parameters still needed for GA4 web session attribution
Adjust SmartBanner shows a banner on your web pages encouraging mobile users to download or re-engage with your app. When a user clicks the SmartBanner, Adjust records the click using Adjust attribution. The Adjust SmartBanner SDK handles the app store redirect and Adjust attribution — but the original web page session that showed the banner was a direct web session that came from some source. If that web session's source is not attributed in GA4 (via UTM parameters on the URL that brought the user to the SmartBanner page), you won't know which channel drove the SmartBanner impression. Use UTM parameters on all URLs that drive traffic to pages with Adjust SmartBanners — the UTM parameters attribute the web session, and Adjust SmartBanner records the app download conversion separately.
Adjust's URL encoding requires careful handling of UTM parameters in the deeplink_url parameter
When you set a deeplink_url in an Adjust tracking link, the destination URL containing UTM parameters must be URL-encoded as the value of the deeplink_url query parameter. For example, the & separating UTM parameters in the destination URL must be encoded as %26 within the deeplink_url value, otherwise Adjust's URL parser may interpret the & as a separator between Adjust's own tracking link parameters. Use mlz build --format json | jq -r '.tracked_url' | python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read().strip()))" to URL-encode the tracked URL before appending it as deeplink_url=... to your Adjust tracking link. After construction, always run mlz check on the complete Adjust tracking link to verify end-to-end resolution and UTM parameter preservation.
Adjust's Probabilistic Attribution mode may change how tracking links are structured
Adjust offers Probabilistic Attribution (fingerprinting) as a fallback attribution method for scenarios where deterministic attribution is not possible (e.g., iOS after ATT opt-out with no click ID). When Probabilistic Attribution is active, the click may not result in the same redirect path as deterministic attribution. The web destination and UTM parameters you set in deeplink_url remain the same regardless of the attribution method — Probabilistic Attribution affects how Adjust attributes the install on the mobile side, not the URL the browser opens. UTM parameters on the destination URL continue to work normally for GA4 web session attribution in Probabilistic Attribution scenarios.

Adjust UTM naming conventions

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

  • utm_source: adjust for campaigns where Adjust is the tracking platform for all paid channels. Some teams prefer to use the underlying network name (facebook, google, ironSource) as the UTM source, using the network that Adjust is tracking rather than the MMP itself. Either convention works in GA4, but using adjust as the source makes it immediately clear in GA4 reports that these sessions are tracked via Adjust attribution — useful when you have both Adjust-tracked campaigns and direct network campaigns running simultaneously. Align with your team's convention and apply it consistently.
  • utm_medium: Use the channel type of the underlying campaign, not "adjust" — Adjust is the tracking platform, not the channel. For paid social campaigns: social or paid-social. For paid search: cpc. For display/programmatic: display. For video ads: video. For email re-engagement campaigns via Adjust's email integrations: email. For push notification retargeting campaigns run through Adjust partner networks: push.
  • utm_campaign: A consistent lowercase-hyphenated campaign name that matches your Adjust campaign name where possible. For acquisition campaigns: ios-acquisition-jun-2026, android-ua-jun-2026. For retargeting campaigns: retargeting-lapsed-30d-jun-2026, cart-abandon-retargeting. For app re-engagement: reengagement-social-jun-2026. Aligning your utm_campaign with your Adjust campaign name in the dashboard makes cross-referencing GA4 web data with Adjust mobile attribution data much easier.
  • utm_content: Creative or ad unit identifier. For display campaigns with multiple banner sizes: utm_content=banner-300x250, utm_content=banner-728x90. For A/B tested creative variants: utm_content=creative-a, utm_content=creative-b. For retargeting campaigns with audience-specific messages: utm_content=lapsed-30d, utm_content=cart-abandon. This allows GA4 to differentiate which creative drove the most web conversions independently of Adjust's creative-level attribution data.
  • utm_term: Keyword or targeting segment. For paid search campaigns tracked through Adjust: the keyword that triggered the ad, e.g., utm_term=mobile-app-download. For audience-targeted display campaigns: the audience segment identifier. Omit for campaigns where keyword-level tracking is not relevant (social, push notification retargeting).

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 Adjust automatically add UTM parameters to destination URLs?
No. Adjust tracking links redirect to whatever destination URL you configure as the deeplink_url or redirect URL — Adjust does not automatically append UTM parameters for GA4 attribution. Adjust appends its own attribution parameters (adjust_t, adjust_creative) for use by the Adjust SDK, but these are not UTM parameters and are not read by GA4. You need to manually build UTM-tagged destination URLs with mlz build --source "adjust" --medium "[channel]" --campaign "your-slug" --validate and set those tracked URLs as the destination in your Adjust tracking links.
Can I use both Adjust attribution and UTM parameters on the same campaign simultaneously?
Yes, and this is the recommended approach. Adjust attribution parameters (adjust_t and related parameters) are added by Adjust to the tracking link and are read by the Adjust SDK in the mobile app after install. UTM parameters (utm_source, utm_medium, utm_campaign) are in the destination URL's query string and are read by GA4 when the user lands on the web page. The two parameter sets are completely independent of each other. Adjust ignores UTM parameters, and GA4 ignores Adjust parameters. Use both simultaneously: Adjust measures mobile attribution, GA4 measures web session behavior and conversion data. Cross-reference the two data sources in Adjust's Data Export or via BigQuery to build a complete picture of campaign performance across mobile and web.
Why do my Adjust campaign clicks show as Direct in GA4 even though the Adjust tracking link is working?
If Adjust is recording clicks and attributing installs correctly but GA4 shows the resulting web sessions as Direct, UTM parameters are missing from the destination URL. This is the most common scenario for teams new to running Adjust alongside GA4. The fix is to append UTM parameters to the destination URL (deeplink_url) in your Adjust tracking link. Use mlz build --source "adjust" --medium "[your-channel]" --campaign "your-campaign-slug" --validate to generate a validated tracked URL, then update your Adjust tracking link's destination to that tracked URL. Also run mlz check on the full Adjust tracking link URL to confirm UTM parameters survive the redirect chain to the final destination.
How do I validate that UTM parameters survive the Adjust redirect to the destination?
Run mlz check "https://app.adjust.com/your-token?deeplink_url=your-encoded-tracked-url" on the full Adjust tracking link URL after configuration. The redirect chain check confirms that UTM parameters present in the deeplink_url value arrive intact at the final destination after all Adjust redirect hops. If the check reports UTM parameters stripped at the final destination, verify that the deeplink_url value in the Adjust tracking link is properly URL-encoded and that no intermediate server (CDN, load balancer, your own server's URL rewriting) is stripping query strings. See the redirect UTM stripping guide for diagnosis steps.
Should utm_source be "adjust" or the underlying ad network (e.g., "facebook") for Adjust-tracked campaigns?
Both conventions work. Using utm_source=adjust signals in GA4 that the session originated from an Adjust-tracked campaign, making it easy to isolate all Adjust campaigns in GA4 before pivoting on utm_medium and utm_campaign for detail. Using the underlying network name (utm_source=facebook, utm_source=google) makes the GA4 channel attribution match the network source more directly — useful if you compare Adjust and non-Adjust campaigns from the same network. Choose one convention, apply it consistently across all Adjust campaigns, and document it in your team's UTM taxonomy. See the UTM naming conventions guide for the full taxonomy framework.

Build Adjust campaign destination URLs from the terminal

Use mlz build --source "adjust" --medium "[channel]" --campaign "your-slug" --validate to generate validated tracked URLs for each Adjust campaign. Set the resulting tracked_url as the deeplink_url in your Adjust tracking links. After configuration, run mlz check on the complete Adjust tracking link URL to confirm UTM parameters survive the redirect chain to the final destination before the campaign goes live.

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.