INTRODUCTION

What is SKAdNetwork?

SKAdNetwork, and the IDFA changes in iOS 14.5, 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. Most of the advertisers already decided not even to ask the users for permission. 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 Koneo work with SKAN (SKAdNetwork)?

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

  • Koneo 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.
  • Koneo can forward any postback to another platform such as a MMP or any other 3rd party. Each SKAdNetwork entry you set up in Koneo 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:

  • the conversion will be fired in Koneo directly when receiving the postback, or,
  • the conversion is relayed through a 3rd party that fires a conversion to Koneo’s tracking platform.

GETTING STARTED

How to Prepare on the Network/Advertiser side

Register with Apple for a SKAdNetwork ID. Each App ID can have one SKAdNetwork ID. Before you can request an SKAdNetwork ID you have to create an Apple Developer account. Time delay for SKAdNetwork ID setup is about 3 months+.

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 Koneo Mobile, it could be a MMP or another platform.

If Koneo Mobile is to receive the postback, the URL will look like this with your conversion domain plugged in. Apple requires an SSL/TLS postback domain. Koneo supports you with an SSL certificate for free:

https://[koneo-network-conversion-domain]/api/skan/pb

**IMPORTANT** The domain used here must stay clean, and it should not be a domain that is used to send impressions or clicks to Koneo (tracking domain). Please consider registering a new domain for this purpose. We can for sure support you with the whole communication and setup!

How to Prepare on the Publisher side

**IMPORTANT** Every potential publishing app needs to add the Koneo Mobile 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/traffic partners to figure out how their SKAdNetwork IDs will be listed.

Koneo Mobile SKAdNetworkID: bxvub5ada5.skadnetwork

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 Koneo Mobile supports the ad signing process, and your publishers/traffic partners will be able to work directly with our platform to sign the ad. More details below.

Koneo Mobile’s SKADNetwork Signed Ad API: https://skadnetwork.koneomobile.com/api/skan/sign

ATTRIBUTION FLOW AND 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.

Diagram showing a user tapping an ad for app B inside of app A, then installing and launching app B, which triggers a conversion notification after app B calls one of two methods, and after the timer expires. The ad network receives the postback which it must verify.

Source: Apple

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-2-server mechanism to Koneo Mobile.

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

How does Apple’s SKAdNetwork Postback work?

