Deeplinkly

Glossary/iOS platform and privacy

App Tracking Transparency (ATT)

Definition

App Tracking Transparency is the iOS framework that requires an app to obtain explicit user permission before accessing the device's advertising identifier or otherwise tracking that user across apps and websites owned by other companies.

Introduced with iOS 14.5, ATT is the change that broke identifier-based mobile attribution and created everything that replaced it. The framework itself is small — one Info.plist key, one request call, four possible statuses — but the rules around when the prompt may be shown, what counts as tracking, and what happens on reinstall are where implementations go wrong.

The implementation, in full

Without the Info.plist key the prompt never appears and the request returns denied, which is the most common cause of an ATT implementation that appears to work in code review and yields zero authorisations in production.

Info.plist — required
<key>NSUserTrackingUsageDescription</key>
<string>Your data is used to measure which ads brought you here,
so we can show you fewer irrelevant ones.</string>
Requesting authorisation
import AppTrackingTransparency
import AdSupport

// Must be called while the app is active. Calling it from
// didFinishLaunching, or behind a launch screen, silently fails:
// the system declines to present and you get .denied.
func requestTracking() async -> Bool {
    let status = await ATTrackingManager.requestTrackingAuthorization()
    return status == .authorized
}

// The current status, without prompting.
switch ATTrackingManager.trackingAuthorizationStatus {
case .notDetermined: break   // prompt has not been answered
case .restricted:    break   // blocked by policy; do not prompt
case .denied:        break   // user said no; you cannot re-prompt
case .authorized:
    let idfa = ASIdentifierManager.shared().advertisingIdentifier
    // ...
@unknown default: break
}
The four authorisation statuses.
StatusMeaningIDFA returnsCan you prompt?
.notDeterminedNever asked, or asked and dismissedAll zerosYes
.restrictedDisallowed by MDM, Screen Time or child accountAll zerosNo
.deniedUser declined, or disabled it in SettingsAll zerosNo
.authorizedUser allowedThe real IDFAN/A

One prompt per install, effectively

Once the status is .denied, requestTrackingAuthorization returns immediately without presenting anything, forever. There is no re-prompt API. The user can reverse it in Settings, and it resets if they delete and reinstall the app — which is also why a reinstalled app that used to have consent now does not.

Timing the prompt

Because you get one attempt, when you ask matters more than how you ask. Apple's rules constrain the options: you may show your own explanatory screen first, but it must not resemble the system prompt, must not offer an incentive, and must not present a choice that pre-empts the system dialog.

Prompt timing strategies and their trade-offs.
TimingEffect on opt-inEffect on coverage
First launch, coldLowest — no context establishedHighest — asks everyone
After onboarding, with a pre-promptHighest — context and framingLower — onboarding drop-off never sees it
On first use of a personalised featureHigh, but only for engaged usersLowest
Never askedZeroZero — and no prompt to explain

Reported industry opt-in rates have varied widely and have generally risen since 2021, with commonly cited figures clustering somewhere between a quarter and a half of prompted users depending on category, geography and framing. Treat any single published number with suspicion, measure your own rate by prompt placement, and note that even a good rate leaves the majority of your install base unmeasurable at device level.

A pre-prompt is not a consent gate

You may explain before asking. You may not make app functionality contingent on the answer, offer anything in exchange, or design a screen whose buttons imply the decision is being taken there. Apps have been rejected for pre-prompts that mimic the system dialog's layout.

What ATT does and does not cover

Tracking, in Apple's definition, means linking your app's data with data collected by other companies for advertising or measurement, or sharing it with a data broker. That definition is narrower than "analytics" and wider than "the IDFA".

Does it require ATT permission?
ActivityRequires ATT
Reading the IDFAYes
SKAdNetwork or AdAttributionKitNo — designed to work without it
First-party analytics inside your own appNo
Your own deferred deep link matchNo, if first-party only
Sharing user data with a data brokerYes
Requests to a domain listed in NSPrivacyTrackingDomainsYes — enforced at runtime
Device fingerprinting for attributionProhibited regardless of consent

The last two rows are where ATT connects to the privacy manifest: domains you declare as tracking domains are blocked by the OS without ATT permission, so an over-broad declaration turns a consent decision into an outage. And fingerprinting is not a consent question at all — Apple's rules disallow it whether or not the user opted in.

iOS SDK documentation

Our iOS SDK documentation covers what attribution still works when ATT is denied — which is most of it — and how the SDK behaves in each of the four authorisation statuses without reading the IDFA unless you have permission.

Open the ios sdk documentation

Frequently asked questions

What is App Tracking Transparency?
App Tracking Transparency is the iOS framework, introduced in iOS 14.5, that requires an app to request explicit user permission before tracking that user across apps and websites owned by other companies. Permission is also what gates access to the device's advertising identifier, so without it the IDFA returns as a string of zeros.
What happens if a user denies the ATT prompt?
The advertising identifier returns as all zeros, requests to any domain the app declares as a tracking domain are blocked by the operating system, and you cannot present the prompt again — the request call returns immediately without showing anything. The user can change the decision in Settings, and it resets if the app is deleted and reinstalled.
Do I need ATT permission for attribution to work?
Not for the frameworks Apple provides. SKAdNetwork and AdAttributionKit are explicitly designed to attribute installs without a cross-app identifier and without a prompt, and first-party deferred deep link matching within your own infrastructure does not require one either. ATT only gates device-level identifiers and genuine cross-company data joins.
When should I show the ATT prompt?
After the user has enough context to understand the request but before they drop off, which for most apps means immediately after onboarding rather than on a cold first launch. You may show an explanatory screen first, but it must not resemble the system dialog, offer an incentive, or gate app functionality on the answer, all of which are grounds for rejection.
What is the average ATT opt-in rate?
Published figures vary widely by category, region and prompt placement, and have generally trended upward since 2021, so any single industry average is a weak guide. Measure your own rate as a function of where you place the prompt, and plan attribution on the assumption that a large share of your install base will never be identifiable at device level.

Related terms

  • IDFAThe IDFA, or Identifier for Advertisers, is a resettable per-device UUID that iOS provides to apps for advertising measurement, and which is only readable when the user has granted App Tracking Transparency permission.
  • SKAdNetworkSKAdNetwork is Apple's StoreKit framework that attributes app installs to advertising campaigns without exposing a device identifier, by having the operating system send a delayed, aggregated postback to the ad network that won the install.
  • Privacy ManifestA privacy manifest is a PrivacyInfo.xcprivacy property list inside an app or SDK that declares the data it collects, the domains it uses for tracking, and its reasons for calling APIs Apple designates as requiring one.
  • Unattributed installsAn install is unattributed when no signal linking it to a prior ad click or link tap survived the journey through the app store, which can mean the install was organic or that the signal existed and was lost.