> For the complete AppRefer docs index, see https://apprefer.com/llms.txt (every page as markdown) or https://apprefer.com/llms-full.txt (all docs in one file).

# SKAdNetwork and AdAttributionKit

Apple's privacy-preserving attribution works for every iOS install, whatever the user answered to the tracking prompt. AppRefer sets the conversion value for you and collects copies of Apple's postbacks.

## How it works

When someone installs your app from an ad, Apple later sends the ad network an anonymous postback with the campaign and a conversion value (0 to 63, plus a coarse low, medium or high). Apple sends no postback until the app sets a conversion value, and only the app can set it. Postbacks arrive in up to three windows after install (days 0 to 2, 3 to 7 and 8 to 35).

AppRefer supports both SKAdNetwork and its successor AdAttributionKit. The SDK updates both frameworks, because your ad networks may use either.

## Conversion values (SDK 0.7.0+)

The iOS, Flutter and React Native SDKs register each install on first launch (value 0, coarse low). After that they ask AppRefer for the install's value on launch, when the app becomes active, after trial and purchase events and after AppRefer Billing purchases, and set it on the device through AdAttributionKit (iOS 17.4+) and SKAdNetwork (iOS 15+). Values only go up, and windows are never locked early. There is nothing to configure.

| Fine value | Coarse | Meaning |
| --- | --- | --- |
| 0 | low | Opened the app |
| 10 | medium | Started a free trial |
| 20 + US dollars paid, rounded up (max 63) | high | Paid within 35 days of install, for example $4.99 → 25, $9.99 → 30, $39.99 → 60, $43 or more → 63 |

Amounts come only from store-verified purchases (AppRefer Billing, or a RevenueCat webhook), converted to USD and each counted once. SDK events can mark that a trial started or that the user paid, but never set an amount. A reinstall starts a new 35-day window.

If you take payments some other way, ask for an update straight after the purchase so the value is set sooner:

**Swift**

```swift
await AppRefer.updateConversionValue()
```

**Dart**

```dart
await AppReferSDK.updateConversionValue();
```

**TypeScript**

```typescript
await AppRefer.updateConversionValue();
```

The SDK reads the value from `POST /api/track/conversion-value` (SDK key, `{device_id, installed_at}`), which returns `{fine, coarse, windowEndsAt}`. You don't need to call it yourself.

> **Tell your ad networks the schema**
>
> A network can only optimise on conversion values if it knows what they mean. Enter the schema above wherever the network lets you map conversion values. Meta documents importing a schema through its own SDK or its partner measurement providers; we haven't confirmed that Meta accepts this schema for apps measured with AppRefer, so check in Events Manager before relying on Meta's SKAdNetwork reporting.

## Receive postback copies

Apple can send you a copy of each winning postback. Set AppRefer as the copy endpoint in your app's `Info.plist`:

**Info.plist**

```xml
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://apprefer.com</string>
<key>AttributionCopyEndpoint</key>
<string>https://apprefer.com</string>
```

Apple then posts to `https://apprefer.com/.well-known/skadnetwork/report-attribution/` and `https://apprefer.com/.well-known/appattribution/report-attribution/`. AppRefer checks Apple's signature on every postback (SKAdNetwork 2.1 and later, and AdAttributionKit), stores each one once, and matches it to your app by its App Store ID. Postbacks with a bad signature are refused. If more than one app in AppRefer claims the same App Store ID, the postback is kept but not assigned to an app.

Postbacks are anonymous. AppRefer counts them by ad network, campaign (source identifier), window and value, and never links them to an install or a user.

## Read postbacks

**GET /api/v1/apps/{appId}/skan/postbacks (scope skan:read)**

```bash
curl "https://apprefer.com/api/v1/apps/$APP_ID/skan/postbacks?days=30" \
  -H "Authorization: Bearer $AK_LIVE_KEY"
```

`days` is 1 to 400 (default 30). The response has `installs`, `trials` and `paid` (first-window install postbacks whose value says the install started a trial or paid) and `rows`, each with `framework`, `conversionType`, `adNetworkId`, `sourceIdentifier`, `sequenceIndex` (the window), `conversionValue`, `coarseConversionValue` and `postbacks`. Only production postbacks are counted. The MCP tool `get_skan_postbacks` returns the same summary.

> **Works alongside click attribution**
>
> SKAdNetwork gives aggregate, campaign-level results from Apple. It complements AppRefer's click-based attribution, which on iOS only covers installs whose user allowed tracking. The older conversion-value table under `/api/v1/apps/{appId}/skan` is for display only and doesn't change the values the SDK sets.

---

Source: https://apprefer.com/docs/integrations/skan · Last updated: 2026-10-20
