> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kontext.so/llms.txt
> Use this file to discover all available pages before exploring further.

# SKAdNetwork

> Configure SKAdNetwork identifiers on iOS so DSPs can attribute installs from your ads.

[SKAdNetwork](https://developer.apple.com/documentation/storekit/skadnetwork) (SKAN) is Apple's privacy-preserving install-attribution framework. Every advertiser ([DSP](/concepts/ad-engine)) that runs on iOS has its own SKAdNetwork identifier. For a DSP to attribute an install back to one of your ads, its identifier must be listed in your app's `Info.plist`.

<Note>
  SKAdNetwork is **iOS-only**. It applies to the Swift SDK and to the iOS half of React Native and Flutter SDKs. Android, web, React, Vue, and JavaScript SDKs don't need this configuration.
</Note>

## What to add to `Info.plist`

During onboarding we provide the list of SKAdNetwork identifiers for every DSP active in our network. Append them under `SKAdNetworkItems`:

```xml theme={null}
<key>SKAdNetworkItems</key>
<array>
  <dict>
    <key>SKAdNetworkIdentifier</key>
    <string>XXX.skadnetwork</string>
  </dict>
  <dict>
    <key>SKAdNetworkIdentifier</key>
    <string>YYY.skadnetwork</string>
  </dict>
  <!-- Add all identifiers we provided here -->
</array>
```

<Warning>
  If your app already has an `SKAdNetworkItems` array (from another ad SDK), **append** the identifiers we give you to the existing array — don't replace it, or you'll break attribution for the other networks. Apple deduplicates identifiers automatically, so adding the same one twice is harmless.
</Warning>

<Warning>
  Missing an identifier means installs attributable to that DSP will silently not be counted — you lose revenue without any visible error. Add **all** identifiers we provide, not a subset.
</Warning>

## How the SDK uses it

The SDK reads `SKAdNetworkItems` from `Info.plist` at startup. It does not modify the array or write to it.

On every `POST /init` call (fired in the background when you create a `Session`), the SDK forwards the full list of identifiers it found to our ad server. The ad server uses this list to:

1. Tell each DSP which identifiers are present in your app, so they know whether they can attribute installs from your traffic.
2. Filter out DSPs whose identifier is missing from your `Info.plist` — they can still serve ads, but their install attribution won't work, and we'll surface the gap in your dashboard.

This is why the identifier list needs to stay in sync with the list we provide. When we add a new DSP to the network, you'll get an updated list during onboarding — add the new identifier and re-submit your build.

## Apple's SKAN APIs

Once the identifiers are listed, the rest of SKAN is handled by Apple's `SKAdNetwork` API and the DSP's measurement integration. The SDK doesn't call `SKAdImpression` or `endImpression` directly from your code — that's handled internally as part of the ad render lifecycle.

## Troubleshooting

* **A DSP reports zero installs even though their ads ran.** Their identifier may be missing from your `Info.plist`, or the build with the updated list hasn't shipped yet. Check the dashboard — we flag missing identifiers there.
* **Editing `Info.plist` requires a new App Store build.** SKAdNetwork identifiers are baked into the binary; they can't be changed remotely. Add the full set during onboarding and submit one build with everything we've given you.
* **Need an updated list?** Contact [support@kontext.so](mailto:support@kontext.so) — we'll send the latest identifiers.
