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.
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.
# 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.
# 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 useadjust_tfor web session attribution. Only standardutm_source,utm_medium, andutm_campaignparameters 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_urlin an Adjust tracking link, the destination URL containing UTM parameters must be URL-encoded as the value of thedeeplink_urlquery parameter. For example, the&separating UTM parameters in the destination URL must be encoded as%26within thedeeplink_urlvalue, otherwise Adjust's URL parser may interpret the&as a separator between Adjust's own tracking link parameters. Usemlz 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 asdeeplink_url=...to your Adjust tracking link. After construction, always runmlz checkon 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_urlremain 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:
adjustfor 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 usingadjustas 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:
socialorpaid-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 yourutm_campaignwith 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_urlor 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 withmlz build --source "adjust" --medium "[channel]" --campaign "your-slug" --validateand 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_tand 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. Usemlz build --source "adjust" --medium "[your-channel]" --campaign "your-campaign-slug" --validateto generate a validated tracked URL, then update your Adjust tracking link's destination to that tracked URL. Also runmlz checkon 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 thedeeplink_urlvalue arrive intact at the final destination after all Adjust redirect hops. If the check reports UTM parameters stripped at the final destination, verify that thedeeplink_urlvalue 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=adjustsignals in GA4 that the session originated from an Adjust-tracked campaign, making it easy to isolate all Adjust campaigns in GA4 before pivoting onutm_mediumandutm_campaignfor 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.
Related reading
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.