Blog · SKAN and AdAttributionKit
SKAdNetwork vs AdAttributionKit splits on re-engagement: click-only, no runner-up postbacks.
SKAdNetwork vs AdAttributionKit is an install schema pasted onto a re-engagement Apple does not send that way. SKAN 4 added three windows and a coarse low, medium, and high. The fine value 0-63 still exists, and it only arrives on the first postback, and only when crowd anonymity allows. Windows 2 and 3 are coarse. An MMP dashboard that maps one 0-63 across 35 days is reading a schema Apple does not send.
AdAttributionKit launched with iOS and iPadOS 17.4 for install conversions, click-through with 30 days to install and view-through with 24 hours. Re-engagement arrived with iOS 18. It is click-through: someone who already has the app taps a custom rendered ad, or taps Open on a StoreKit rendered ad. The system does not create re-engagement postbacks from view-through ads. After an install, the device has 60 days to send the first conversion value update. After a re-engagement, it has 2 days.
Install conversions still pick one winner. AdAttributionKit and SKAdNetwork impressions are sorted together. Click-through takes precedence over view-through. Up to five other networks can receive one nonwinning postback each on an install. Re-engagement only involves the impression that drove the open. The framework does not generate runner-up postbacks for re-engagements. A did-win false row on conversion-type reengagement is a join Apple will not send.
An AppsFlyer S2S purchase is not either postback
Server-to-server events are purchases the SDK never saw: a web renewal, a call-center charge. AppsFlyer can record them against appsflyer_id. SKAN Conversion Studio has a separate setting to record in-app events sent by the S2S API. If that toggle is off, the S2S event can exist in the MMP and still never appear in SKAN measurement. Posting S2S does not send a conversion value to Apple.
AdAttributionKit will not invent a re-engagement because a billing webhook fired. Re-engagement starts from a click on a device that already has the app. The webhook is a different pipe. Join it to the MMP with the MMP's own id. Do not join it to a did-win flag you expected from a SKAN 3 table.
Fine value on SKAN 4 postback 1, coarse on later windows, and a 2-day re-engagement update window on AdAttributionKit are three clocks. A single conversion-value column in the warehouse collapses them. Store the framework, the conversion type, and which postback index you are reading before you chart one number.
What each postback is allowed to carry
A SKAN 2 campaign id and a did-win false copy do not describe the re-engagement row.
SKAN 4 postback 1: fine 0-63 when crowd anonymity allows; later windows coarse
AAK install: one winner, up to five did-win false, 60 days to first update
AAK reengage: click only, no runner-up, 2 days to first update
Crowd anonymity can withhold the fine value even on postback 1. Absence of 0-63 is not a broken postback parser. It is the privacy threshold. Coarse low, medium, and high on later windows are the values Apple sent. Mapping them back to a 6-bit integer invents precision the postback does not have.
Pixellint is not affiliated with Apple. These posts cite Apple's AdAttributionKit and SKAdNetwork documentation. The MMP dashboard is not that schema. When the row says reengagement, stop looking for a runner-up and stop looking for a two-digit campaign id.
Installs still mix the two frameworks. Re-engagement does not.
On an install, the device considers impressions from AdAttributionKit and from SKAdNetwork, sorts them, and picks one winner. Click-through beats view-through. Each network gets at most one postback, winning or not. That is why a SKAN winner and an AdAttributionKit nonwinner can both exist for one install, and why your join has to store which framework sent the row.
Re-engagement does not run that auction. One impression, the click that opened the app, and no nonwinning copies. If your pipeline left-joins every conversion to a did-win false table, re-engagement rows look like missing losers. They are not missing. Apple did not generate them. Stop the join when conversion-type is reengagement.
Overlapping conversion tags on iOS 18.4 let more than one re-engagement window be open. They are how you tell those windows apart. They are not a campaign id you can drop into a SKAN 2 decoder. Store the tag next to the postback. Do not overwrite it with a two-digit campaign.
Chart the postback index or you will invent a fine value
SKAN 4 postback 1 may include fine 0-63. Later postbacks are coarse: low, medium, or high. A report that averages conversion value across postback sequence treats coarse buckets as if they were 6-bit integers. Split the chart by postback index. Show the fine value only where the postback actually carried it.
AdAttributionKit's first update arrives inside 60 days after install and inside 2 days after re-engagement. A daily cohort that expects a SKAN-style delay of 24 to 48 hours will mark two-day re-engagement updates as late and sixty-day install updates as expired, or the reverse, if one SLA covers both. Put the conversion type on the SLA.
Developer Mode timing is for tests. Do not use a 5 to 10 minute test postback as evidence that production re-engagement is late when it takes a day. Production minimums stay in the 24 to 48 hour range after the conversion value path, on top of the update window. A test that only exercises installs will never show the missing runner-up, because installs still have them.
What does not transfer
- SKAN 4 fine 0-63 is postback 1 only, and only when crowd anonymity allows. Windows 2 and 3 are coarse.
- AdAttributionKit re-engagement is click-only. View-through does not create that postback.
- Installs can send up to five nonwinning postbacks. Re-engagement does not.
- did-win false is an install story. Do not join it to conversion-type reengagement.
- Conversion tags on iOS 18.4 are not SKAN campaign ids.
- Install update window is 60 days. Re-engagement update window is 2 days.
- An MMP S2S event is not a SKAN postback and not an AdAttributionKit re-engagement.
Sources
Contract pages
The dated argument is above. These pages are the field lists.