Universal Links are a particular protocol for deep linking, available in iOS version 9 and above. These are set up differently than the custom scheme URL workflows that are used in other versions of iOS and on other platforms.

You just need to activate the Universal Link support in your Adjust dashboard, and whitelist your app-specific subdomain inside your app. Adjust will handle all the server-side implementation of Universal Links for you.

Once you have integrated the Universal Link workflow, Adjust will automatically use the Universal Link protocol to fulfill deep links, fall back to the Store, defer deep links and other functionality, as is discussed in more detail in the deep-linking guide. Universal Links are implemented differently, but Adjust consolidates deep-linking behaviour and offers a comprehensive set of functionality, consistently across all platforms.

Adjust will handle most of the logic of Universal Links. You need to activate this in your dashboard to create a special, app-specific subdomain, and then you need to whitelist this domain in your app.

  1. Activate Universal Links in your Adjust dashboard by entering your app’s iOS bundle ID (how to find your bundle ID) in All Settings > Platforms and your iOS app prefix and custom URL scheme in the Universal Links module. You can find your iOS App prefix under the membership tab of the Apple Developer Center.
    Adjust will then create your short Universal Link token This may look something like:

     abcd.adj.st
     
  2. In your app, you need to add the short universal link token combined with the applinks: prefix in the com.apple.developer.associated-domains entitlement:

     applinks:abcd.adj.st
     

    You can read more about this in Apple’s developer documentation.

  3. Additionally, you will need to implement the continueUserActivity method in your app. This is a very simple method to catch the Universal Links. You can find the details along with sample code in the iOS SDK readme.

  4. Test your Universal Link implementation.

  5. You need to push the new build to the App Store before you can use Universal Links in campaigns. Adjust will automatically use the workflow that suits the users’ app version and platform. All versions and all platforms of your app where your app is set up to handle deep linking (whether through Universal Links or custom scheme URLs) are supported with a single tracker link.

  6. You can now run campaigns using both deep_link parameters within your Adjust tracker URLs or with direct Universal Links

In addition to Universal Links, your app should also register and handle custom scheme URLs. This is still the primary technique of deep linking on iOS. Adjust will automatically translate the Universal Links into custom scheme URLs in your app. Additionally, for users on iOS 8 or below, Adjust will try to deep link via custom scheme URLs.

Once Universal Links are integrated into your app and activated in your dashboard, you can use the Universal Links in two ways:

The latter approach allows iOS to bypass the Adjust servers when the app is installed, and thus covers a greater variety of use cases - but also reduces the amount of information you are able to collect upon click.

Check the below table for the use cases you want to cover, to see whether you should use the deep_link parameter or direct Universal Links:

Context Recommended approach
Deep linking with web view other than SFSafariViewController deep_link parameter
Deep linking with SFSafariViewController direct Universal Link
QR 2 app linking direct Universal Link
Messages direct Universal Link
Mail direct Universal Link
WhatsApp direct Universal Link
Viber direct Universal Link
Slack deep_link parameter
Safari deep_link parameter
Chrome deep_link parameter
Gmail deep_link parameter
Inbox deep_link parameter
Twitter direct Universal Link
Facebook deep_link parameter
Push notifications direct deep link

Certain apps and cases, such as Pinterest, WeChat, Facebook Messenger, or Telegram are currently not supported by Universal Links.

Note: For push notifications, things are somewhat complicated. For the most fluid UX, a direct deep link is likely the best choice. However, if you decide that you do not wish for the URL to be opened but rather parsed within the app, then the openURL and continueUserActivity methods will not be called and users will not be reattributed. To have users reattributed when parsing the push notification string, the appWillOpenUrl method needs to be called from the location that your push notification content was delivered to within the app.

When you run campaigns with direct Universal Links, your should use tracking URL’s set up as follows:

  1. In your app’s Universal Link tab, take the short universal link token:
    abcd.adj.st
  2. Add https://
    https://abcd.adj.st
  3. Add the Adjust tracker token:
    https://abcd.adj.st/?adjust_t=abc123
  4. Complete any required path into your app. (see below example)
    https://abcd.adj.st/x/y/z?adjust_t=abc123
  5. Add any other required deeplink attribution data:
    https://abcd.adj.st/x/y/z?adjust_t=abc123&key1=value1&key2=value2
    (Use the bottom level tracker token to avoid attaching extra campaign data)

The simplest tracker URL would look like the result at step 3 above:

https://abcd.adj.st/?adjust_t=abc123

But lets say your Adjust tracker is def456 and your deep link would usually look like this myapp://dress/shoes/bigoffer/coupon/summer?type=invite&user=xxxxx. Then your path is dress/shoes/bigoffer/coupon/summer and your tracker URL would look like

https://abcd.adj.st/dress/shoes/bigoffer/coupon/summer?adjust_t=def456&type=invite&user=xxxxx

Note: Make sure that your tracking URL has the path before the ? and key=value pairs separated by a & after the ?: There should only be one ?!!

Adjust Universal Links support cross-platform trackers just like regular Adjust trackers.

Simply combine both of your tracker tokens as required with an underscore between them, as per the example below.

