Attribr is a 3-line install attribution SDK for iOS and Android. It tracks where your installs come from, measures day-1/7/30 retention, and supports referral attribution - all with zero permissions and zero App Store rejection risk.
Zero permissionsWorks in TestFlight< 50 KBNo IDFANo ATT promptiOS + Android
iOS Integration (Swift)
Add the Swift package, paste 3 lines, ship. No AppDelegate hooks, no URL schemes, no AASA file.
1
Add the Swift package
In Xcode: File → Add Package Dependencies, paste the URL below.
Prefix storedOnly the first 18 characters are stored in the dashboard
Full keyShown once at creation - copy it immediately
Generate keys in your dashboard at Settings → API Keys. Create one key per app so you can revoke individual apps without affecting others.
Deep Linking
Attribr supports Universal Links (iOS), App Links (Android), and deferred deep links. Route users to the right screen in your app, even if they need to install it first. Available on Growth plans and above.
1
iOS - Universal Links (Swift)
Add the Associated Domains entitlement and handle incoming links:
swift
// 1. Add Associated Domains entitlement in Xcode:
// applinks:yourapp.attribr.dev
// 2. Handle deep links in your App.swift:
import Attribr
@main
struct YourApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
Attribr.handleDeepLink(url)
}
}
}
}
// 3. Register a deep link handler:
Attribr.onDeepLink { destination, params in
// destination: the screen path (e.g. "product/123")
// params: query parameters as [String: String]
NavigationManager.shared.navigate(to: destination, params: params)
}
// 4. Handle deferred deep links (user installs first, then routes):
Attribr.checkDeferredDeepLink { destination, params in
guard let destination else { return }
NavigationManager.shared.navigate(to: destination, params: params)
}
2
Android - App Links (Kotlin)
Add intent filters and handle incoming links:
kotlin
// 1. Add intent filter in AndroidManifest.xml:
// <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="yourapp.attribr.dev" />
// </intent-filter>
// 2. Handle deep links in your Activity:
import com.mrvltechnologies.attribr.Attribr
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Attribr.handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
Attribr.handleDeepLink(intent)
}
// 3. Register a deep link handler:
Attribr.onDeepLink { destination, params ->
// Navigate to the destination screen
navController.navigate(destination)
}
// 4. Check for deferred deep links on first launch:
Attribr.checkDeferredDeepLink { destination, params ->
destination?.let { navController.navigate(it) }
}
Ad Network Integrations
Connect your ad accounts to Attribr and receive server-to-server postbacks when an install is attributed to a paid campaign. Available on Pro plans and above.
1
Supported networks
Facebook / Meta Ads
Google Ads (UAC)
TikTok Ads
Snapchat Ads
Apple Search Ads
2
Connect an ad network
Go to Ad Networks in your dashboard, select a network, and paste your account credentials. Attribr will begin receiving postbacks automatically.
text
Dashboard → Ad Networks → Add Network → Select provider
→ Paste API token / App ID → Save
Attribr sends server-to-server postbacks for:
• install (attributed to a campaign)
• retention.day1 / day7 / day30
• custom events (if configured)
3
Apple Search Ads (iOS only)
For Apple Search Ads attribution, add this call after initialisation:
swift
// After Attribr.initialize() in App.init():
Attribr.enableAppleSearchAdsAttribution()
// This uses Apple's AdServices framework (no ATT required)
// to attribute installs to Search Ads campaigns.
// Results appear in your Sources and Ad Networks tabs.
SKAdNetwork (SKAN 4.0)
SKAdNetwork is Apple's privacy-preserving attribution framework. Attribr handles SKAN registration, conversion value updates, and postback decoding automatically. Available on Pro plans and above.
1
Register for SKAN attribution (iOS)
swift
import Attribr
import StoreKit
// In your App.init(), after Attribr.initialize():
Attribr.registerSKAN()
// This calls SKAdNetwork.registerAppForAdNetworkAttribution()
// and sets up conversion value management.
2
Update conversion values
Report user engagement milestones. Attribr maps these to SKAN 4.0 fine + coarse conversion values automatically.
swift
// Report a conversion event (e.g. after a purchase):
Attribr.updateConversionValue(.purchase, revenue: 4.99)
// Report engagement milestones:
Attribr.updateConversionValue(.registration)
Attribr.updateConversionValue(.tutorialComplete)
// SKAN 4.0 coarse values (low / medium / high) are mapped
// automatically based on your conversion value schema,
// which you configure in the dashboard under SKAN settings.
3
Configure in the dashboard
Go to SKAN in your dashboard to configure conversion value mappings, view decoded postbacks, and monitor SKAN attribution alongside your other data sources. No Info.plist changes required - the SDK handles SKAdNetworkItems registration.
TestFlight Attribution
Attribr is the only attribution SDK that works in TestFlight builds. AppsFlyer, Branch, and Adjust all require App Store distribution to attribute installs. Attribr doesn't - it uses device fingerprinting at the API level, which works identically in TestFlight and production.
How to use it: give each beta channel a different referral code before distributing your TestFlight link. For example:
swift
// Deep link or your own attribution URL passes a code to your app
// Your app then calls:
Attribr.setReferralCode("discord-beta-v1")
The Sources tab in your dashboard will break down which beta channel drove the most engaged testers - before you've even launched on the App Store.
Referral Codes
Referral attribution links a new install to the person or channel that drove it. Use it to run influencer campaigns, reward promoters, or measure which communities convert best.
swift
// When the app opens with a referral code in the URL:
Attribr.setReferralCode("influencer-username")
// Attribr stores this against the install.
// You'll see it in the Promoters and Sources tabs.
Creator Attribution
Track installs, D30 retention, and revenue per creator or influencer. Each creator gets a unique deep link — when their audience installs your app through that link, the install is automatically attributed to the creator. No SDK changes needed.
1
Create a creator campaign
Go to Creators in your dashboard and click "Add Creator". Attribr generates a unique link for each creator.
text
Dashboard → Creators → Add Creator → Fill name + platform
→ Link generated: https://attribr.dev/l/cr_a3b7x9
Share this link with the creator. Every install from
this link is attributed to them automatically.
2
iOS - Share the creator's link
Share the generated link with the creator. They can post it on their platform, add it to their bio, or use it in sponsored content.
swift
// Share the creator's unique link
let creatorLink = "https://attribr.dev/l/cr_a3b7x9"
// Option A — UIActivityViewController
let vc = UIActivityViewController(
activityItems: [URL(string: creatorLink)!],
applicationActivities: nil
)
present(vc, animated: true)
// Option B — In-app sharing (copy to clipboard)
UIPasteboard.general.string = creatorLink
3
Android - Share the creator's link
kotlin
// Share the creator's unique link
val creatorLink = "https://attribr.dev/l/cr_a3b7x9"
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, creatorLink)
type = "text/plain"
}
startActivity(Intent.createChooser(sendIntent, "Share link"))
4
Via the API (Growth+ plan)
Create and list creators programmatically:
bash
# Create a creator campaign
curl -X POST https://your-dashboard.vercel.app/api/v1/creators \
-H "X-Attribr-Key: attr_live_yourkey..." \
-H "Content-Type: application/json" \
-d '{"app_id": "com.yourapp", "name": "Sarah Tech Reviews", "platform": "youtube", "handle": "sarahtechreviews"}'
# Response includes the generated link:
# { "creator": { "link_url": "https://attribr.dev/l/cr_a3b7x9", ... } }
# List all creators with stats
curl https://your-dashboard.vercel.app/api/v1/creators?app_id=com.yourapp \
-H "X-Attribr-Key: attr_live_yourkey..."
The Creators dashboard shows clicks, installs, D30 retention, and revenue per creator — all updated in real time.
Consent
Attribr uses no IDFA, no device fingerprinting that requires permission, and no user-identifiable data. The consent flag is a future-proofing mechanism - currently safe to set to .granted for all apps that don't use ATT.
swift
// Safe for all apps that don't request ATT permission:
Attribr.setConsent(.granted)
// If your app asks for ATT:
ATTrackingManager.requestTrackingAuthorization { status in
Attribr.setConsent(status == .authorized ? .granted : .revoked)
}
kotlin
// Android equivalent:
Attribr.setConsent(ConsentState.GRANTED) // or REVOKED
Ready to integrate?
Sign up free - no credit card needed. Free up to 10,000 installs/month forever.