SKAdNetwork Guide

How to prepare and set up your platform for tracking using Apple's SKAdNetwork framework.

Genny avatar
Written by Genny
Updated over a week ago

Updated - Hotfix 3.2.0 (April 2023): Source-identifier now supported for SKAN 4.0. [Click Here]


**PLEASE NOTE: This guide will be updated as the situation evolves with the different partners. Please reach out to our support team if you have any questions regarding the SKAdNetwork implementation.


TABLE OF CONTENTS

INTRODUCTION

GETTING STARTED

ATTRIBUTION FLOWS AND CHALLENGES

ATTRIBUTION METHODS

TESTING YOUR INTEGRATION

FAQ

GLOSSARY


INTRODUCTION

What is SKAdNetwork?

SKAdNetwork, and the iOS 14 release, fundamentally changes how attribution is done in the mobile performance marketing space. Specifically, as it relates to the following:

IDFA (the iOS Advertising Device ID) - Usage now requires explicit user consent and the opt-in rates are expected to be very low (AdXChanger). This effectively ends the IDFA as a reliable identifier of users.

Attribution - Apple is effectively taking attribution in-house in an effort to ensure user privacy. User clicks will no longer be routed through any third party attribution provider (MMP).

How does Everflow work with SKAN (SKAdNetwork)?

The main goal behind Everflow’s SKAN solution is to provide a flexible way for networks to handle attribution. Here are some key points that allow Everflow to handle attribution in the wake of Apple's restrictions.

  1. Everflow is agnostic of the origin of the attribution postback received. As long as the postback satisfies the format imposed by Apple, it is considered a SKAN attribution postback.

  2. Everflow can forward any postback to another platform such as a MMP or any other 3rd party. Each SKAdNetwork entry you set up in Everflow has an unlimited number of 3rd party postbacks that can be fired. Furthermore, 3rd party postbacks can be enriched with parameters that are required by MMPs.

You can choose whether:

  1. the conversion will be fired in Everflow directly when receiving the postback, or,

  2. the conversion is relayed through a 3rd party that fires a conversion to Everflow.


GETTING STARTED

How to Prepare on the Network side

  • Register with Apple for a SKAdNetwork ID. Each App ID can have one SKAdNetwork ID.

  • Create a pair of Keys: Public & Private. Follow Apple’s documentation for generating your SKAdNetwork’s key pair. Your Public Key is to be shared with Apple when registering with a SSP/Publisher. Your Private Key encodes unique values about the conversion such as Campaign IDs and timestamp.

  • Decide which platform will receive the SKAdNetwork validation postback. While we strongly recommend pointing the postback to Everflow, it could be a MMP or another platform.

If Everflow is to receive the postback, the URL will look like this with your conversion domain plugged in:

https://[everflow-network-conversion-domain]/api/skad

**IMPORTANT** The domain used here must stay clean, and it should not be a domain that is used to send impressions or clicks to Everflow (tracking domain). Please consider registering a new domain for this purpose.

How to Prepare on the Publisher side

**IMPORTANT** Every potential publishing app needs to add the SKAdNetwork ID to its app’s information property list (Info.plist) in order for attribution to work. In other words, you must establish a dialog with all publishers to figure out how their SKAdNetwork IDs will be listed.

In addition to the Ad itself, the Publishing App needs to have access to the signature executed by combining the relevant attribution information (SKAdNetwork ID, Campaign ID, Source ID, etc.) and signing it with the SKAdNetwork’s Private Key.

Please note that Everflow supports the ad signing process, and your publishers will be able to work directly with our platform to sign the ad. More details below.


ATTRIBUTION FLOW & CHALLENGES

High-level Flow

  1. User sees the Ad.

  2. Optional - An impression can be fired server-side to Everflow.

  3. User clicks on the Ad.

  4. A click is fired server-side to Everflow.

  5. User is directed to the App Store.

  6. User installs the App.

A tracking link is NOT used to send the user to the App Store. Apple tracks the activity via the parameters passed at the time of the click/impression, and authenticity is guaranteed via the signatures and the encoded values. Since a tracking link is not used, the publisher will have to fire the click (and optionally, the impression) via a server-side mechanism to Everflow.

Apple can take up to 24 hours to fire the postback. The postback from Apple is triggered from the user's device. Once the postback is received by Everflow (or another platform), it will be verified using Apple’s Public Key.

Apple's SKAdNetwork Postback Explained

