Attribr SDK Docs

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.

text
https://github.com/mrvltechnologies/attribr-ios

Or if you use project.yml with XcodeGen:

yaml
packages:
  Attribr:
    path: /path/to/Attribr-by-MRVL/sdk/swift

targets:
  YourApp:
    dependencies:
      - package: Attribr
        product: Attribr
2

Initialise in App.swift

swift
import SwiftUI
import Attribr

@main
struct YourApp: App {
    init() {
        Attribr.initialize(apiKey: "attr_live_yourkey…")
        Attribr.setConsent(.granted)
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
                .onChange(of: scenePhase) { _, phase in
                    if phase == .active {
                        Attribr.trackLaunch()
                    }
                }
        }
    }

    @Environment(\.scenePhase) private var scenePhase
}
3

That's it

Build and run. Installs and retention pings start flowing immediately. Check your dashboard within a few seconds of the first launch.

No NSUserTrackingUsageDescription required
No PrivacyInfo.xcprivacy manual edits - SDK ships its own
Works in TestFlight sandbox builds
Works on simulators

Android Integration (Kotlin)

The Kotlin SDK mirrors the Swift API exactly. Same 3-line pattern, same zero-dependency philosophy.

1

Include the local SDK build

In settings.gradle.kts:

kotlin
includeBuild("/path/to/Attribr-by-MRVL/sdk/kotlin")
2

Add the dependency

In app/build.gradle.kts:

kotlin
dependencies {
    implementation("com.mrvltechnologies:attribr:1.0.0")
}
3

Initialise in Application.onCreate()

kotlin
import com.mrvltechnologies.attribr.Attribr
import com.mrvltechnologies.attribr.ConsentState

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Attribr.initialize(this, apiKey = "attr_live_yourkey…")
        Attribr.setConsent(ConsentState.GRANTED)
    }
}
4

Track launches

In your base Activity or using ProcessLifecycleOwner:

kotlin
// Option A — Base Activity
override fun onResume() {
    super.onResume()
    Attribr.trackLaunch()
}

// Option B — ProcessLifecycleOwner (recommended for multi-activity apps)
ProcessLifecycleOwner.get().lifecycle.addObserver(
    LifecycleEventObserver { _, event ->
        if (event == Lifecycle.Event.ON_START) Attribr.trackLaunch()
    }
)

API Key Format

text
attr_live_<appcode><32-char-hex>

Example: attr_live_hawk00xd1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6
Auth headerX-Attribr-Key: attr_live_… (NOT Authorization: Bearer)
Key lengthExactly 50 characters
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.

Ready to integrate?

Sign up free - no credit card needed. Free up to 10,000 installs/month forever.

Get started free