Skip to content

Grow

Deep links

A deep link opens a specific screen inside your installed app, such as a challenge, a referral invite or a product page. If the app is not installed, the visitor goes to the store instead, just like with your smart link. Deep links are available on Pro, Studio and Lifetime. Universal Links and Android App Links also need a custom domain, which is part of Studio.

How a deep link works

Add /open/ and the in-app path to your smart link. The query string is passed along too:

https://mapps.one/habitly/open/challenges/30-days?ref=newsletter
VisitorWhat happens
iPhone or iPad, with an iOS URL scheme set A short page tries to open habitly://challenges/30-days?ref=newsletter. If the app is not installed, the visitor continues to the App Store.
Android or Huawei, with a package name set A short page opens an Android intent for the same path, limited to your package. Chrome opens the app if it is installed, and otherwise follows the fallback to Google Play.
Phone or tablet, with no deep link settings for its platform Redirected straight to the fallback.
Desktop computers and bots Redirected to the smart link, with the query string kept.

The fallback is wherever your smart link would send that device, following your redirect rules, with UTM tags forwarded. If that platform has no store link, the fallback is the landing page. If deep links are not set up at all, or the plan does not include them, every visitor is redirected to the smart link.

Paths may contain letters, numbers and the characters / _ - . ~ %. Other characters are removed, so percent-encode anything else, such as spaces (%20).

Set up

Open the app's Deep links tab and fill in the fields for the platforms you support:

FieldExampleUsed for
iOS URL schemehabitly://Opening the app from the redirect page on iPhone and iPad
Apple Team IDA1B2C3D4E5Universal Links. The 10-character ID from the Membership details of your Apple Developer account.
iOS bundle IDcom.habitly.appUniversal Links
Android package namecom.habitly.appOpening the app on Android and Huawei devices
Android schemehabitlyThe scheme your intent filter handles
SHA-256 certificate fingerprints14:6D:E9:83:...:44:E5Android App Links. Add one or more, separated by commas, spaces or new lines.
Android scheme: set it to the custom scheme your app registers, such as habitly. If you leave it empty, https is used and the first part of the path becomes the host (https://challenges/30-days). That only works if your intent filter expects it.

Register the scheme in your app

iOS, in Info.plist:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>habitly</string>
    </array>
  </dict>
</array>

Android, in AndroidManifest.xml:

<activity android:name=".MainActivity" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="habitly" />
  </intent-filter>
</activity>

In your app, read the incoming URL, route to the matching screen and read any query parameters you need. Send unknown paths to the home screen, because people edit URLs.

Universal Links and Android App Links

Scheme links show a short redirect page first, and iOS may ask the visitor to confirm. Verified links skip that step: when the app is installed, the system opens it directly. Verification needs a domain that belongs to your app only, so it works on your custom domain. Once get.habitly.app is connected, mapps.one serves the association files for you:

FileBuilt from
https://get.habitly.app/.well-known/apple-app-site-association
(also at /apple-app-site-association)
Apple Team ID and bundle ID
https://get.habitly.app/.well-known/assetlinks.jsonAndroid package name and SHA-256 fingerprints

The Apple file covers every path under /open/:

{
  "applinks": {
    "details": [
      {
        "appIDs": ["A1B2C3D4E5.com.habitly.app"],
        "components": [
          { "/": "/open/*", "comment": "Deep links created with mapps.one" }
        ]
      }
    ]
  },
  "webcredentials": { "apps": ["A1B2C3D4E5.com.habitly.app"] }
}

The Android file:

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.habitly.app",
      "sha256_cert_fingerprints": [
        "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
      ]
    }
  }
]

Each file returns "404 Not Found" until its fields are valid: a 10-character Team ID and a bundle ID for Apple, and a package name with at least one fingerprint in the AA:BB:... format (32 pairs) for Android. Use the fingerprint of the Play App Signing key from Play Console → App integrity, and add your upload key too if you test locally signed builds. The files are cached for an hour. Apple also caches them on its own servers, so reinstall the app to test changes.

Configure your app

iOS: add the Associated Domains capability with applinks:get.habitly.app.

Android: add a verified intent filter for your domain:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" android:host="get.habitly.app" android:pathPrefix="/open/" />
</intent-filter>

Then use links like https://get.habitly.app/open/challenges/30-days in your campaigns. When the app is not installed, the browser loads the page and the same fallback flow runs.

Use your domain in verified links. Association files are only served on custom domains, because mapps.one is shared by many apps. Links on mapps.one/habitly/open/ keep working through the redirect page. Deep link URLs shown in the dashboard and the API use mapps.one, so replace the host with your domain when you want verified links.

Analytics

An open is counted under Deep link opens when a phone or tablet loads an /open/ URL and mapps.one tries to open the app. The fallback to the store is not counted a second time. Verified links that open the app directly never reach mapps.one, so they are not counted. Use your own app analytics for those.