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.
<key>NSUserTrackingUsageDescription</key>
<string>Your data is used to measure which ads brought you here,
so we can show you fewer irrelevant ones.</string>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
}| Status | Meaning | IDFA returns | Can you prompt? |
|---|---|---|---|
.notDetermined | Never asked, or asked and dismissed | All zeros | Yes |
.restricted | Disallowed by MDM, Screen Time or child account | All zeros | No |
.denied | User declined, or disabled it in Settings | All zeros | No |
.authorized | User allowed | The real IDFA | N/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.
| Timing | Effect on opt-in | Effect on coverage |
|---|---|---|
| First launch, cold | Lowest — no context established | Highest — asks everyone |
| After onboarding, with a pre-prompt | Highest — context and framing | Lower — onboarding drop-off never sees it |
| On first use of a personalised feature | High, but only for engaged users | Lowest |
| Never asked | Zero | Zero — 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".
| Activity | Requires ATT |
|---|---|
| Reading the IDFA | Yes |
| SKAdNetwork or AdAttributionKit | No — designed to work without it |
| First-party analytics inside your own app | No |
| Your own deferred deep link match | No, if first-party only |
| Sharing user data with a data broker | Yes |
Requests to a domain listed in NSPrivacyTrackingDomains | Yes — enforced at runtime |
| Device fingerprinting for attribution | Prohibited 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
- IDFA — The 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.
- SKAdNetwork — SKAdNetwork 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 Manifest — A 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 installs — An 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.