Short answer: SKAN 4 can send up to three postbacks for the winning ad, one for each conversion window: days 0 to 2, 3 to 7 and 8 to 35 after first launch. Apple adds a random delay after each window, and decides how much detail each postback carries through crowd anonymity tiers. Only the first postback can carry a fine value.
What a SKAN postback is
SKAN postback: a signed message Apple sends to an ad network, and optionally a copy to the developer, confirming that an install came from one of its ads, with a conversion value where privacy rules allow.
SKAdNetwork measures iOS installs without user-level identifiers. Apps do not need ATT permission to use it, according to Apple. Apple's SKAdNetwork page now points developers to AdAttributionKit for app ad campaigns, but the two work together, as covered below.
How many postbacks does SKAN 4 send?
Up to three for the winning ad, on iOS 16.1 or later with ads signed for SKAN 4. Up to five non-winning ads can also receive a postback, marked did-win false, but only for the first window and without a conversion value.
The three conversion windows
| Postback | Window after first launch | Delay after window ends | Value type |
|---|---|---|---|
| First | Days 0 to 2 | 24 to 48 hours | Fine (0 to 63) or coarse, depending on tier |
| Second | Days 3 to 7 | 24 to 144 hours | Coarse only |
| Third | Days 8 to 35 | 24 to 144 hours | Coarse only |
Points to know:
- Windows start at first launch, not at install.
- Locking a window with lockWindow set to true finalises its value early, and Apple ignores further updates in that window. The delay then starts from the lock.
- The random delay is deliberate, so the timing of a postback cannot identify a user.
- SKAN 3 and earlier used a single rolling 24-hour timer, with a postback 24 to 48 hours after the last update.
Fine and coarse values
- Fine value: a 6-bit integer from 0 to 63. Values outside that range return an invalid conversion value error and are ignored. Apple ignores fine values after the first window.
- Coarse value: low, medium or high. You or your ad network decide what each means.
- The update method matters. The older updatePostbackConversionValue method without a coarse value only works in the first window and does not produce multiple postbacks. Use the version that takes coarseValue and lockWindow.
Crowd anonymity tiers
Apple gives each download a tier based on crowd size: how many installs share the same publisher app or domain, advertised app, country and source identifier.
| Tier | First postback | Second and third postbacks |
|---|---|---|
| Tier 3 | 2 to 4 digit source ID, fine value, source app ID or domain, optional country | 2-digit source ID, coarse value |
| Tier 2 | 2 to 4 digit source ID, fine value | 2-digit source ID, coarse value |
| Tier 1 | 2-digit source ID, coarse value | 2-digit source ID, coarse value |
| Tier 0 | 2-digit source ID only | None |
At WWDC25, Apple described the country code as a bonus tier on top of the four, present only with enough volume in that country.
Install windows and limits
- 30 days to install after a StoreKit-rendered ad or an attributable web ad.
- 24 hours to install after a view-through ad.
- 60 days after install for the app to be launched, and 60 days for the device to send the first conversion update.
- StoreKit records up to 15 view-through impressions per source app, each expiring after 24 hours.
- The minimum time from impression to postback is 24 to 48 hours. Apple's testing profile reduces it to about 5 to 10 minutes.
How AdAttributionKit fits in
AdAttributionKit is Apple's newer framework, available from iOS 17.4 for installs, with re-engagement added in iOS 18. It uses the same three windows and the same delays as SKAN 4. AdAttributionKit and SKAN impressions are ranked together and only one wins: click-through always beats view-through, then recency. SKAN conversion updates are mirrored into AdAttributionKit, and its postbacks label each conversion as download, redownload or re-engagement.
Common problems
- Null values: non-winning postbacks, tier 0 or 1, or no update call. See SKAN null conversion values.
- No postbacks at all: no update on first launch, or still inside the delay. See no SKAN postbacks.
- Only one postback: tier 0, SKAN 3 ads or the legacy method. See only the first SKAN postback.
- The SKAN null values troubleshooter walks through these in order.