The App Attribution Guide
Chapter 6

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.
No workarounds: Apple's guidance says that without ATT permission you cannot use another identifier, such as a hashed email address, to track the person. Fingerprinting is also not allowed, as covered in how an install gets attributed.

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.

WindowDays after first launchPostback delay after window endsValue allowed
1Day 0 to day 224 to 48 hours, randomFine or coarse, depending on tier
2Day 3 to day 724 to 144 hours, randomCoarse only
3Day 8 to day 3524 to 144 hours, randomCoarse 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, medium or high. 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.
Conversion value schema: The mapping that decides which in-app actions set which values, for example 0 for install only, a band of values for sign-up, and higher values for purchases by revenue band. With only 64 fine values, the schema is a trade-off between detail and coverage.

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.

TierFirst postback containsSecond and third postbacks
32 to 4 digit source ID, fine value, source app or domain, optional country code2-digit source ID and coarse value
22 to 4 digit source ID and fine value2-digit source ID and coarse value
12-digit source ID and coarse value2-digit source ID and coarse value
02-digit source ID onlyNone

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-type of download, redownload or reengagement.
  • 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.