SKAdNetwork Solution guide

At a glance: Attributing app installs using SKAdnetwork.



SKAdNetwork infrastructure, part of iOS by Apple, helps advertisers measure campaign success while maintaining user privacy. The SKAdNetwork infrastructure operates without IDFA or other advertising ID. SKAdNetwork functions without the need for ATT consent.  

Minimum version requirements updated March 23, 2021:

  • SKAdNetwork solution SDK V6.2.4. 

iOS 14 guidance 

  • Starting iOS 14.5 if you want to track users across apps and websites owned by other companies you'll need to get consent via the ATT prompt. 
  • If you advertise using Apple Search Ads (ASA), and SKAdNetwork adopt the latest SDK version and change your reporting processes in accordance with our ASA bulletin. Note! ASA campaigns aren't part of SKAdNetwork reporting; they are part of AppsFlyer MMP attribution.  
  • General iOS 14 guidance:
    • AppsFlyer traditional attribution continues to operate unchanged compared to iOS 13. 
    • Implement the AppsFlyer SKAdNetwork Solution as described in this article. 
    • Before iOS 14.5 you can get IDFA without displaying the ATT prompt.
  • If you currently use AppsFlyer iOS SDK V5.4:
    • Traditional attribution continues to operate unchanged compared to iOS 13. 
    • Adopt the latest version of the AppsFlyer SDK  going forward. Expect that the App Store won't approve apps running with an SDK version before V6.0. 

Related reading


  • SDKAppsFlyer iOS SDK latest version integrated into an app.
  • SKAdNetwork Infrastructure or Infrastructure: Refers to the attribution functions embedded in iOS 14, as defined by Apple. 
  • SKAdNetwork Solution or Solution: SDK, Infrastructure, and AppsFlyer platform working together. The Solution provides advertisers and ad networks with LTV data via dashboard analytics, reports, and postbacks. 
  • Measurement window has a set duration, default of 24 hours, starting with the first app open. 
  • Conversion value is the measure of user quality set by the app. Usually, the AppsFlyer SDK does this for you. However, if you set the conversion value, then use Custom conversion value.

This article describes the relevant characteristics of the Infrastructure, the Solution, and the available configurations. 

Apple SKAdNetwork Infrastructure basics

Characteristic Description

To enable the use of SKAdNetwork in the app:

  • Devices having:
    • iOS 11-13 support SKAdNetwork V1 (installs only)
    • iOS 14+ SKAdNetwork V2+ (with conversion value)
  • App-to-app attribution
