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.
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.
For the general migration guide covering multiple providers, see Migrating to Tolinku from Branch, Firebase, and AppsFlyer.
Understanding What You're Migrating
AppsFlyer OneLink bundles several features:
- Deep linking: Route users to specific in-app content
- Deferred deep linking: Preserve link context through install
- Smart banners: Web-to-app banners
- Link management: Create and manage marketing links
- Attribution: Track which campaigns drove installs and events
- Audience segmentation: Target users based on behavior and attribution
You'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's first-party analytics.
Step 1: Audit Your OneLink Configuration
Link Templates
AppsFlyer OneLink uses templates that define routing behavior. Export your template configurations:
- Template name and ID: Each template has a unique ID
- Deep link path: The URL scheme or Universal Link path
- Subdomain: Your branded link subdomain (e.g.,
yourapp.onelink.meor custom domain) - Platform behavior: What happens on iOS, Android, and web
- Deep link parameters: Custom parameters passed through the link
Link Inventory
List all active OneLink URLs:
- Marketing campaign links (generated in the AppsFlyer dashboard)
- Custom links (created via the API)
- In-app share links (created via the SDK)
Parameter Mapping
AppsFlyer OneLink supports several parameter types:
- Deep link value (
deep_link_value): The primary routing parameter - Deep link sub-parameters (
deep_link_sub1throughdeep_link_sub10): Additional custom parameters - Attribution parameters:
pid(media source),c(campaign),af_channel, etc.
Document which parameters your app reads and how it uses them.
Step 2: Set Up Tolinku
Create Your Appspace
- Create an Appspace at tolinku.com
- Configure iOS settings (Bundle ID, Team ID)
- Configure Android settings (Package Name, SHA-256 fingerprint)
- Set your default web fallback URL
Domain Configuration
If you used yourapp.onelink.me: This domain belongs to AppsFlyer. You'll need a new branded domain (e.g., go.yourapp.com). See the Domains setup guide.
If you used a custom domain: You can transfer it to Tolinku by updating DNS after setting up your routes.
Map OneLink Templates to Routes
| OneLink Template | Tolinku Route |
|---|---|
Template with deep_link_value=product_123 |
Route path: /product/:id |
Template with deep_link_value=invite + deep_link_sub1=CODE |
Route path: /invite/:code |
| Template for web fallback to custom page | Route with custom web fallback URL |
The key difference: OneLink uses a flat parameter structure (deep_link_value, deep_link_sub1). Tolinku uses standard URL paths and query parameters (/product/123?ref=abc). This is simpler but requires remapping your routing logic.
Step 3: Replace the SDK
Separating Deep Linking from Attribution
If you want to keep AppsFlyer for attribution but use Tolinku for deep linking, you can run both SDKs:
- Tolinku SDK: Handles deep link routing (Universal Links, App Links, deferred deep linking)
- AppsFlyer SDK: Handles install attribution and post-install event tracking
This is a valid intermediate step. You can remove the AppsFlyer SDK later when you're ready.
If Replacing Both
Remove the AppsFlyer SDK entirely:
iOS:
- Remove
AppsFlyerLibdependency - Remove
AppsFlyerLib.shared().start()from AppDelegate - Remove OneLink resolution callbacks (
AppsFlyerLibDelegate.onAppOpenAttribution) - Remove
AppsFlyerLib.shared().continue(userActivity)from link handling - Remove event tracking calls (
AppsFlyerLib.shared().logEvent())
Android:
- Remove
com.appsflyer:af-android-sdkfrom build.gradle - Remove
AppsFlyerLib.getInstance().start()from Application class - Remove
AppsFlyerLib.getInstance().subscribeForDeepLink()callbacks - Remove event tracking calls
Add Tolinku SDK
Configure Universal Links (iOS) and App Links (Android) for your Tolinku domain. Handle incoming links by parsing the URL path and parameters:
iOS:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL else { return }
handleDeepLink(url: url)
}
func handleDeepLink(url: URL) {
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let path = url.path
if path.hasPrefix("/product/") {
let productId = String(path.dropFirst("/product/".count))
navigateToProduct(id: productId)
}
// Handle other routes...
}
Android:
private fun handleDeepLink(uri: Uri) {
val path = uri.path ?: return
when {
path.startsWith("/product/") -> {
val productId = uri.lastPathSegment
navigateToProduct(productId)
}
// Handle other routes...
}
}
Parameter Migration
Map AppsFlyer's parameter structure to Tolinku's URL structure:
| AppsFlyer Parameter | Tolinku Equivalent |
|---|---|
deep_link_value |
URL path segment |
deep_link_sub1 through sub10 |
URL query parameters |
pid (media source) |
utm_source parameter |
c (campaign) |
utm_campaign parameter |
af_channel |
utm_medium parameter |
Example mapping:
# AppsFlyer OneLink
https://yourapp.onelink.me/abc?deep_link_value=product&deep_link_sub1=123&pid=email&c=summer_sale
# Tolinku equivalent
https://go.yourapp.com/product/123?utm_source=email&utm_campaign=summer_sale
Step 4: Handle Smart Banners
If you use AppsFlyer's smart banners (the web-to-app prompts on your mobile website), replace them with Tolinku's smart banners:
- Remove the AppsFlyer smart banner script from your website
- Add the Tolinku banner script
- Configure banner settings in your Appspace
Step 5: Test and Cut Over
Testing
Test every deep link flow:
- Existing user taps a link → app opens to correct screen
- New user taps a link → installs from store → app opens to correct screen (deferred deep linking)
- User without app on web → redirected to correct fallback URL
- OG previews render correctly on social platforms
Cut Over Strategy
Recommended: Parallel running
- New campaigns use Tolinku links (new branded domain or new paths)
- Existing AppsFlyer OneLink URLs continue to work through AppsFlyer
- Gradually shift all link creation to Tolinku
- After 2-4 weeks, evaluate if any significant traffic still hits OneLink URLs
- If using a custom domain, update DNS to point to Tolinku
If using AppsFlyer's domain (onelink.me): You can'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.
AppsFlyer-Specific Considerations
Attribution Data Continuity
If you keep AppsFlyer for attribution, your historical attribution data stays intact. If you're leaving AppsFlyer entirely:
- Export your attribution data before deactivating
- Set up equivalent attribution tracking in Tolinku's analytics
- Expect a gap in attribution data during the transition
Cost Implications
AppsFlyer'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't need third-party attribution).
Tolinku pricing starts at $39/month per Appspace with 50,000 clicks included. Compare this to AppsFlyer's enterprise pricing to understand your savings.
Referral and Invite Links
If your app uses AppsFlyer's invite/referral system, replace it with Tolinku's referral program feature. The mechanics are similar (unique referral links, attribution, reward tracking) but the implementation differs.
Timeline
Day 1-2: Audit OneLink configuration, set up Tolinku, create routes Day 3-4: Integrate SDK, replace deep link handling code Day 5-6: Testing across all platforms and scenarios Day 7: Begin parallel running with new campaigns on Tolinku Day 7-28: Transition period Day 28+: DNS cutover for custom domains (if applicable)
For the general migration guide, see Migrating to Tolinku from Branch, Firebase, and AppsFlyer.
Get deep linking tips in your inbox
One email per week. No spam.