{"id":845,"date":"2026-04-18T17:00:00","date_gmt":"2026-04-18T22:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=845"},"modified":"2026-03-07T03:48:27","modified_gmt":"2026-03-07T08:48:27","slug":"migrate-from-branch","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/migrate-from-branch\/","title":{"rendered":"How to Migrate from Branch to Tolinku: Step by Step"},"content":{"rendered":"\n<p>Branch is the most widely used deep linking platform, but its enterprise pricing model, SDK complexity, and feature bloat lead many teams to look for alternatives. If you&#39;ve decided to migrate from Branch to Tolinku, this guide walks you through every step: from pre-migration planning to SDK swap to handling existing links.<\/p>\n\n\n\n<p>For a broader overview of deep link platform migrations (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\">Pre-Migration: Inventory Your Branch Setup<\/h2>\n\n\n\n<p>Before changing anything, document what you&#39;re currently using in Branch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Link Patterns<\/h3>\n\n\n\n<p>Export your Branch link configurations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Quick Links<\/strong>: Marketing links created in the Branch dashboard<\/li>\n<li><strong>Deep Link Routes<\/strong>: URL patterns configured in Branch&#39;s link settings (e.g., <code>\/product\/:id<\/code>, <code>\/invite\/:code<\/code>)<\/li>\n<li><strong>Deep link data<\/strong>: Custom key-value pairs passed through Branch links (e.g., <code>product_id<\/code>, <code>referral_code<\/code>, <code>campaign<\/code>)<\/li>\n<li><strong>Redirect targets<\/strong>: Where each link sends users who don&#39;t have the app (web fallback URLs, custom landing pages)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SDK Usage<\/h3>\n\n\n\n<p>Identify how your app uses the Branch SDK:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deep link handling<\/strong>: How does your app receive and process deep link data from Branch?<\/li>\n<li><strong>Link creation<\/strong>: Does your app create Branch links programmatically (using the BranchUniversalObject API)?<\/li>\n<li><strong>Events<\/strong>: What custom events are you tracking through the Branch SDK?<\/li>\n<li><strong>Referral system<\/strong>: Are you using Branch&#39;s referral tracking?<\/li>\n<li><strong>Content discovery<\/strong>: Are you using Branch&#39;s content indexing (Spotlight, Firebase App Indexing)?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">External Integrations<\/h3>\n\n\n\n<p>List everywhere Branch links appear:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email campaigns (which ESP? How are links generated?)<\/li>\n<li>Social media posts (organic and paid)<\/li>\n<li>QR codes (print materials, packaging)<\/li>\n<li>Paid ad campaigns (which networks?)<\/li>\n<li>Partner integrations (which partners use your Branch links?)<\/li>\n<li>SMS\/push notifications<\/li>\n<li>Website (smart banners, download buttons)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: 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>Sign up at <a href=\"https:\/\/tolinku.com\">tolinku.com<\/a> and create an Appspace for your app<\/li>\n<li>Configure your iOS settings (Bundle ID, Team ID)<\/li>\n<li>Configure your Android settings (Package Name, SHA-256 fingerprint)<\/li>\n<li>Set your web fallback URL<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"900\" src=\"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-settings.png\" alt=\"Tolinku Appspace configuration page showing iOS and Android setup\" class=\"wp-image-525\" srcset=\"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-settings.png 1280w, https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-settings-300x211.png 300w, https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-settings-1024x720.png 1024w, https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/platform-platform-settings-768x540.png 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Configure your iOS and Android app settings in the Tolinku Appspace<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Set Up Your Branded Domain<\/h3>\n\n\n\n<p>If you&#39;re using a custom link domain with Branch (e.g., <code>yourapp.app.link<\/code> or a custom domain), set up your branded domain in Tolinku:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add your domain in the <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/domains\/\">Domains<\/a> section<\/li>\n<li>Update DNS (CNAME record pointing to Tolinku&#39;s servers)<\/li>\n<li>Wait for SSL provisioning<\/li>\n<\/ol>\n\n\n\n<p>If you want to use the same custom domain you&#39;re using with Branch, you&#39;ll need to update the DNS during the cutover step (Step 4). Until then, use a new subdomain for testing (e.g., <code>links.yourapp.com<\/code> while Branch still uses <code>go.yourapp.com<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Recreate Your Routes<\/h3>\n\n\n\n<p>Map your Branch link patterns to Tolinku <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/routes\/\">routes<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Branch Config<\/th>\n<th>Tolinku Equivalent<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Deep Link Route <code>\/product\/:id<\/code><\/td>\n<td>Route with path <code>\/product\/:id<\/code><\/td>\n<\/tr>\n<tr>\n<td>Link data key <code>product_id<\/code><\/td>\n<td>URL parameter or path parameter<\/td>\n<\/tr>\n<tr>\n<td>Custom redirect URL<\/td>\n<td>Web fallback URL on the route<\/td>\n<\/tr>\n<tr>\n<td>Deep Link Domain<\/td>\n<td>Custom domain in Domains settings<\/td>\n<\/tr>\n<tr>\n<td>OG tags on a link<\/td>\n<td>OG configuration on the route<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>For each Branch Quick Link, create a corresponding route in Tolinku with the same path and parameters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Integrate the Tolinku SDK<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Remove the Branch SDK<\/h3>\n\n\n\n<p><strong>iOS (Swift)<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Remove the Branch SDK dependency from your Package.swift, CocoaPods Podfile, or Carthage Cartfile<\/li>\n<li>Remove <code>branch_universal_link_domains<\/code> from your Info.plist<\/li>\n<li>Remove Branch initialization from your AppDelegate\/SceneDelegate<\/li>\n<li>Remove Branch deep link handling code (BranchDeepLinkingController, branch.initSession callback)<\/li>\n<li>Remove any Branch event tracking calls<\/li>\n<\/ol>\n\n\n\n<p><strong>Android (Kotlin\/Java)<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Remove the Branch SDK dependency from your build.gradle<\/li>\n<li>Remove Branch initialization from your Application class<\/li>\n<li>Remove Branch deep link handling from your Activity (BranchDeepLinkRouter, branch.initSession)<\/li>\n<li>Remove Branch event tracking calls<\/li>\n<li>Remove Branch-related intent filters from AndroidManifest.xml<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Add the Tolinku SDK<\/h3>\n\n\n\n<p><strong>iOS<\/strong>: Add TolinkuSDK via Swift Package Manager. Configure Universal Links with your Tolinku domain in the Associated Domains entitlement:<\/p>\n\n\n\n<pre><code>applinks:go.yourapp.com\n<\/code><\/pre>\n\n\n\n<p>Handle deep links in your SceneDelegate or AppDelegate:<\/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    \/\/ Parse the URL and route to the correct screen\n    handleDeepLink(url: url)\n}\n<\/code><\/pre>\n\n\n\n<p><strong>Android<\/strong>: Add the Tolinku SDK dependency. Configure App Links in your AndroidManifest.xml:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;intent-filter android:autoVerify=&quot;true&quot;&gt;\n    &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\n    &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\n    &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\n    &lt;data\n        android:scheme=&quot;https&quot;\n        android:host=&quot;go.yourapp.com&quot; \/&gt;\n&lt;\/intent-filter&gt;\n<\/code><\/pre>\n\n\n\n<p>Handle incoming links in your Activity:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    handleIntent(intent)\n}\n\noverride fun onNewIntent(intent: Intent) {\n    super.onNewIntent(intent)\n    handleIntent(intent)\n}\n\nprivate fun handleIntent(intent: Intent) {\n    val uri = intent.data ?: return\n    \/\/ Parse the URI and route to the correct screen\n    handleDeepLink(uri)\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Mapping Branch Data Keys to Tolinku Parameters<\/h3>\n\n\n\n<p>Branch uses a custom data dictionary (<code>$canonical_identifier<\/code>, <code>$og_title<\/code>, custom keys). Tolinku uses standard URL parameters and path parameters.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Branch Approach<\/th>\n<th>Tolinku Approach<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td><code>BranchUniversalObject.canonicalIdentifier<\/code><\/td>\n<td>URL path (e.g., <code>\/product\/123<\/code>)<\/td>\n<\/tr>\n<tr>\n<td>Custom data key <code>product_id=123<\/code><\/td>\n<td>URL parameter <code>?product_id=123<\/code> or path parameter <code>\/product\/:id<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>$og_title<\/code>, <code>$og_description<\/code><\/td>\n<td>OG tags configured on the route<\/td>\n<\/tr>\n<tr>\n<td><code>$deeplink_path<\/code><\/td>\n<td>The route path itself<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p>The main difference: Branch passes data as a JSON dictionary through its SDK. Tolinku uses standard URL patterns. Your deep link handler needs to parse the URL path and query parameters instead of reading from a Branch data dictionary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Test Everything<\/h2>\n\n\n\n<p>Before cutting over production traffic, test the full flow:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deferred Deep Linking<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Uninstall your app<\/li>\n<li>Click a Tolinku deep link (on your test domain)<\/li>\n<li>Install the app from the store (or TestFlight\/Internal Testing)<\/li>\n<li>Open the app and verify you land on the correct screen with the correct data<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Universal Links \/ App Links<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open a link from Messages (iOS) or a messaging app (Android)<\/li>\n<li>Verify the app opens directly (no browser redirect)<\/li>\n<li>Verify the correct screen loads with the correct parameters<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Web Fallback<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Click a link on a device without your app installed (and decline to install)<\/li>\n<li>Verify you&#39;re redirected to the correct web fallback URL<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Link Creation<\/h3>\n\n\n\n<p>If your app creates links programmatically:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a link through the Tolinku API<\/li>\n<li>Share it and verify it works for both existing and new users<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Analytics<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Click several test links<\/li>\n<li>Verify clicks appear in your Tolinku <a href=\"https:\/\/tolinku.com\/features\/analytics\">analytics dashboard<\/a><\/li>\n<li>Verify deferred deep link matches are tracked correctly<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Cut Over Production Traffic<\/h2>\n\n\n\n<p>This is the critical step. You have two approaches:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option A: Parallel Running (Recommended)<\/h3>\n\n\n\n<p>Run both Branch and Tolinku simultaneously for a transition period:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>New links<\/strong>: All new marketing links, emails, and campaigns use Tolinku links<\/li>\n<li><strong>Existing links<\/strong>: Branch links continue to work through Branch&#39;s infrastructure<\/li>\n<li><strong>Transition period<\/strong>: 2-4 weeks, or until traffic on Branch links drops to a negligible level<\/li>\n<li><strong>Final cutover<\/strong>: Once Branch traffic is minimal, update your custom domain DNS to point to Tolinku instead of Branch<\/li>\n<\/ol>\n\n\n\n<p>This approach has zero downtime. Old links keep working through Branch while new links use Tolinku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option B: DNS Cutover<\/h3>\n\n\n\n<p>If you&#39;re using a custom domain with Branch and want to move it to Tolinku immediately:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Lower your DNS TTL to 60 seconds (do this 24 hours before the cutover)<\/li>\n<li>Recreate all active Branch link paths as Tolinku routes (same paths)<\/li>\n<li>Update the CNAME to point to Tolinku&#39;s servers<\/li>\n<li>Verify SSL provisioning completes<\/li>\n<li>Test all critical link paths<\/li>\n<li>Raise TTL back to 3600+<\/li>\n<\/ol>\n\n\n\n<p><strong>Risk<\/strong>: Any Branch link paths you missed won&#39;t work after the DNS change. The parallel approach is safer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Update External References<\/h2>\n\n\n\n<p>After the cutover, update links in places where they&#39;re hardcoded:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email templates<\/li>\n<li>Social media profiles (link in bio)<\/li>\n<li>Print materials (reprint if still in circulation)<\/li>\n<li>Partner integration documentation<\/li>\n<li>API documentation (if partners create links to your app)<\/li>\n<li>QR codes (static QR codes pointing to Branch links need new codes)<\/li>\n<\/ul>\n\n\n\n<p>Links in already-sent emails and already-printed materials will still work if you used the parallel approach and keep Branch active during the transition.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Branch-Specific Considerations<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Branch Journeys (Smart Banners)<\/h3>\n\n\n\n<p>If you use Branch Journeys for smart app banners on your website, replace them with Tolinku&#39;s <a href=\"https:\/\/tolinku.com\/features\/smart-banners\">smart banners<\/a>. Configure the banner in your Appspace settings and add the banner script to your website.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Branch NativeLink (Deferred Deep Linking)<\/h3>\n\n\n\n<p>Branch&#39;s NativeLink uses clipboard-based or pasteboard-based matching for deferred deep linking on iOS. Tolinku uses server-side fingerprint matching and token-based matching for deferred deep links. The behavior is similar from the user&#39;s perspective; the implementation is different under the hood.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Branch Events and Analytics<\/h3>\n\n\n\n<p>Branch&#39;s event tracking system (standard events and custom events) needs to be replaced with your own analytics or Tolinku&#39;s event tracking. Export your Branch analytics data before deactivating your account, as you may want historical reference.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Branch Referral System<\/h3>\n\n\n\n<p>If you use Branch&#39;s referral credits system, switch to Tolinku&#39;s <a href=\"https:\/\/tolinku.com\/features\/referrals\">referral program<\/a> feature. The core mechanics (unique referral links, attribution, reward tracking) are similar, but the APIs differ.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Timeline<\/h2>\n\n\n\n<p>A typical Branch-to-Tolinku migration takes 1-2 weeks of active work:<\/p>\n\n\n\n<p><strong>Day 1-2<\/strong>: Set up Tolinku Appspace, create routes, configure domains\n<strong>Day 3-5<\/strong>: Integrate SDK, replace Branch code, test all flows\n<strong>Day 6-7<\/strong>: QA and testing across devices and scenarios\n<strong>Day 8<\/strong>: Begin parallel running (new links use Tolinku)\n<strong>Day 8-21<\/strong>: Transition period (both platforms active)\n<strong>Day 21+<\/strong>: DNS cutover for custom domain (if using Option A), deactivate Branch<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Post-Migration<\/h2>\n\n\n\n<p>After migration is complete:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor analytics for any drop in deep link performance<\/li>\n<li>Watch for user reports of broken links<\/li>\n<li>Keep Branch active (but on a minimal plan) for 1-2 months to catch any long-tail links<\/li>\n<li>Document the new setup for your team<\/li>\n<\/ul>\n\n\n\n<p>For the detailed comparison between Branch and Tolinku, see <a href=\"https:\/\/tolinku.com\/compare\/branch\">Branch vs Tolinku<\/a>. 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>Switch from Branch to Tolinku with zero downtime. Follow this migration guide covering link redirects, SDK swaps, and analytics continuity.<\/p>\n","protected":false},"author":2,"featured_media":844,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"How to Migrate from Branch to Tolinku: Step by Step","rank_math_description":"Switch from Branch to Tolinku with zero downtime. Follow this migration guide covering link redirects, SDK swaps, and analytics continuity.","rank_math_focus_keyword":"migrate from Branch","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-branch.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-branch.png","footnotes":""},"categories":[17],"tags":[25,28,53,20,24,52,30],"class_list":["post-845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comparisons","tag-android","tag-attribution","tag-branch","tag-deep-linking","tag-ios","tag-migration","tag-sdks"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/845","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=845"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/845\/revisions"}],"predecessor-version":[{"id":2508,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/845\/revisions\/2508"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/844"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}