{"id":851,"date":"2026-04-19T13:00:00","date_gmt":"2026-04-19T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=851"},"modified":"2026-03-07T03:48:28","modified_gmt":"2026-03-07T08:48:28","slug":"migrate-from-appsflyer-onelink","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/migrate-from-appsflyer-onelink\/","title":{"rendered":"Migrating from AppsFlyer OneLink to Tolinku"},"content":{"rendered":"\n<p>AppsFlyer is an attribution platform that includes deep linking through its OneLink product. Many teams that started with AppsFlyer for install attribution find themselves paying enterprise prices for a full attribution suite when all they need is reliable deep linking and basic analytics.<\/p>\n\n\n\n<p>Migrating your deep linking from AppsFlyer OneLink to Tolinku lets you separate concerns: use Tolinku for deep linking (at a fraction of the cost) while keeping AppsFlyer for attribution if you still need it, or replace both.<\/p>\n\n\n\n<p>For the general migration guide covering multiple providers, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">Migrating to Tolinku from Branch, Firebase, and AppsFlyer<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding What You&#39;re Migrating<\/h2>\n\n\n\n<p>AppsFlyer OneLink bundles several features:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deep linking<\/strong>: Route users to specific in-app content<\/li>\n<li><strong>Deferred deep linking<\/strong>: Preserve link context through install<\/li>\n<li><strong>Smart banners<\/strong>: Web-to-app banners<\/li>\n<li><strong>Link management<\/strong>: Create and manage marketing links<\/li>\n<li><strong>Attribution<\/strong>: Track which campaigns drove installs and events<\/li>\n<li><strong>Audience segmentation<\/strong>: Target users based on behavior and attribution<\/li>\n<\/ul>\n\n\n\n<p>You&#39;re migrating the deep linking component. Attribution is a separate concern that you can keep with AppsFlyer, move to another attribution provider, or handle with Tolinku&#39;s first-party analytics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Audit Your OneLink Configuration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Link Templates<\/h3>\n\n\n\n<p>AppsFlyer OneLink uses templates that define routing behavior. Export your template configurations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Template name and ID<\/strong>: Each template has a unique ID<\/li>\n<li><strong>Deep link path<\/strong>: The URL scheme or Universal Link path<\/li>\n<li><strong>Subdomain<\/strong>: Your branded link subdomain (e.g., <code>yourapp.onelink.me<\/code> or custom domain)<\/li>\n<li><strong>Platform behavior<\/strong>: What happens on iOS, Android, and web<\/li>\n<li><strong>Deep link parameters<\/strong>: Custom parameters passed through the link<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Link Inventory<\/h3>\n\n\n\n<p>List all active OneLink URLs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Marketing campaign links (generated in the AppsFlyer dashboard)<\/li>\n<li>Custom links (created via the API)<\/li>\n<li>In-app share links (created via the SDK)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Parameter Mapping<\/h3>\n\n\n\n<p>AppsFlyer OneLink supports several parameter types:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deep link value<\/strong> (<code>deep_link_value<\/code>): The primary routing parameter<\/li>\n<li><strong>Deep link sub-parameters<\/strong> (<code>deep_link_sub1<\/code> through <code>deep_link_sub10<\/code>): Additional custom parameters<\/li>\n<li><strong>Attribution parameters<\/strong>: <code>pid<\/code> (media source), <code>c<\/code> (campaign), <code>af_channel<\/code>, etc.<\/li>\n<\/ul>\n\n\n\n<p>Document which parameters your app reads and how it uses them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Set Up Tolinku<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Create Your Appspace<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create an Appspace at <a href=\"https:\/\/tolinku.com\">tolinku.com<\/a><\/li>\n<li>Configure iOS settings (Bundle ID, Team ID)<\/li>\n<li>Configure Android settings (Package Name, SHA-256 fingerprint)<\/li>\n<li>Set your default web fallback URL<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Domain Configuration<\/h3>\n\n\n\n<p><strong>If you used <code>yourapp.onelink.me<\/code><\/strong>: This domain belongs to AppsFlyer. You&#39;ll need a new branded domain (e.g., <code>go.yourapp.com<\/code>). See the <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/domains\/\">Domains setup guide<\/a>.<\/p>\n\n\n\n<p><strong>If you used a custom domain<\/strong>: You can transfer it to Tolinku by updating DNS after setting up your routes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Map OneLink Templates to Routes<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>OneLink Template<\/th>\n<th>Tolinku Route<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Template with <code>deep_link_value=product_123<\/code><\/td>\n<td>Route path: <code>\/product\/:id<\/code><\/td>\n<\/tr>\n<tr>\n<td>Template with <code>deep_link_value=invite<\/code> + <code>deep_link_sub1=CODE<\/code><\/td>\n<td>Route path: <code>\/invite\/:code<\/code><\/td>\n<\/tr>\n<tr>\n<td>Template for web fallback to custom page<\/td>\n<td>Route with custom web fallback URL<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>The key difference: OneLink uses a flat parameter structure (<code>deep_link_value<\/code>, <code>deep_link_sub1<\/code>). Tolinku uses standard URL paths and query parameters (<code>\/product\/123?ref=abc<\/code>). This is simpler but requires remapping your routing logic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Replace the SDK<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Separating Deep Linking from Attribution<\/h3>\n\n\n\n<p>If you want to keep AppsFlyer for attribution but use Tolinku for deep linking, you can run both SDKs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tolinku SDK<\/strong>: Handles deep link routing (Universal Links, App Links, deferred deep linking)<\/li>\n<li><strong>AppsFlyer SDK<\/strong>: Handles install attribution and post-install event tracking<\/li>\n<\/ul>\n\n\n\n<p>This is a valid intermediate step. You can remove the AppsFlyer SDK later when you&#39;re ready.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">If Replacing Both<\/h3>\n\n\n\n<p>Remove the AppsFlyer SDK entirely:<\/p>\n\n\n\n<p><strong>iOS<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Remove <code>AppsFlyerLib<\/code> dependency<\/li>\n<li>Remove <code>AppsFlyerLib.shared().start()<\/code> from AppDelegate<\/li>\n<li>Remove OneLink resolution callbacks (<code>AppsFlyerLibDelegate.onAppOpenAttribution<\/code>)<\/li>\n<li>Remove <code>AppsFlyerLib.shared().continue(userActivity)<\/code> from link handling<\/li>\n<li>Remove event tracking calls (<code>AppsFlyerLib.shared().logEvent()<\/code>)<\/li>\n<\/ol>\n\n\n\n<p><strong>Android<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Remove <code>com.appsflyer:af-android-sdk<\/code> from build.gradle<\/li>\n<li>Remove <code>AppsFlyerLib.getInstance().start()<\/code> from Application class<\/li>\n<li>Remove <code>AppsFlyerLib.getInstance().subscribeForDeepLink()<\/code> callbacks<\/li>\n<li>Remove event tracking calls<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Add Tolinku SDK<\/h3>\n\n\n\n<p>Configure Universal Links (iOS) and App Links (Android) for your Tolinku domain. Handle incoming links by parsing the URL path and parameters:<\/p>\n\n\n\n<p><strong>iOS<\/strong>:<\/p>\n\n\n\n<pre><code class=\"language-swift\">func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {\n    guard let url = userActivity.webpageURL else { return }\n    handleDeepLink(url: url)\n}\n\nfunc handleDeepLink(url: URL) {\n    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)\n    let path = url.path\n\n    if path.hasPrefix(&quot;\/product\/&quot;) {\n        let productId = String(path.dropFirst(&quot;\/product\/&quot;.count))\n        navigateToProduct(id: productId)\n    }\n    \/\/ Handle other routes...\n}\n<\/code><\/pre>\n\n\n\n<p><strong>Android<\/strong>:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">private fun handleDeepLink(uri: Uri) {\n    val path = uri.path ?: return\n\n    when {\n        path.startsWith(&quot;\/product\/&quot;) -&gt; {\n            val productId = uri.lastPathSegment\n            navigateToProduct(productId)\n        }\n        \/\/ Handle other routes...\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Parameter Migration<\/h3>\n\n\n\n<p>Map AppsFlyer&#39;s parameter structure to Tolinku&#39;s URL structure:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>AppsFlyer Parameter<\/th>\n<th>Tolinku Equivalent<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td><code>deep_link_value<\/code><\/td>\n<td>URL path segment<\/td>\n<\/tr>\n<tr>\n<td><code>deep_link_sub1<\/code> through <code>sub10<\/code><\/td>\n<td>URL query parameters<\/td>\n<\/tr>\n<tr>\n<td><code>pid<\/code> (media source)<\/td>\n<td><code>utm_source<\/code> parameter<\/td>\n<\/tr>\n<tr>\n<td><code>c<\/code> (campaign)<\/td>\n<td><code>utm_campaign<\/code> parameter<\/td>\n<\/tr>\n<tr>\n<td><code>af_channel<\/code><\/td>\n<td><code>utm_medium<\/code> parameter<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>Example mapping:<\/p>\n\n\n\n<pre><code># AppsFlyer OneLink\nhttps:\/\/yourapp.onelink.me\/abc?deep_link_value=product&deep_link_sub1=123&pid=email&c=summer_sale\n\n# Tolinku equivalent\nhttps:\/\/go.yourapp.com\/product\/123?utm_source=email&utm_campaign=summer_sale\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Handle Smart Banners<\/h2>\n\n\n\n<p>If you use AppsFlyer&#39;s smart banners (the web-to-app prompts on your mobile website), replace them with Tolinku&#39;s <a href=\"https:\/\/tolinku.com\/features\/smart-banners\">smart banners<\/a>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Remove the AppsFlyer smart banner script from your website<\/li>\n<li>Add the Tolinku banner script<\/li>\n<li>Configure banner settings in your Appspace<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Test and Cut Over<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Testing<\/h3>\n\n\n\n<p>Test every deep link flow:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Existing user taps a link \u2192 app opens to correct screen<\/li>\n<li>New user taps a link \u2192 installs from store \u2192 app opens to correct screen (deferred deep linking)<\/li>\n<li>User without app on web \u2192 redirected to correct fallback URL<\/li>\n<li>OG previews render correctly on social platforms<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cut Over Strategy<\/h3>\n\n\n\n<p><strong>Recommended: Parallel running<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>New campaigns use Tolinku links (new branded domain or new paths)<\/li>\n<li>Existing AppsFlyer OneLink URLs continue to work through AppsFlyer<\/li>\n<li>Gradually shift all link creation to Tolinku<\/li>\n<li>After 2-4 weeks, evaluate if any significant traffic still hits OneLink URLs<\/li>\n<li>If using a custom domain, update DNS to point to Tolinku<\/li>\n<\/ol>\n\n\n\n<p><strong>If using AppsFlyer&#39;s domain (<code>onelink.me<\/code>)<\/strong>: You can&#39;t redirect the old domain. New links must use your Tolinku domain. Old links continue to work through AppsFlyer as long as your account is active.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AppsFlyer-Specific Considerations<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Attribution Data Continuity<\/h3>\n\n\n\n<p>If you keep AppsFlyer for attribution, your historical attribution data stays intact. If you&#39;re leaving AppsFlyer entirely:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Export your attribution data before deactivating<\/li>\n<li>Set up equivalent attribution tracking in Tolinku&#39;s <a href=\"https:\/\/tolinku.com\/features\/analytics\">analytics<\/a><\/li>\n<li>Expect a gap in attribution data during the transition<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cost Implications<\/h3>\n\n\n\n<p>AppsFlyer&#39;s pricing is based on attributed conversions, not just deep link clicks. By moving deep linking to Tolinku, you may be able to downgrade your AppsFlyer plan (or eliminate it entirely if you don&#39;t need third-party attribution).<\/p>\n\n\n\n<p>Tolinku pricing starts at $39\/month per Appspace with 50,000 clicks included. Compare this to AppsFlyer&#39;s enterprise pricing to understand your savings.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Referral and Invite Links<\/h3>\n\n\n\n<p>If your app uses AppsFlyer&#39;s invite\/referral system, replace it with Tolinku&#39;s <a href=\"https:\/\/tolinku.com\/features\/referrals\">referral program<\/a> feature. The mechanics are similar (unique referral links, attribution, reward tracking) but the implementation differs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Timeline<\/h2>\n\n\n\n<p><strong>Day 1-2<\/strong>: Audit OneLink configuration, set up Tolinku, create routes\n<strong>Day 3-4<\/strong>: Integrate SDK, replace deep link handling code\n<strong>Day 5-6<\/strong>: Testing across all platforms and scenarios\n<strong>Day 7<\/strong>: Begin parallel running with new campaigns on Tolinku\n<strong>Day 7-28<\/strong>: Transition period\n<strong>Day 28+<\/strong>: DNS cutover for custom domains (if applicable)<\/p>\n\n\n\n<p>For the general migration guide, see <a href=\"https:\/\/tolinku.com\/blog\/migrating-to-tolinku\/\">Migrating to Tolinku from Branch, Firebase, and AppsFlyer<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Migrate deep linking from AppsFlyer OneLink to Tolinku. Separate your deep linking from your attribution platform with this step-by-step guide.<\/p>\n","protected":false},"author":2,"featured_media":850,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Migrating from AppsFlyer OneLink to Tolinku","rank_math_description":"Migrate deep linking from AppsFlyer OneLink to Tolinku. Separate your deep linking from your attribution platform with this step-by-step guide.","rank_math_focus_keyword":"migrate from AppsFlyer OneLink","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-migrate-from-appsflyer-onelink.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-migrate-from-appsflyer-onelink.png","footnotes":""},"categories":[17],"tags":[25,55,28,20,24,52,30],"class_list":["post-851","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comparisons","tag-android","tag-appsflyer","tag-attribution","tag-deep-linking","tag-ios","tag-migration","tag-sdks"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=851"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/851\/revisions"}],"predecessor-version":[{"id":2510,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/851\/revisions\/2510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/850"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}