To ensure that cross-platform Universal Links work on Android, you must also append an adj_deeplink or adjust_deeplink parameter to the end of the tracker URL directing users to the desired location within the app (this must also be encoded), e.g., adjust_deeplink=myapp%3A%2F%2Fofferpage.

Please note that any in-app path specified through an adj_deeplink or adjust_deeplink parameter will only work on Android. To ensure that deferred deeplinking to a specific in-app path works on iOS, you must include the in-app path after the Universal Link token, e.g., https://abcd.adj.st/offerpage.

Your completed cross-platform Universal Link should, therefore, look something like this:

https://abcd.adj.st/offerpage?adjust_t=abc123_def456&adjust_deeplink=myapp%3A%2F%2Fofferpage

It is also possible to direct users on one platform to a specific in-app location and users on the other platform to only your app homepage by including a path after either the Universal Link token or the adjust_deeplink parameter and not including it after the other. For example:

https://abcd.adj.st/offerpage?adjust_t=abc123_def456&adjust_deeplink=myapp%3A%2F%2F

5Adding additional Adjust parameters.

Universal Links can be enhanced using any of the parameters available in regular Adjust tracking urls, including campaign and label information or callbacks. The only difference is that you must prefix these parameters with adjust_. You could for example use a tracking URL as below.

https://abcd.adj.st/?adjust_t=abc123_def456&adjust_campaign=CampaignName&adjust_label=otherImportantInfo&adjust_redirect=www.myAppPage.com&adjust_install_callback=https://myServer.com?install

You can also continue to run campaigns with the traditional deeplink parameter, like below:

https://app.adjust.com/f0ob4r?deep_link=myapp://

Adjust will then recognize if Universal Links should be used and send the user on to your app-specific subdomain. At the same time, that same deep link would be used on Android or on older versions of iOS.

Any path or deep link parameters you add to your custom scheme URL will be added to the Universal Link, too. So if your deep link is myapp://products/category/512, the path of your deep link will be /products/category/512. How to catch these parameters is described in the iOS SDK readme.

Universal Links will be served to users on iOS above version 9.0. Users below that will be deep linked using the custom scheme URL that you specify. Additionally, for iOS versions 9.0 and 9.1, Adjust will attempt to deep link users with custom scheme URLs if the Universal Links are not enabled. iOS 9.2 and above do not support custom URL scheme-based deep linking.

When the user does not have the app installed, or does not have a version of the app which supports deep linking, they will be sent into the App Store.

Once you have integrated Universal Links in your app, and activated it in your dashboard, Adjust has generated a Universal Link URL for you. You can now proceed to test your implementation with the steps below.

  1. Create a webpage which you can easily edit and access from your mobile device.

    There are multiple ways to achieve this, whether using a local webserver accessible on your wifi, or using a CMS to create a hidden page on your website.

  2. Add your direct Universal Link, and or your tracker link with deep link parameters attached to this page.

  3. Add your bare Direct Universal Link. This is as per step 2 of building your direct Universal Link. For example:
    • https://abcd.adj.st
  4. You can use TestFlight to load the new build of the app, or install a debug version of the app with xCode. In either case, open the webpage with Safari.

  5. Click on both your direct Universal Link and or your tracker link with deep link parameters attached. With the new build of your app installed, you should be automatically deep linked into your app with both links.

  6. If the app doesn’t open, verify that your app integration is correct by clicking on the bare Direct Universal Link.

  7. If the app doesn’t open with either of these links, verify that all steps above have been completed.

Already implemented Universal Links outside of Adjust?

This implementation describes how to use the Universal Links protocol for deep linking for your user acquisition. Separately, you can use it on your website to mirror your website content in your app. This is not related to the Adjust functionality, and the workflows can be implemented independently.

You can add more than one associated-domains entitlement in your app. One of those entitlements would be for the Adjust subdomain, and then you can additionally add any number of other websites where you are also using Universal Links.

In this case, typically, you would set up the apple-app-site-association file on your webserver, including data on which apps may mirror content on that site. Separately, you would whitelist your own website as you would have with the Adjust subdomain.

You should still implement the Universal Links for Adjust. Any prior or other implementation is completely independent of the Adjust setup.

When using your own Universal Link without Adjust you can add Adjust campaign structure parameters. Using this setup will result in conversions showing in Adjust without any click data.

http://www.example.com/?adjust_t=foobar&adjust_campaign=summer_sale&adjust_adgroup=blue_dress&adjust_creative=300x250

This setup does not support cross-platform setup.

9Known issues

When users are directed into an app through a Universal Link, they will see a small button in the top-right corner of the app. If they press this button, they will be taken to the app’s website in Safari. Following this choice of action, Universal Links into that app will always take the user to the app’s website instead of into the app, until the user chooses to change this setting again. There is nothing that can be done to prevent or change this unless the user chooses to.

Below is Apple’s explanation of how this works. The full text can be found here.

image of Apple explanation

Feel free to get in touch with support@adjust.com if you have any further questions.

10FAQs

Where can I find my bundle ID?

You or your developer will have assigned your iOS app a bundle ID upon creation. To find it, open iTunes Connect and head to App Information > General Information.