Skip to content



This guide will walk you through how to integrate your email service provider with Branch. If you have not completed the getting started steps, please follow this documentation first.

Configure your ESP

To open the app directly on iOS 9.2+, you must configure your email integration and your app to support Universal Links in emails.

Tell us your click tracking domain

You can retrieve your click tracking domain from your Sailthru settings:

  1. Log in to your Sailthru account
  2. Go to Settings > Setup > Domains:


  3. Note or copy the value in the Link Domain field

  4. Enter the domain in item 1 of this step:


  5. Click Done

On Done click, an AASA file - required for Universal Links - specific to that domain will be generated.

Send your AASA file to your ESP


Your AASA file must be uploaded to your click tracking domain by your email service provider. Your ESP account manager will do this for you - enter their email and click Send, and they will receive an email with the file and request to upload.

Configure your app for your click tracking domain


In this prompt, enter the email of someone on your team who is qualified to modify your iOS app, and then click Send. They will complete the technical setup steps below.

Technical setup

The following app changes ensure that your email integration supports Universal Links. You will need access to your app code to make these changes.

You should have received an email from Branch with your ESP's click tracking domain. If not, likely you or someone on your team still needs to complete the Deep Linked Email setup flow.

How does it work?

Apple recognizes the click tracking domain as a Universal Link, and opens the app immediately without the browser opening. Once the app has opened, Branch will collect the referring URL that opened the app (at this time, it will be the click tracking url). Inside the app, Branch will robotically “click” the link, registering the click with the ESP, and returning the Branch link information to the Branch SDK inside the app. This information is then used to deep link the user to the correct in-app content. See the Support section for more information.

Upload your AASA file

Sailthru will host an Apple App Site Association (AASA) file for you, so that your click tracking domain appears to Apple as a Universal Link, and the app will open and deep link.

To set up your AASA file, download the AASA file from the email you received from Branch, and follow the instructions provided by Sailthru for setting up the HTTPS certificates.

Add your click tracking domain to your Associated Domains

To enable Universal Links on your click tracking domain, you'll need to add the click tracking domain to your Associated Domains entitlement.

  1. In Xcode, go to the Capabilities tab of your project file.
  2. Scroll down and enable Associated Domains if it is not already enabled.


  3. Copy your click tracking domain from the email you received from Branch, or retrieve it from your ESP's settings.

  4. In the Domains section, click the + icon and add your click tracking domain. For example, if your click tracking domain is, add an entry for


Having trouble or new to Universal Links?

Follow these instructions for more details on enabling Universal Links in the Branch dashboard and in Xcode.

If you have links to content that exists only on web, and not in the app (for example, a temporary marketing webpage that isn't in the app) then this code snippet will ensure all links that have not had the deep linking script applied will open in a browser.

You should add this code snippet inside the deep link handler code block. Note that this uses query parameter $web_only=true. This should match the query parameter on the web URL you enter in the email.

[branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
  // params are the deep linked params associated with the link that the user clicked before showing up.
  if (params[@"$3p"] && params[@"$web_only"]) {
            NSURL *url = [NSURL URLWithString:params[@"$original_url"]];
            if (url) {
                [application openURL:url]; // check to make sure your existing deep linking logic, if any, is not executed, perhaps by returning early
  } else { 
    // it is a deep link
    GDLog(@"branch deep link: %@", [params description]); 
    [self handleBranchDeeplink:params];

Validate and test


The last step of the Deep Linked Email setup flow validates whether you have completed all necessary steps and whether an engineer on your team has completed the technical setup steps. You will also see recommendations for how to improve your email integration.


Once you’ve completed the one time setup steps, it’s time to send your first email.

This guide will identify which web links you'd like to open the app and deep link, as well as convert them to Branch links.

There are a few different ways you can create Branch links that are compatible with Deep Linked Email + Sailthru. You will need to replace the web URLs in your templates with these. To create Branch links, you can either:

  1. Automatically populate emails with content via Zephyr
  2. Making regular Branch links compatible with email
  3. Create email links via API without changing your email templates
  4. Convert all web links in your email to deep links

Automatically populate emails with content via Zephyr

Sailthru allows you to automatically populate emails with content via Zephyr. This means that you can create a template once, then have all subsequent emails automatically configured to convert normal web URLs into deep links.

The Sailthru integration requires you to add code in two places:

  1. At the top of an email template
  2. Immediately before a hyperlink
Prepare your template

At the top of each email template, you should simply copy and paste the following snippet. It specifies a variable that is used to automatically contruct deep links, branch_base_url. This snippet will be provided by your Branch Account Manager.

Copy the below snippet and paste it above the <head> tag:

{branch_base_url='BASE URL FROM BRANCH'}

Enter the base url provided by your Branch account manager.



Before each hyperlink, you’ll need to include a short amount of code. Put the original link (which will automatically be converted to a deep link) on the first line of the code snippet.


<a href="ORIGINAL URL">Click me</a>



{*Branch deeplink builder*}{deeplink=branch_base_url + "&%24original_url=" + u(link)}{*end Branch deeplink builder*}

<a href="{deeplink}">Click me</a>



{*Branch deeplink builder*}{deeplink=branch_base_url + "&%24original_url=" + u(link)}{*end Branch deeplink builder*}

<a href="{deeplink}">Click me</a>


Using Branch Links with Zephyr

The Branch deep link script also works with Sailthru's Zephyr personalization language. Here's an example with the correct syntax.


{*Branch deeplink builder*}{deeplink=branch_base_url + "&%24original_url=" + u(link)}{*end Branch deeplink builder*}

<a href="{deeplink}">Click me</a>

Be sure to add "$3p":"e_xx" to the deep link data of any links you use in email to ensure Universal Link and click tracking works as expected.

To create email links via API, please use the instructions on how to create links via API, but include the following key value pairs in your call:

  1. "$3p":"e_xx" This is required for Universal Link and click tracking functionality.
  2. "$original_url":"{{your web url URI encoded}}" For each piece of content, include a URI encoded version of your content's web URL. You can also add deep link data as query parameters on that web URL. This ensures accurate Content Analytics reporting. Example: "$original_url":""

We have provided a way of easily converting web links to Branch links, as well as an example. The example takes an html email (as a string) and applies the script to it.

Here is the script:

var crypto = require('crypto');
module.exports = function(original_url, branch_base_url) {
    if (!original_url) { return new Error('Missing original_url'); }
    if (typeof original_url != 'string') { return new Error('Invalid original_url'); }
    if (!branch_base_url) { return new Error('Missing branch_base_url, should be similar to'); }
    if (typeof branch_base_url != 'string') { return new Error('Invalid branch_base_url'); }

    return branch_base_url + '&%24original_url=' + encodeURIComponent(original_url);

Here is how links look before and after (the latter being a Branch deep link).

  1. Before:
  2. After:

Note that these are simplified examples, not actual demo links.

With your email service provider, all email links will open the app by default. In order for your app to know that the email link should bounce to web after opening the app, add %24web_only%3Dtrue to your links as a query parameter, for example:

<a href="" >Link to your app!</a>

Handle links for web-only content

Make sure you have completed the technical setup steps to handle web-only links within your app.

More information

Curious about how email works and more FAQ? Visit our general email support page.