Below is the payload that Apple will be firing to the endpoint (https://[everflow-network-conversion-domain]/api/skad) that was configured previously.

For Apple's official documentation - [Click Here]

{

"version" : "2.2",

"ad-network-id" : "com.example",

"campaign-id" : 42,

"transaction-id" : "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",

"app-id" : 331177714,

"attribution-signature" : "MEYCIQDTuQ1Z4Tpy9D3aEKbxLl5J5iKiTumcqZikuY/AOD2U7QIhAJAaiAv89AoquHXJffcieEQXdWHpcV8ZgbKN0EwV9/sY",

"redownload": true,

"source-app-id": 447188370,

"fidelity-type": 1

"conversion-value": 20

"ip": "172.16.254.1",

"user-agent": "App Store",

"timestamp": 16167009651254

}

version: The version of the ad network validation API. The latest is 2.2 and it will be incremented as Apple introduces new features.

ad-network-id: Your SKAdNetwork ID.

campaign-id: The campaign ID that you will attribute to your media partner.

transaction-id: A unique identifier generated by Apple which Everflow will use to dedupe redundant postbacks.

app-id: The iOS app identifier of the advertiser.

attribution-signature: Apple’s attribution signature that Everflow will use to verify the validity of the postback.

redownload: A flag that indicates the customer redownloaded and reinstalled the app.

source-app-id: The iOS app identifier of the publisher.

source-identifier: Can be used instead of campaign-id in SKAN 4.0 only. If the source-identifier does not match a campaign, it will result in an error.

fidelity-type: Indicates whether the install was generated via an impression or a click.

conversion-value: A number between 0 and 63 that the advertiser will use to indicate the different actions taken by the user within the app.

ip: Can be overridden by the sender of the Apple postback. The third party that is forwarding the postback to Everflow can enrich the postback by adding the "ip" parameter in the JSON. If it is not present when the postback is received, Everflow will assign based on the actual http request.

user-agent: Can be overridden by the sender of the Apple postback. The third party that is forwarding the postback to Everflow can enrich the postback by adding the "user-agent" parameter in the JSON. If it is not present when the postback is received, Everflow will assign based on the actual http request.

timestamp: Can be overridden by the sender of the Apple postback. The third party that is forwarding the postback to Everflow can enrich the postback by adding the "timestamp" parameter in the JSON. If it is not present when the postback is received, Everflow will assign based on the actual http request. Must be in either 10-digit epoch UNIX or 13-digit epoch timestamp format.

Challenge #1 : Impression and Click attribution

Because of Apple's regulations and tracking links are not used, tying a conversion to a click is not possible when advertisers strictly use the SKAdNetwork framework.

To solve this, the publishing platform will need to fire server-side clicks to Everflow. For details on setting up server-side clicks - [Click Here]

Server-Side Click’s Journey: Publisher Parallel Click > Everflow > MMP

The user_agent and user_ip need to be sent with the server-side click to Everflow, and Everflow will fire that click to the MMP. Using the IP and User Agent, the MMP will be able to attribute the user to the conversion event.

By implementing the use of server-side clicks, campaign-level metrics such as CVR will still be accessible in Everflow.

Please note Everflow also supports server-side tracking for impressions via the view-through mechanism. For more information on this - [Click Here]

Challenge #2: Limited number of campaign/conversion values

The SKAN method limits the number of values that can be used by one SKAdNetwork. This limitation will affect both the number of sources and the number of events that can be handled.

Here is a brief summary of these thresholds and how this can be configured in Everflow.

  1. Every SKAdNetwork ID can have up to 100 Campaign IDs. Think of these like Sub ID (sub1-5) values. Campaign IDs are created in Apple. You must map the Campaign ID to the Offer, Partner or Offer/Partner combination in Everflow.

  2. Every SKAdNetwork ID can have up to 64 Conversion Value IDs. These are Events. Conversion Value IDs are created in Apple. You must map the Conversion Value ID to an Offer or Advertiser-level Event in Everflow.

  3. Source IDs can be configured at the Partner level in order to associate a Partner with one or more Source ID(s).


ATTRIBUTION METHODS

Everflow only

Without an attribution partner, the integration only requires that postbacks are sent to Everflow.

  • The minimal setup will look like this:

  • In this case, attribution will be determined only based on the mapping configured in Everflow.

MMPs

If you choose to go with an external attribution partner (MMP), some additional steps are required to configure in Everflow. For most MMP integrations, the process is as follows:

  • Everflow receives the original conversion postback from Apple. The postback is not generating a conversion. Please note that the option to skip conversion processing is available in the SKAdNetwork configuration.

  • The postback is forwarded to the MMP after being enriched with their required macros. You can map these macros to parameters using 3rd party postbacks in Everflow.

  • With the data the MMP receives, it maps attribution to Everflow entities (i.e. event_id or affiliate_id).

  • Using either the regular conversion endpoint or dedicated SKAN advertiser endpoint in Everflow, the MMP fires a postback that will register a clickless conversion.

  • In order to provide the MMP with the required information, Everflow offers the following macros for enriching the initial Apple postback. To map these in Everflow, navigate to Advertisers - App Attribution > Third Party Postbacks.

Everflow Macro Parameter

Description

{external_campaign_id}

Configurable in App Attribution > Campaign > External Campaign ID field

{external_campaign_name}

Configurable in App Attribution > Campaign > External Campaign name field

{ip}

The ip from which we received the Apple postback

{user_agent}

The user agent from which we received the Apple postback

{timestamp}

The time Everflow received the postback (10-digit epoch UNIX timestamp)

Below is an overview for how Everflow enriches the original Apple postback for each partner based on their requirements.

Adjust

For Adjust documentation - [Click Here]

Adjust Parameter

Everflow Macro

adjust-tracker

No macro, needs to be hardcoded

adjust-campaign-id​

{external_campaign_id}

adjust-campaign

{external_campaign_name}

adjust-adgroup​

adjust-adgroup​-id

N/A

adjust-creative

adjust-creative-id

N/A

user-agent

{user_agent}

ip-address​

{ip}

timestamp

{timestamp}

Appsflyer

For Appsflyer documentation - [Click Here]

Appsflyer requires the following parameters to be enriched in the received SKAdNetwork postback, so be sure to append these to the URL above:

Appsflyer Parameter

Everflow Macro

ad-network-campaign-id

{external_campaign_id}

ad-network-campaign-name

{external_campaign_name}

ad-network-adset-id

N/A

ad-network-ad-name

ad-network-ad-id

N/A

ip

{ip}

timestamp

{timestamp}

For additional parameters and more information - [Click Here]

  • Once Appsflyer has processed the SKAdNetwork postback, they will fire at least one postback to Everflow. Depending on the conversion value(s) set by the advertiser app, any number of installs or events may be fired.

  • You will need to enter your Endpoint Address. Use the following, making sure to replace the domain placeholder with your own tracking domain:

https://www.TRACKING_DOMAIN.com/api/skad/advertiser/appsflyer?skan_campaign_id={skad_campaign_id}&skan_transaction_id={transaction_id}&skan_redownload={redownload}&mlc_timestamp={skad_ad_network_time}&mlc_campaign={campaign}&mlc_campaign_id={campaign_id}&af_nonce={af_skad_nonce}&af_app_id={app_id}&af_site_id={site_id}&af_country={country}&af_currency={currency}&af_revenue={revenue}&af_event_name=install&af_install_time={install_time}&af_attribution_source=skadnetwork&af_ambiguous_event={skad_ambiguous_event}&event_id={event_id}

Please reach out to your Appsflyer advertiser to understand how the conversion values will be mapped to your Everflow events.

Please note this will only work if you have only one SKAd ID configured in Everflow.

Branch

For Branch documentation - [Click Here]

Branch Parameter

Everflow Macro

partner-campaign-id

{external_campaign_id}

partner-campaign-name

{external_campaign_name}

ip-address

{ip}

user-agent

{user_agent}

  • Once Branch has processed the SKAdNetwork postback, they will fire at least one postback to Everflow. Depending on the conversion value(s) set by the advertiser app, any number of installs or events may be fired.

  • You will need to enter your Postback Address in Branch. Use the following, making sure to replace the domain placeholder with your own tracking domain:


https://www.TRACKING_DOMAIN.com/api/skad/advertiser/branch?ad-network-id={ad-network-id}&campaign-id={campaign-id}&transaction-id={transaction-id}&app-id={app-id}&attribution-signature={attribution-signature}&redownload={redownload}&source-app-id={source-app-id}&conversion-value={conversion-value}&event_id={goal_id}

Please reach out to your Branch advertiser to understand how the conversion values will be mapped to your Everflow events.

Please note this will only work if you have only one SKAd ID configured in Everflow.

Kochava

For Kochava documentation - [Click Here]

Kochava Parameter

Everflow Macro

partner_campaign_id

{external_campaign_id}

partner_campaign_name

{external_campaign_name}

skad_ip

{ip}

skad_ts

{timestamp}

Singular

For Singular documentation - [Click Here]

Singular Parameter

Everflow Macro

adn_campaign_id

{external_campaign_id}

adn_campaign_name

{external_campaign_name}

adn_creative_id

adn_creative_name

N/A

adn_sub_campaign_id

adn_sub_campaign_ name

N/A

adn_sub_adnetwork_name

{affiliate_id}

skan_ip

{ip}

skan_timestamp

{timestamp}

More details to come on the postback integration between Singular and Everflow.


TESTING YOUR INTEGRATION

First, make sure you have:

  1. a SKAdNetwork ID

  2. the postback pointing to Everflow

  3. the SKAdNetwork ID / Campaign ID configured in Everflow

  4. a publisher willing to test

  5. an advertiser's app to install which is configured with SKAN

The publisher needs to have:

  1. added the SKAdNetwork ID to their info.plist

  2. the ability to call Everflow to sign the ad (Ask the customer success team for instructions)

(Optional) You would need to generate a fake postback in order to test between Everflow and the MMP to which you are firing installs.


FAQ

What is required to offer the ad signing process through Everflow?

When adding your SKAdNetwork settings to Everflow, you will need to provide your public and private key in order to enable the ad signing process. For more details on the ad signing mechanism - [Click Here]


GLOSSARY

Ad Signature

The proof of a published/clicked app's authenticity. The signature requires the Private Key of the SKAdNetwork as well as the ad’s parameters.

App-to-App

Refers to an advertisement for an app (listed in the App Store) and displayed by an app (as opposed to a web browser).

Campaign ID

From Apple: The ID you provided when displaying the ad, that matches

In Everflow, this parameter can be tied to any Offer, Partner or a combination of both.

Conversion Value

From Apple: An unsigned 6-bit value that the installed app provided by calling updateConversionValue(_:).

In Everflow, this parameter can be tied to one or more Events. This includes Base Conversions, Events and Advertiser-level Events.

Postback URL (per Apple setup)

This is a unique URL per SKAdNetwork and is set up with Apple (as opposed to the postbacks you can set up in Everflow to fire to 3rd parties). Each conversion registered by Apple will trigger a postback to this URL and will include the attribution parameters in the payload.

Please note: It is possible to use Everflow as the primary receiver by setting https://[everflow-network-conversion-domain]/api/skad to be used as the Postback URL.

SKAdNetwork’s Private Key

Encodes unique values about the conversion such as Campaign IDs and timestamp. This key is used at the time of the ad's impression/click, and needs to be stored securely.

SKAd Network’s Public Key

This is bound to the SKAdNetwork’s Private Key and can be used by Apple or another party to verify the authenticity of the ad click/impression signature and to guarantee that it rightfully matches the SKAdNetwork ID.

SKAd Network ID

The Network’s unique identifier that is registered in Apple.

In Everflow, you can set as many SKAN configurations as you have Network IDs.

Server-side Click

A click postback that is directed toward a server rather than a tracking link. It is necessary to use server-side clicks in the context of SKAN since the redirect is handled by Apple. For more about server-side clicks - [Click Here]

Source App ID

From Apple: The item identifier of the app that displayed the ad, that matches SKStoreProductParameterAdNetworkSourceAppStoreIdentifier or sourceAppStoreItemIdentifier.

In Everflow, it is possible to associate a Partner with multiple Source App IDs. This can be achieved by editing the Partner and adding the numerical IDs in the tab: iOS APP SOURCES.

Target App ID

The advertiser’s App in the context of App-to-App advertising.

View-through Attribution

SKAd Impression: A fidelity-type parameter in the SKAdNetwork postback, which indicates the type of touchpoint that led to a conversion: 0 indicates it was a view, and 1 means it was a click.

To determine which touchpoint deserves credit, Apple uses the latest touchpoint with the highest fidelity-type value. In other words, last touch attribution with priority given to a click vs. an impression.

Impression is only tracked if viewed for at least 3 seconds. Apple will only store 15 impression records at a time, deleting the oldest one.

Web-to-App (Mobile Web)

Refers to an ad for an app (listed in the App Store) and displayed by a mobile web browser (as opposed to an App).


Did this answer your question?