Glossary/iOS platform and privacy
SKAdNetwork
Definition
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.
It exists because attribution used to work by matching an IDFA on the ad click to the same IDFA on the install, and ATT removed that identifier for most users. SKAdNetwork replaces the join: the device does the matching internally and reports the outcome with the identifiers stripped, the timing randomised, and the payload deliberately small. Everything that makes SKAN awkward to work with is a consequence of that trade.
The version history, and why it matters to your schema
SKAN's capabilities changed substantially across versions, and a schema designed for 2.x throws away most of what 4.0 can carry.
| Version | iOS | What it added |
|---|---|---|
| 2.0 | 14.0 | Conversion values, a 24-hour-plus timer, one postback |
| 2.2 | 14.5 | View-through attribution via fidelity-type |
| 3.0 | 14.6 | did-win — losing networks learn they lost |
| 4.0 | 16.1 | Three postbacks, hierarchical source IDs, coarse values, web-to-app |
4.0 is the version to design for, and its headline change is that a campaign no longer gets one shot at a single number. Three conversion windows mean you can measure an install, then a day-7 signal, then a day-35 signal, from the same ad.
| Window | Measures days | Value granularity | Random delay after window |
|---|---|---|---|
| 1 | 0–2 | Fine (0–63) or coarse | 24–48 hours |
| 2 | 3–7 | Coarse only | 24–144 hours |
| 3 | 8–35 | Coarse only | 24–144 hours |
Only window 1 can carry a fine value
Any revenue or event detail you need at bit-level precision has to be measurable within 48 hours of install. Windows 2 and 3 give you low, medium or high and nothing more, so a schema that puts day-30 LTV in the fine value is measuring something SKAN will never report.
The source identifier and the anonymity tiers
4.0 replaced the flat 0–99 campaign ID with a hierarchical source-identifier of two, three or four digits. You always get the first two. Whether the remaining digits and the conversion value survive depends on the install cohort's crowd anonymity tier — Apple's measure of whether a cohort is large enough that a report cannot single out a person.
| Tier | Source identifier | Conversion value |
|---|---|---|
| 0 | 2 digits | None |
| 1 | 2 digits | Coarse only |
| 2 | 3 digits | Coarse only |
| 3 | 4 digits | Fine (0–63) |
Read the hierarchy outwards from the two digits you always receive: put your most important dimension there — campaign, or geo — and the finer splits in digits three and four, because those are the ones a low-volume campaign loses. A network that encodes campaign in digit four gets no campaign reporting at all on small campaigns.
Registering, and what the postback looks like
An advertised app declares every ad network permitted to claim its installs. A network absent from this list receives nothing, which is the first thing to check when a partner reports zero SKAN volume.
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>example123.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>partner456.skadnetwork</string>
</dict>
</array>
<!-- Get your own copy of winning postbacks -->
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://postbacks.example.com</string>{
"version": "4.0",
"ad-network-id": "example123.skadnetwork",
"source-identifier": "5239",
"app-id": 525463029,
"transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
"redownload": false,
"source-domain": "example.com",
"fidelity-type": 1,
"did-win": true,
"postback-sequence-index": 0,
"conversion-value": 20,
"coarse-conversion-value": "high",
"attribution-signature": "MEQCIQD..."
}fidelity-typeis1for a StoreKit-rendered click and0for a view-through impression. Mixing them in one report inflates your click performance.postback-sequence-indexis0,1or2and tells you which window this is. Without it, three postbacks for one install look like three installs.did-winisfalsefor networks that were in the running and lost — count only wins.source-domainappears for web-to-app;source-app-idfor app-to-app. Neither is guaranteed.attribution-signaturemust be verified against Apple's public key, or your endpoint will accept fabricated installs.
Absent fields are the norm, not an error
Every optional field above disappears at lower anonymity tiers. Parse defensively: treat a missing conversion-value as "not reported" rather than zero, since collapsing the two is how SKAN dashboards end up showing a large cohort of worthless users who were simply never measurable.
Where SKAdNetwork stands now
AdAttributionKit is SKAN's successor and has been available since iOS 17.4. Apple has not published a SKAdNetwork deprecation date, and SKAN is still where the overwhelming majority of iOS attribution volume lands, so the honest position is that SKAN is the present and AdAttributionKit is the direction.
The practical consequence is that you maintain one conversion value schema and feed it to both frameworks, rather than treating them as a migration. The bit budget, the windows and the anonymity tiers are shared, so a schema designed properly for SKAN 4.0 is already an AdAttributionKit schema.
SKAN conversion value builder
Our conversion value builder maps your events and revenue buckets into the 6 bits SKAN actually transmits, shows what survives at each anonymity tier, and exports the mapping your SDK and your ad networks both need to agree on.
Open the skan conversion value builder →Frequently asked questions
- What is SKAdNetwork?
- SKAdNetwork is Apple's StoreKit framework for attributing app installs to advertising campaigns without exposing a device identifier. When a user installs an advertised app, the operating system itself decides which ad network won, then sends that network a delayed postback containing a campaign identifier and an optional conversion value, with the device-level identifiers stripped out.
- What is the difference between SKAN 3 and SKAN 4?
- SKAN 4.0, available from iOS 16.1, added three conversion windows instead of one, replaced the flat 0–99 campaign ID with a hierarchical source identifier of up to four digits, introduced coarse conversion values of low, medium and high for cases where the fine value cannot be sent, and added web-to-app attribution via a source domain. SKAN 3.0's main addition was the did-win flag.
- Why is my SKAdNetwork conversion value missing?
- Because the install cohort did not reach the crowd anonymity tier required to carry it. At tier 0 no conversion value is sent at all, and at tiers 1 and 2 only the coarse low, medium or high value is sent. Low-volume campaigns and narrow geo splits sit at the bottom tiers, so the fix is consolidating campaigns rather than changing your instrumentation.
- How long does a SKAdNetwork postback take to arrive?
- The first postback arrives 24 to 48 hours after the end of the first conversion window, which itself covers days 0 to 2 after install, so expect roughly three to five days. The second and third postbacks add a randomised delay of 24 to 144 hours after their windows close, putting window 3 as much as six weeks after the install.
- Do I need ATT permission for SKAdNetwork to work?
- No. SKAdNetwork was designed to function without the IDFA and without an App Tracking Transparency prompt, since the operating system performs the match internally rather than handing anyone a cross-app identifier. ATT consent is only relevant if you additionally want device-level identifiers for purposes SKAdNetwork does not serve.
Related terms
- Conversion Value — A conversion value is a 6-bit integer between 0 and 63 that an iOS app sets after install to describe post-install behaviour, and which the operating system reports to the ad network in an attribution postback.
- SKAN Postback — A SKAN postback is a signed JSON report that iOS sends from the device to an ad network's server after an advertised app is installed, containing the campaign identifier and any conversion value the install's privacy tier permits.
- Crowd Anonymity — Crowd anonymity is Apple's privacy mechanism that decides how much campaign and conversion detail an attribution postback may contain, based on whether the install cohort is large enough that the report cannot identify an individual.
- AdAttributionKit — AdAttributionKit is Apple's ad attribution framework, introduced in iOS 17.4, that reports privacy-preserving install and re-engagement postbacks for advertised apps installed from the App Store or an alternative app marketplace.
- 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.