Not supported
  • Mobile web
  • Campaign numbering is restricted to the range 1-100; means 100 unique values per ad network per app.
    • Ad networks are required to provide AppsFlyer with their campaign ID and name. This reflects in AppsFlyer dashboards and reports. 
    • Ad networks may further restrict this; so check with each ad network
  • Organic installs. (SKadNetwork doesn't support organic installs. However, in the dashboard, organic metrics calculated by AppsFlyer are available.)
  • Re-engagement
  •  SKAdNetwork attributes using the following Apple attribution model
    • The user, clicks an ad, within 30 days installs (downloads the app), and thereafter within 60 days opens the app for the first time. 
    • The user views an ad, within 24 hours installs (downloads the app), and thereafter within 60 days opens the app for the first time. 
    • Starting with SKAdNetwork V2.2, click-through attribution takes priority over view-through attribution. The SKAdNetwork version depends on the user's iOS version. 
  • Aggregated attribution with campaign-level granularity
  • Postbacks:
    • Sent to the attributed ad network by the OS layer of the iOS device
    • 24-72 hours after install
    • No postback for organic installs
Privacy thresholds 

Why is the conversion value missing in some postbacks? 

According to Apple, the postback won't include the conversion value nor the source app ID if doing so contravenes Apple privacy threshold limits. 

SKAdNetwork Solution

The solution offers measurement modes as follow:

  • AppsFlyer measurement mode: Adopt the latest SDK version and in the user interface set your measurement requirements. This is described in detail in the sections that follow. The logic required to set the conversion value is embedded in the SDK and doesn't require any coding in the app. 
  • Custom measurement mode: Adopt the latest version SDK version. You need to code the logic required to set the conversion value in the app. The SDK does not do this. On receipt of postbacks, AppsFlyer decodes them using your Custom conversion mapping. If you are not yet familiar with the different measurement modes, consider the examples in this article and contrast them with those in the Custom conversion mapping article. 

Solution principles and flow

To overcome the functional and structural limitations of the SKAdNetwork infrastructure, the Solution takes into consideration the characteristics in the table that follows.

Characteristic Description
Data collection
  • For the advertiser, SKAdNetwork postbacks are collected from multiple ad networks.
  • Advertisers don't need to integrate individually with each ad network—a complex and tedious task.
Data validation
  • Ensures postbacks are signed by Apple; this reduces the chances of postback manipulation.
  • Uses the transaction ID field to validate that postbacks are unique.
Data enrichment
  • Enriches SKAdNetwork postback data with other data points to provide complete ROI analysis. For example, campaign name provided by the ad network, and so on. 
  • Data points include impressions, clicks, cost, organic traffic, and more.
Data delivery

Enriched SKAdNetwork data is available using the following: 

Seamless integration
  • Full encapsulation enables a near-zero effort by the advertiser via the app settings page.
  • No coding required. The app requires the latest SDK version. 
  • Includes support for expected changes by Apple in the SKAdNetwork infrastructure.

Advertisers can change measurement configurations as needed in the dashboard.

SKAdNetwork attribution flow


  1. Advertiser sets SKAdNetwork measurement settings in the Platform.
  2. After the user opens the app for the first time, Platform instructs SDK how to calculate the conversion value using the current configuration set by Advertiser.
  3. During the Measurement Window SDK updates the conversion value for each measurable user action.
  4. 24-48 hours after the most recent conversion value update, iOS sends the postback to ad network.
  5. Ad network forwards the postback to AppsFlyer.
  6. AppsFlyer validates and decodes the conversion value. Decoded data is:
    • Recorded and attributed before being made available in AppsFlyer via dashboards, reports, and APIs.
    • Sent via a postback to the Ad network to enable campaign optimization.

More about timers

Performance measurement

You measure user quality by selecting a measurement mode.

Conversion value

  • Calculated according to the user-quality measurement setting existing at the time the user opens the app for the first time.
  • Updated by the SDK after each measurable user action that occurs in the app itself or reported by server-to-server (S2S) API. 
  • A numerical value from 0-63.
  • User actions occurring after the expiry of the measurement window are not recorded. 
  • Sent once per install, by iOS 24-48 hours, after the most recent conversion value update.
  • In most cases, iOS populate the conversion value in the postback if Apple determines that this doesn't contravene Apple privacy threshold limitations. 

The Solution supports the following user-quality measurement types:

  • [Default] Revenue: Total revenue generated by the user.
  • Conversion: Record the unique in-app events (1-6) the user performs.
  • Engagement: The number of times (0-63) the user performs a specific in-app event.

The sections that follow, contain descriptions of the metrics available and measurement examples. Use these to understand the capabilities and limitations of SKAdNetwork attribution and identify the measurement that will provide you with the greatest indication of user quality. Advertisers select the measurement type as needed via the dashboard. 


Installs Count
Clicks Count
Impressions Count

Click-to-install rate

Installs / Clicks *100 
Cost Campaign cost [Premium Feature]
Effective cost per install (eCPI) Cost / Installs
Converted users

Count of unique users performing a designated measurement event:

Converted users rate

Converted users / Installs * 100

Effective cost per action (eCPA)

Cost / Unique users performing a designated event

Metrics always available (irrespective of measurement type)

User-quality measurement types

User-quality measurement type settings
Measurement type Description
[Default] Revenue


Revenue generated during the Measurement Window


  • Value range: 0-63
  • Conversion value translation:
    • Conversion value units are translated to USD using one of the following conversion factors: $0.01, $1.00, $10.00
    • Revenue amounts in the dashboard and raw-data are converted to the app-specific currency using the current exchange rate. 


    • Revenue
    • ROI
    • ROAS
    • ARPU: Revenue/users installing the app
    • Rate of users converting: Users making a purchase/users installing the app
    • eCPA


In the app, foreign currency amounts are translated to USD which are converted to conversion units. Fractions of a conversion value unit are rounded up to complete units. For example, EUR 10, after translation using the current exchange rate is USD 11.25. If the conversion value unit rate selected is $1=1 unit, this is 11.25 units which is rounded up to 12 conversion value units. 



In-app event performed at one or more times during the Measurement Window


  • Number of events supported: 1-6
  • Select in-app events to measure from the drop-down list. Limitation: The list is limited to the top 300 events during the previous 30 days.
  • In the SKAdNetwork dashboard, select a given event as the conversion event

Metrics per in-app event:

    • Count of users performing an event
    • Conversion rate: Users performing the Conversion Event/users installing the app
    • eCPA
    • Sessions (uses the af_app_opened event)

Example of user counts:

  • Completed registration
  • Made a purchase
  • Reached a game level

Clarification! Use conversion measurement to count if a user performed an event. To count how many times a user performs an event use engagement measurement.



Number of times the user performed a specified in-app event during the Measurement Window


  • Select an in-app event from the drop-down list.
  • The in-app selection is also designated as the Conversion Event.
  • Value range: 0-63

Metrics for the in-app event:

    • Count of users performing the event
    • Average number of events per user
    • Conversion rate
    • eCPA
    • Sessions


  • Measure the number of times:
    • a user opened the app
    • the user viewed an ad

Measurement type examples

Example A: Revenue measurement
Factor Remarks
  • 20 users install the app and perform the following purchases:
    • 9 users, each make a purchase of $10
    • 5 users, each make a purchase of $5
    • 1 user makes a purchase of $1, then $3, then $5, and finally $1. In total $10. 
  • Cost data provided by API from the ad network: $30
SKAdNetwork Attribution Configuration
  • Select measurement type: revenue
  • Set conversion factor: 1 conversion unit = $1
  • Designated conversion event: In the SDK, you must send revenue using the af_revenue parameter. 
Selected metrics  Revenue related metrics available
  • Installs: 20
  • Revenue: $125
  • Conversions:15
  • ARPU: $6.25
  • ROI: 316%
Number of raw data rows per report 

Raw data reports are available via Data Locker

  • Device postbacks: 20 rows
  • Installs: 20 rows
  • In-app events: 15 rows. Note! The user making multiple purchases is represented by a single row of $10. 
Developer considerations

Events carrying revenue are recognized

Example B: Conversion measurement
Factor Remarks
  • 5 users (A-E) install the app
  • They perform 0-3 different in-app events, as depicted in the table
  • Cost data provided by API from the ad network: $30
  in-app-1 in-app-2 in-app-3
User A Performed Performed -
User B Performed - Performed
User C Performed Performed -
User D Performed Performed -
User E - - -
In-app events performed by users
SKAdNetwork Attribution Configuration

Select measurement type: Conversion

  • Select in-app events: in-app-1, in-app-2, in-app-3
  • In the SKAdNetwork dashboard, you select one of the events to calculate the converted users metric. You can change the selected event as needed. 
Selected metrics
Metric  App  in-app-1 in-app -2 in-app- 3
Installs 5      
Conversions 4      
Unique users   4 3 1
eCPA $ 7.5      
In-app related metrics available

Note! Because the designated Conversion Event is in-app 1, the value 4 is used to calculate app-level metrics and for in-app-1 metrics. 


Raw data reports are available via Data Locker

  • Device postbacks:5 rows
  • Installs: 5 rows
  • In-app events: 8 rows
Developer considerations
  • Make sure you send in-app events users perform.
  • SKAdNetwork Solution disregards event values (except in relation to revenue measurement.
Example C: Engagement measurement
Factor Remarks

5 users install the app and open the app the number of times listed in the table. 

  Number of times the event is performed
User A 63
User B 10
User C 5
User D 1
User E -
App opens
SKAdNetwork Attribution Configuration
  • Select measurement type: Engagement
  • Designated conversion event: af_app_opened Note! You can use any event available. 
Selected metrics

Sample metrics available

  • Installs: 5
  • Conversions: 4
  • Sessions: 79 
Number of raw data rows per report 

Raw data reports are available via Data Locker

  • Device postbacks:5 rows
  • Installs: 5 rows
  • In-app events: 79 rows; a row is equivalent to a single session
Developer considerations

On each occasion the user performs the selected engagement event: send the in-app event. SKAdNetwork counts the number of times you send the event. 


Configuring SKAdNetwork attribution

This configuration procedure must be performed by the account admin or a team member having edit app settings permission. 

To view or change team member permissions:

  1. In AppsFlyer, in the upper-right click on your email address. 
  2. Select Team members > Select the team member.
  3. If required, grant the team member Edit app settings page & SKAdNetwork settings page capabilities.

AppsFlyerAdmin_us-en.png To configure SKAdNetwork attribution:

  1. In AppsFlyer, go to Configuration > SKAdNetwork Settings.
    The SKAdNetwork settings page opens.
  2. [Optional advanced setting] If you want to report events by S2S, turn Record in-app events sent by server-to-server API.
  3.  Select a measurement type from one of the following:
    • Revenue: Select a unit-to-USD rate to translate revenue units to USD. There are up to 63 revenue units. The maximum measurable revenue is the unit-to-USD rate X 63. Options available: $0.01, $1.00, $10.00
      For example, $10 X 63 = $630, $1 X 63 = $63, $0.01 X 63 = $0.63.
    • Conversion: Select up to 1-6 in-app events performed by users.
    • Engagement: Select an in-app event whose occurrences are counted.
  4. Verify that SKAdNetwork measurement is on. Note! If off, the SDK does not call iOS SKAdNetwork functions like registerAppForAdNetworkAttribution, updateConversionValue.
  5. Click Save changes.
    Measurement is active. Users opening the app for the first time are measured using these settings. SKAdNetwork attribution data updates in the dashboard 48-72 hours after the first app open. 

Changing SKAdNetwork measurement type or mode

You can select a different SKAdNetwork measurement type or mode at any time. 


  • When you make settings change a transition period of 72 hours begins. During this period we decode the conversion value using the current (most recent) settings. However, a postback arriving now relates to an install that occurred 48-72 hours before. As such, user quality data that depends on conversion value decoding may be decoded using the wrong schema.
  • The number of installs reported is not related to the settings change and is accurate. In raw data, we indicate postbacks decoded during the transition period with a skad_ambiguous_event parameter. 

Campaign pause:

  • If you integrate with Facebook, changing the settings automatically pauses Facebook campaigns.
  • Regarding other campaigns, consider pausing them for the duration of the transition period.

Disable SKAdNetwork measurement

To turn off SKAdNetwork measurement:

  1. In AppsFlyer, go to Configuration > SKAdNetwork Settings.
  2. Turn off SKAdNetwork measurement. 
    Amongst other things, the SDK stops calling SKAdNetwork functions like registerAppForAdNetworkAttribution, updateConversionValue.
  3. Click Save changes.

Report events by server-to-server API


Both the SDK and server-to-server API (S2S) can send in-app events to AppsFlyer servers. 

The S2S flow is as follows:

  • An event occurs related to the user in the advertiser's servers. The app may be open or closed at this time. 
  • Advertiser servers report the event to AppsFlyer by S2S.
  • AppsFlyer calculates the updated conversion value and then: 
    • If the app is open on the user device: the SDK is notified of the updated value. The SDK updates the iOS conversion value on the device.
    • If the app isn't open on the user device: the server waits until the app is opened to notify the SDK of the conversion value. This must occur before the expiry of the measurement window. If notification fails, the event is disregarded.

SDK version required

  • Adopt the latest SDK version in the app. Note! No additional action is required by the developer. 


  • If you implement user anonymization for a given user then you can't send events by S2S for that user. 

To implement in-app event sending by server-to-server API:

  1. [One-time] Enable in-app event recording sent by server-to-server API:
    1. In AppsFlyer, go to Configuration > SKAdNetwork settings.
    2. Turn on Record in-app events sent by server-to-server API.
  2. Send events by S2S. 

Additional SKAdNetwork information

Reporting options

SKAdNetwork reports don't contain user-level identifiers. 

Report name  Type Enriched by AppsFlyer Delivery method Premium feature

Aggregated install date performance reporting. Aggregates of install, in-app events, and revenue. The data is similar to that found in the SKAdNetwork dashboard.

Aggregated using install date




Aggregated postback arrival date. SKAdNetwork postbacks aggregated to the most granular level possible. Postback aggregation using postback arrival date No API  No

SKAdNetwork raw-data (row-level) reports via Data Locker (with examples). Reports available:

  • Postbacks sent by iOS with data enrichment provided by ad network partners
  • Installs
  • Redownloads
  • In-app events
  Yes Data Locker

Yes. Raw data required. Data Locker subscription isn't required.

SKAdNetwork Solution implementation checklist

No. Action Description Responsibility
1 Prepare Marketer, Developer
2 Configure 

In AppsFlyer, configure the SKAdNetwork solution

3 Prepare the app

Migrate the app to AppsFlyer V6 SDK

  • No change to app logic nor to app code is required.
  • The Solution relies on in-app events to set the conversion value. Send in-app events in the usual manner. No Solution specific testing is required. 
  • See developer considerations for specific measurement scenarios.
  • Submit the app to the App Store
  • No SKAdNetwork registration or process is required in the app store.
4 Partner integrations 

Ad network partners must integrate with AppsFlyer using SKAdNetwork integration. Note! AppsFlyer SKAdNetwork simulation contains the data of all your partners irrespective of their current integration status. This won't be the case for the live data reported by SKAdNetwork postbacks.

In relation to partners running your campaigns complete the following as required: 


  1. Verify that the partner has an AppsFlyer SKAdNetwork capability badge.
  2. Verify that your in-app event names are mapped to partner in-app event names. 


SKAdNetwork implementation checklist

Troubleshooting guide



The dashboard doesn't contain any non-organic installs.
  1. Verify that SKAdNetwork measurement is on.
    • Go to Configuration > SKAdNetwork settings.
  2. Verify that your SDK version is 6.2.6+.
    • To do so, go to Integration > SDK Information > Users by SDK version. 
  3. If you use SDK plugins, verify that you implement a version that supports AppsFlyer SKAdNetwork. 
  4. Verify that your ad network partners are integrated with AppsFlyer and that they forward iOS postbacks to AppsFlyer.
The dashboard contains non-organic installs but no in-app events at all.
  1. Verify that your SDK version is 6.2.6+.
    • To do so, go to Integration > SDK Information > Users by SDK version. 
  2. If you use SDK plugins, verify that you implement a version that supports AppsFlyer SKAdNetwork.
  3. Do you send events using S2S? If so, verify that Record in-app events sent by server-to-server API is on. 
    • Go to Configuration > SKAdNetwork settings. 
The dashboard contains installs and some in-app events. Some in-app events are missing.
  1. Do you send events using S2S? If so, verify that Record in-app events sent by server-to-server API is on. 
    • Go to Configuration > SKAdNetwork settings. 
  2. In some cases, due to Apple iOS thresholds, postbacks are sent without a conversion value or publisher ID. This means installs are recorded without in-app events. Inspect your postback raw data to see if this is the case. 
Geo (country) locations are misleading [Updated August 1, 2021]  Currently Geo (country) data is derived from the device IP address. In many cases, this address is the proxy address of an Apple Server and the geo information provided is misleading.

Timing from app install until dashboard update

Timer element Description Range (hours)
Measurement window
  • [Default] Measurement window countdown timer: 24 hours
  • During the measurement window, AppsFlyer sets the conversion value
  • The countdown begins with the first app open
SKAdNetwork timer 
  • Countdown timer: 24 hours
  • Each time the conversion value is set, the timer is reset. Means start counting down from 24 hours.
  • Maximum value of measurement window + SKAdNetwork timer: 48 hours.
SKAdNetwork random delay timer Random postback delay time: 0–24 hours 0-24
AppsFlyer processing Postbacks received on a given day are processed at the end of the day starting at 00:01 on the following day. The data is available 8 hours later on the next day. Average delay of 20 hours. For example, a postback received on Monday is processed on Tuesday. The dashboard updates by 08:00 UTC.  8-32
Summary The average time elapsed from app open to data in the dashboard: 68 hours.  32–104

Organic metrics in the context of SKAdNetwork

Organic metrics in the SKAdNetwork dashboard are calculated using the following mechanism:

  • Apple SKAdNetwork sends postbacks relating to users who install after engaging with a media source. This provides the non-organic metrics. 
  • AppsFlyer traditional dashboard contains metrics of all installs irrespective of source. 
  • Using this data organic metrics are calculated as A-B where: 
    • A = Total of all users based on the traditional overview dashboard
    • B = Non-organic users as reported by SKAdNetwork postbacks

Caveat relating to Apple Search Ads: Installs brought by Apple Search Ads in the traditional dashboard are non-organic. However, in the context of SKAdNetwork, they form part of the organic metric. 

Traits and limitations

SKAdNetwork Solution traits and limitations
Trait Remarks 
Ad network access Ad networks are provided with postbacks

Not supported. This means that agencies mustn't enable ad networks running SKAdNetwork campaigns. Agency! Ask the advertiser to enable the Ad network don't do it yourself. 

Agency transparency N/A
Timezone UTC
Currency  USD
Organic data Based on SDK event data. For example, organic install metrics are calculated as follows: Data of all installs reported by the SDK less non-organic installs reported by SKAdNetworks.
Non-organic data Based on SKAdNetwork postbacks
Data freshness

Daily. Due to SKAdNetwork timing issues on average 68 hours (~3 days) after app open. Range: 32-104 hours. 

Historical data

Earliest date, availability of iOS 14 (September 16, 2020)

Team member access Available. According to account permissions
App clips App clips are attributed to organic in the SKAdNetwork dashboard. Use the Overview dashboard to view invocation media sources.

SKAdNetwork integrated partners

Partner list

Sending postbacks to integrated partners

AppsFlyer sends integrated partners postbacks relating to SKAdNetwork attribution. Take note of the various options and requirements in the table that follows

Subject Description

Transaction ID sharing

Action required: Check with the integrated partner if they require the transaction ID and configure the setting accordingly.

AppsFlyer sends the attributed ad network partner postbacks. Meaning the decoded postbacks, not a copy of the SKAdNetwork postback received from iOS. These postbacks contain decoded conversion value data relating to the install and associated in-app event data of actions performed by the user during the measurement window.

Because the transaction ID can be used to decode your Conversion Value, we don't share it without your permission. 

Transaction ID sharing

Advertisers enable transaction ID sharing as follows: In AppsFlyer, go to Configuration > Integrated Partners > select a partner > Integration tab > Data sharing.

In-app event mapping verification

Was this article helpful?