iOS attribution with ATT and SKAN
On iOS, Apple decides what you can know about an install, and it tells you in its own time.
In short: App Tracking Transparency (ATT) means an app needs the person's permission before it can read the IDFA. Without it, iOS attribution relies on Apple's SKAdNetwork (SKAN) and its successor AdAttributionKit, which send delayed, aggregated postbacks with privacy limits instead of user-level data.
What are ATT and the IDFA?
App Tracking Transparency is Apple's framework that requires apps to ask permission before tracking a person across other companies' apps and websites, and the IDFA is the device advertising identifier that permission unlocks. On iOS and iPadOS 14.5 and later, an app must request authorisation before it can read the IDFA.
If the request is not made, is denied or is restricted, the IDFA comes back as all zeros. The same happens in the Simulator. With no IDFA, an MMP cannot use it to join an ad click to an install.
When the prompt does not appear
Apple's documentation lists cases where the ATT prompt is skipped and the result returns at once:
- tracking is restricted on the device;
- the person has turned off "Allow Apps to Request to Track";
- a request is already pending;
- it is called from an app extension;
- the app is not active.
ATT opt-in rates are not given here, because no primary source publishes them.
What is SKAdNetwork?
SKAdNetwork (SKAN) is Apple's privacy-preserving attribution framework, in which the device itself records ad interactions and installs and then sends a delayed, aggregated postback to the ad network. Apps do not need ATT permission to use SKAN.
The flow, in short: an ad network signs its ad, the device records the interaction, the person installs and opens the app, the app updates a conversion value as the person does things, and after the windows close Apple sends postbacks. Apple's SKAdNetwork page now points developers to AdAttributionKit for app ad campaigns, but SKAN 4 rules still describe how much of the ecosystem works.
SKAN 4 postbacks and conversion windows
SKAN 4 can send up to three postbacks for one winning install, one for each conversion window. This needs iOS 16.1 or later and ads signed with SKAN 4.
| Window | Days after first launch | Postback delay after window ends | Value allowed |
|---|---|---|---|
| 1 | Day 0 to day 2 | 24 to 48 hours, random | Fine or coarse, depending on tier |
| 2 | Day 3 to day 7 | 24 to 144 hours, random | Coarse only |
| 3 | Day 8 to day 35 | 24 to 144 hours, random | Coarse only |
Other rules worth knowing:
- An app can lock a window early with
lockWindow, which ends updates for that window and starts the delay sooner. - With SKAN 3 and earlier, each higher value reset a rolling 24-hour timer, then a further random delay followed.
- Apple says the minimum time from impression to postback is 24 to 48 hours, and a testing profile cuts this to 5 to 10 minutes.
- Install windows: 30 days after a StoreKit-rendered ad or attributable web ad, 24 hours after a view-through ad, and the app must be launched within 60 days of install.
- Besides the winning postback, up to five non-winning postbacks can be sent. They carry no conversion value and only the first postback is sent for them.
Conversion values, fine and coarse
A conversion value is a number the app sets to describe what the person did after installing, which Apple passes back in the postback if privacy thresholds allow.
- Fine value: a 6-bit integer from 0 to 63. Values outside that range are rejected.
- Coarse value:
low,mediumorhigh. The app or network decides what each means. - Fine values are only used in the first window. The second and third postbacks carry coarse values only.
- The older update method without coarse values works only in the first window and does not support multiple postbacks.
A worked example
A language learning app maps its fine values in window 1: 0 for an install with no activity, 10 for finishing the first lesson, 20 for starting a trial and 40 and above for buying a subscription, banded by price. For windows 2 and 3 it uses coarse values: low for any lesson, medium for a streak of three days, high for a renewal.
A person installs, finishes a lesson on day 0 and buys on day 1. The app sets the fine value to 40 and locks window 1. About one to two days later, the network receives the first postback with value 40, if the crowd anonymity tier allows a fine value.
Crowd anonymity tiers
Apple assigns each install a tier based on how many similar installs there are, considering the publisher app or domain, the advertised app, the country and the source identifier. Smaller crowds get less detail.
| Tier | First postback contains | Second and third postbacks |
|---|---|---|
| 3 | 2 to 4 digit source ID, fine value, source app or domain, optional country code | 2-digit source ID and coarse value |
| 2 | 2 to 4 digit source ID and fine value | 2-digit source ID and coarse value |
| 1 | 2-digit source ID and coarse value | 2-digit source ID and coarse value |
| 0 | 2-digit source ID only | None |
This is why a postback can arrive with no conversion value at all. Other reasons include the app never setting a value, the postback being a non-winner, and an out-of-range fine value. Consolidating campaigns to raise volume per source is general practice for reaching higher tiers.
AdAttributionKit
AdAttributionKit (AAK) is Apple's newer attribution framework that builds on SKAN, adds re-engagement and works with alternative app marketplaces as well as the App Store. It is available from iOS 17.4 for installs, with re-engagement added in iOS 18.
- AAK uses the same three conversion windows and the same random delays as SKAN 4.
- SKAN and AAK impressions are ranked together and only one wins. Clicks beat views, then the most recent wins, and up to six impressions are considered.
- Postbacks state a
conversion-typeofdownload,redownloadorreengagement. - Attribution windows can be configured in Info.plist: 1 day view and 30 days click by default, configurable from 1 to 7 days for views and 1 to 30 days for clicks.
- Country code is a bonus on top of the four tiers, present only with enough volume.
- Like SKAN, AAK does not need ATT permission.
See attribution windows for how these defaults compare with other platforms, and self-attributing networks for how Meta reports iOS campaigns through its own Aggregated Event Measurement.
Questions on this chapter
Do I need ATT permission to use SKAdNetwork?
No. Apple says apps do not need ATT permission to call SKAdNetwork or AdAttributionKit. ATT only governs access to the IDFA and cross-app tracking.
Why are my SKAN postbacks delayed?
Apple adds a random delay of 24 to 48 hours after the first window ends and 24 to 144 hours after the second and third. A testing profile shortens the delay to 5 to 10 minutes during development.
Why is my SKAN conversion value null?
Usually because the install fell into a low crowd anonymity tier, the app never set a value, or the postback was a non-winning one. Tier 0 gives no value, and Tier 1 gives only a coarse value.
How many conversion values does SKAN 4 allow?
The fine value ranges from 0 to 63, which gives 64 options in the first window. Coarse values give three options, low, medium and high, in every window.
Is AdAttributionKit replacing SKAdNetwork?
Apple's SKAdNetwork page now tells developers to use AdAttributionKit for app ad campaigns. The two work together for now, with impressions ranked jointly and SKAN conversion updates mirrored into AAK.
What is mobile app attribution?
Mobile app attribution is the process of crediting each app install and in-app event to the ad, link or channel that drove it. It tells you which campaigns bring users, so you can move budget to the ones that work.