Below is the payload that Apple will be firing to the endpoint (https://skadnetwork.koneomobile.com/api/skan/pb) that was configured previously.

Click here for Apple’s official documentation.

{
 "version" : "2.2",
 "ad-network-id" : "com.example",
 "campaign-id" : 31,
 "transaction-id" : "gh56g2-83je-txa8-ktr82lou20lx",
 "app-id" : 862719275,
 "attribution-signature" : "MEYCIQDTuQ1Z4Tpy9D3aEKbxLl5J5iKiTumcqZikuY/AOD2U7QIhAJAaiAv89AoquHXJffcieEQXdWHpcV8ZgbKN0EwV9/sY",
 "redownload": true,
 "source-app-id": 123456789,
 "fidelity-type": 1,
 "conversion-value": 20,
}

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: Koneo Mobile SKAdNetwork ID.

campaign-id: The campaign ID that generated during the signing process to attribute the postback  to your media partner.

transaction-id: A unique identifier generated by Apple which Koneo Mobile and the MMP will use to dedupe redundant postbacks.

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

attribution-signature: Apple’s attribution signature that Koneo Mobile and the MMP 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. Here the advertisement got displayed.

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.

Koneo Additional Information:

ip: Can be overridden by the sender of the Apple postback. The third party that is forwarding the postback to Koneo Mobile can enrich the postback by adding the „ip“ parameter in the JSON. If it is not present when the postback is received, Koneo Mobile 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 Koneo Mobile can enrich the postback by adding the „user-agent“ parameter in the JSON. If it is not present when the postback is received, Koneo Mobile 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 Koneo Mobile can enrich the postback by adding the „timestamp“ parameter in the JSON. If it is not present when the postback is received, Koneo Mobile 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 tracking links are not used, and Apple actively forbids fingerprinting, 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 Koneo Mobile. For details on setting up server-side clicks – „Click Here“

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

The user_agent and user_ip need to be sent with the server-side click to Koneo Mobile, and Koneo Mobile will fire that click to the MMP. Using the IP and User Agent, the MMP will be able to provide fingerprinting attribution on the user to determine the conversion event.

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

Please note Koneo Mobile also supports server-side tracking for impressions via the view-through mechanism. For more information on this – „Click Here“


PUBLISHER AD SIGNING

Publisher Ad Signing Process Explained

To show the ad to the iOS user and initiate the attribution process with Apple, the publisher will need to have access to the unique signature associated with the ad details. Koneo Mobile supports this signature process and will be able to work directly with your publishers/traffic sources.

Find your Source App IDs. The source_app_identifier refers to the integer portion of the App Store ID.

Snapchat – https://apps.apple.com/us/app/snapchat/id447188370

Starbucks – https://apps.apple.com/us/app/starbucks/id331177714

Koneo Mobile’s SKADNetwork Signed Ad API: https://skadnetwork.koneomobile.com/api/skan/sign

Parameters Definition Value Required
campaign_id Koneo Mobile CampaignID 1234 (integer) Yes
publisher_id Your Koneo Mobile PublisherID 1234 (integer) Yes
api_key Each request has to be verified with your Koneo Mobile Publisher API Key 1234 (integer) Yes
source_app_id App ID which shows ads. example: 331177714 1234 (integer) Yes
version SKAdNetwork Version. For view-through ads, use version 2.2 and later. example: 2.2 2.0 (integer) Yes
fidelity_type For view-through ads, use a fidelity type value of the number 0
example: 1
1 (integer) No

Example API request:

https://skadnetwork.koneomobile.com/api/skan/sign?api_key=09174276123497162346&campaign_id=2342344&publisher_id=322&source_app_id=447188370&version=2.2&fidelity_type=0,1

Once you request an ad from this endpoint, you will receive a signed signature with offer details (if you’re approved to run the offer, otherwise it will return an error).

Sample Output

SUCCESS

{
“signature”: “MDUCGQDRQ5oULC1eU2jP4N4vW/oQf8vZRn-4SJOYCGGghVyXyif1ghdmWrv7i488toP+74WddLQ==”,
“campaign_id”: 1,
“ad_network_id”: “bxvub5ada5.skadnetwork”,
“nonce”: “d2a36e64-625d-48c1-a61e-dd8de0dac7a7”,
“timestamp”: 1612212887,
“source_app_id”: “447188370”,
“dest_app_id”: “1132762804”,
“version”: “2.0”
}

SUCCESS

[ { 
“click”: { 
   “signature”: “MDUCGQDvxV416PfMjZ4QzjJR68Dg0JdTtInSmn8CGFUC+iGffC1zeD6Av+Z0xWM2WSaISCioug==”, 
   “campaign_id”: 1, 
   “ad_network_id”: “bxvub5ada5.skadnetwork”, 
   “nonce”: “d2a36e64-625d-48c1-a61e-dd8de0dac7a7”, 
   “timestamp”: 1612296401, 
   “source_app_id”: “447188370”, 
   “dest_app_id”: “1132762804”, 
   "fidelity_type": 1,
   “version”: “2.2” 
} }, 
{ 
“view”: { 
   “signature”: “MDUCGQD+Oui5L2hWsff1zJ3amT1r7nP2RDTUwtsCGAnz8OwCRE6Q0bJzjBDr1+zpCl6+6i5uJg==”, 
   “campaign_id”: 1, 
   “ad_network_id”: “bxvub5ada5.skadnetwork”, 
   “nonce”: “d2a36e64-625d-48c1-a61e-dd8de0dac7a7”, 
   “timestamp”: 1612296401, 
   “source_app_id”: “447188370”, 
   “dest_app_id”: “1132762804”, 
   "fidelity_type": 0,
   “version”: “2.2” 
} } ]

ERROR

{ 
“success”: false,
“errors”: [ { 
     “message”: “Request did not pass all the rules”, 
     “code”: 11025 } ], 
“hostname”: “4316bc75f86e” 
}
Field Description
signature Generated signature by Apple’s requirements for 2.0 and 2.2 versions OR for 1.0 version using input values
example: MDUCGQDRQ5oULC1eU2jP4N4vW/oQf8vZRn-4SJOYCGGghVyXyif1ghdmWrv7i488toP+73WddLQ==
campaign_id campaign-id: value from 1 to 100
Not the same as input campaign_id
example: 30
ad_network_id String in format XXX.skadnetwork
It’s given by Apple for authorized networks
example: abcdef.skadnetwork
nonce Random value in UUID format
example: 123e4567-e89b-12d3-a456-426614174000
timestamp Unix timestamp
example: 1616576168
dest_app_id Apple’s app ID with “id“ prefix cut
example: 331177714
source_app_id Apple’s source app ID (the same as input parameter)
example: 331177714
fidelity_type Fidelity type (the same as input parameter)
example: 1
version SKAdNetwork Version (the same as input parameter)
example: 2.2