Skip to main content
Documentation
SDKsiOS

iOS Install Attribution

Understand how the WarpLink iOS SDK attributes installs, including match types, confidence scores, and privacy considerations.

WarpLink uses two tiers of attribution matching to connect app installs to the links that drove them.

Match Cascade

When the app opens, the SDK collects device signals and sends them to the WarpLink API. The server compares them against stored click signals.

TierMethodSignalConfidence
1Repeat checkIDFVThe stored install's own score
2ProbabilisticEnriched probabilistic matchUp to 0.85

The App Store passes nothing through an install, so a first install on iOS uses the scored match path and returns matchGuaranteed: false.

Repeat Checks (IDFV)

Used when the same install asks again, for example after the cached answer was lost or after an update from an older SDK. The IDFV returns the install the device already has, with that install's own match type and confidence, so it never turns a probabilistic match into a guaranteed one. A reinstall is deliberately not answered from this tier. The SDK reports it as a reinstall, and the server records it as a new install through the probabilistic tier, so it is counted when that tier matches a click.

  • Signal: UIDevice.current.identifierForVendor (IDFV)
  • Match type and confidence: those of the install it returns
  • Does not require ATT permission

IDFV is a UUID shared by every app from the same vendor on one device. Apple resets it when the last app from that vendor is deleted, so for a single-app vendor a reinstall gets a new IDFV. When another app from your vendor stays installed, the IDFV survives the delete, which is why the server never uses it to answer a reinstall the SDK reports as one.

Probabilistic Matching (Enriched Match Key)

Used for first-install attribution, and for a reinstall, which the IDFV tier deliberately leaves to this one. A match here records a new install either way, so a reinstall is counted like a first install.

  • Signals: IP address (derived server-side) + normalized primary language + timezone
  • Match type: .probabilistic
  • Confidence: varies by match key variant and elapsed time

Match Key Variants

VariantTimezone componentSent by
enriched_tzIANA zone name, for example America/TorontoSDKs that collect a zone name
enrichedMinute offsetOlder SDKs, and devices that cannot resolve a zone
basicNoneFallback when neither matches

The zone name carries far more entropy than the offset (roughly 340 zones against 38 offsets) and does not shift at a daylight-saving boundary. It therefore earns a higher confidence ceiling.

Confidence by Elapsed Time

Time Since Clickenriched_tzenrichedbasic
< 1 hour0.850.800.70
< 3 hours0.650.600.50
< 6 hours0.500.450.35
< 24 hours0.300.250.20

Past 24 hours there is no match at all. The 24 hour band only applies to links whose match window is set past the 6 hour default.

Two further signals adjust the score:

  • Bucket ambiguity. More than one claimable click shared the match key: x0.6
  • IP sharing. Carrier-grade NAT or a private address: x0.6. A household IPv4 address: x0.9. IPv6: x1.0

Reinstalls

A reinstall counts as an install. If the user deletes and reinstalls your app, the SDK runs attribution again and the result lands in your install numbers like any other install.

The attribution request carries is_reinstall: true in that case. The SDK reads it from a Keychain marker that outlives an app delete, while the marker that stops a duplicate check inside one install lives in a backup-excluded file and does not. The flag labels the install and never blocks the request. See App Reinstall.

Interpreting Results

The WarpLinkDeepLink includes matchType, matchConfidence, and matchGuaranteed:

ConfidenceRecommended Action
1.0 (deterministic)Route directly to content
> 0.5 (probabilistic)Route to content: high confidence
0.3–0.5Show content with confirmation
< 0.3Show generic onboarding

These bands are recommended defaults. Adjust them to fit how sensitive your content is.

Using matchGuaranteed

matchGuaranteed is true only for a deterministic match: a tapped link the SDK resolved directly, or a Play Install Referrer match on Android. Use it, like matchConfidence, to pick the destination the attribution result routes to. Use a probabilistic match to pick a destination with a safe fallback. Keep sign-in on your own authentication.

App Tracking Transparency

The WarpLink SDK:

  • Does not use IDFA (Advertising Identifier)
  • Does not prompt for ATT permission
  • Uses only IDFV, which is exempt from ATT
  • Does not interfere with your app's own ATT strategy

Privacy

Signals Collected

SignalPurposeSource
Preferred languageMatch key component (server normalizes to the primary subtag)Locale.preferredLanguages.first
Timezone nameMatch key component, sent as timezone by SDKs that collect a zone nameTimeZone.current.identifier
Timezone offsetMatch key component, the fallback for older SDKsTimeZone.current.secondsFromGMT()
IDFVRecognizing the same install asking againUIDevice.current.identifierForVendor

The IP address is the third match key component. The SDK never sends it: the server derives it from the request. User-Agent and screen dimensions are not collected.

Not Collected

  • IDFA (Advertising Identifier)
  • Location data
  • Contacts or personal data
  • App usage data
  • Cross-app identifiers

All signals are sent over HTTPS and used solely for attribution matching. No cross-app tracking is performed.

The probabilistic match restores the link a user tapped on the first open after install, for your own app's deferred deep links and install attribution. It does not track users across other companies' apps or websites, and it uses no advertising ID. The server keys the pending deep link by a hashed match key (HMAC-SHA256 of the IP address, primary language, and time zone). Each tap can be matched only within the app's match window, and pending entries expire automatically. A matched install keeps the hashed key for your plan's data retention period. The raw IP address is not stored. The time zone is used by the enriched variant only; the basic variant uses the IP address and primary language.

Privacy Manifest

The SDK ships PrivacyInfo.xcprivacy, declaring IDFV collection (App Functionality purpose, not linked to identity, not used for tracking) and its UserDefaults/system-boot-time API usage. Xcode aggregates it into your app's privacy report automatically. Reflect device ID collection in your own App Store Connect privacy questionnaire.