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

# SKAdNetwork

> Receive copies of SKAdNetwork and AdAttributionKit postbacks, and read paid campaign results by ad network

Paid campaigns on ad networks other than Apple Search Ads are measured on iOS through SKAdNetwork and AdAttributionKit. Apple sends the ad network a postback for each attributed install, and can send the app's developer a copy. Appeeky Analytics receives these copies and shows them by ad network and campaign, with the conversion values the SDK writes.

Postbacks carry the app's Apple ID, the ad network, a campaign or source identifier and the conversion value. They never identify a device or a user.

***

## Setup

**1. Add the config plugin**

The SDK's config plugin adds two Info.plist keys:

* `NSAdvertisingAttributionReportEndpoint` (SKAdNetwork)
* `AdAttributionKit › AttributionCopyEndpoint` (AdAttributionKit)

For the hosted service, both are set to `https://appeeky.com`. iOS then posts copies to:

```
https://appeeky.com/.well-known/skadnetwork/report-attribution/
https://appeeky.com/.well-known/appattribution/report-attribution/
```

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "expo": {
    "plugins": ["@appeeky/analytics-react-native"]
  }
}
```

**2. Rebuild and release**

The keys are read from the app binary, so they take effect from the next build you ship to the App Store.

**3. Check the app's Apple ID**

Postbacks are matched to your app by its Apple ID (the numeric App Store id). Appeeky takes it from the app in **My Apps** when you turn on Analytics.

> [!WARNING]
>
> An app can name **only one** endpoint for postback copies. If another attribution provider already receives them, adding the plugin with its default setting replaces that endpoint. To keep your current provider, pass `false`:
>
> ```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
> ["@appeeky/analytics-react-native", { "attributionEndpoint": false }]
> ```
>
> The SDK still writes conversion values, but Appeeky receives no copies and the SKAdNetwork report stays empty.

When self-hosting, pass your server's registrable domain instead: `{ "attributionEndpoint": "https://example.com" }`. See [Self-Hosting](https://docs.appeeky.com/docs/analytics-self-hosting.md).

***

## Conversion Value Schema

With the native module on iOS, the SDK keeps the conversion value up to date, so ad networks and the report see what each install did. Values only go up.

| Fine value | Coarse value | Meaning | Set by |
| - | - | - | - |
| 1 | low | Opened | First launch (automatic) |
| 2 | medium | Came back on a later day | A later day's launch (automatic) |
| 8 | medium | Started a trial | `Appeeky.trialStarted()` |
| 16–63 | high | Purchased | `Appeeky.purchased(valueUsd)` |

For purchases, the fine value is `16 + floor(valueUsd / 2)`, capped at 63. Each step stands for \$2 of revenue:

| Fine value | Purchase amount (USD) |
| - | - |
| 16 | \$0–2 |
| 17 | \$2–4 |
| 30 | \$28–30 |
| 62 | \$92–94 |
| 63 | \$94 or more |

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
// After a RevenueCat purchase succeeds:
Appeeky.purchased(29.99); // fine value 30, coarse "high"
```

`purchased()` and `trialStarted()` only update the conversion value. Revenue itself comes from RevenueCat, so nothing is counted twice.

***

## Reading the Report

The SKAdNetwork report lists postbacks received in the selected period, one row per ad network and campaign (source identifier).

| Column | Meaning |
| - | - |
| Network | The ad network's name for well-known networks (for example Meta, Google, TikTok / Pangle, Unity Ads, AppLovin, ironSource, Snap, Liftoff Vungle), otherwise its SKAdNetwork id |
| Source identifier | The campaign or source id the ad network used (2–4 digits for SKAdNetwork 4, the campaign id for earlier versions) |
| Installs | First-window postbacks: one per attributed install |
| Conversions | First-window postbacks grouped by what their fine value means: Installed, Opened, Returned, Trial started, Purchase \$x–y |
| Estimated revenue | Revenue implied by first-window fine values |
| Later windows | Postbacks from the second and third conversion windows, by coarse value (low, medium, high, none) |

Rows with the type `skan` come from SKAdNetwork and `aak` from AdAttributionKit. Duplicate postbacks are dropped.

### Unknown values

Apple leaves out the fine value when an install does not meet its privacy threshold. These postbacks show as **Unknown (privacy threshold)** and add nothing to estimated revenue.

### Estimated revenue

Estimated revenue is not measured revenue. For each first-window postback with a purchase value, Appeeky counts the middle of the value's $2 range (for example $29 for fine value 30) and \$94 for fine value 63. It only reflects the purchase value the SDK had written when Apple took the first-window value, not renewals or later purchases, and it only covers installs Apple reported. Use it to compare campaigns and networks with each other, not as a revenue total.

***

## Limits

* SKAdNetwork is iOS only.
* Postbacks are aggregated by Apple. They cannot be joined to single installs, so SKAdNetwork campaigns do not appear as a source in other reports.
* Apple decides when postbacks are sent, so recent days fill in over time.

***

## Related Docs

* [Attribution](https://docs.appeeky.com/docs/analytics-attribution.md)
* [SDK Reference](https://docs.appeeky.com/docs/analytics-sdk-reference.md)
* [Analytics API](https://docs.appeeky.com/docs/analytics-api.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.