iOS 14 SKAdNetwork

iOS 14 SKAdNetwork Support for DSPs

Overview

With Apple’s announcement on June 24, 2020, DSPs must utilize Apple’s privacy-conscious SKAdNetwork framework for install and conversion tracking on iOS 14+ devices. Smaato adds support for SKAdNetwork attribution in its SDK, along with the required bid request and response signals.

For display, the following click redirect methods are supported:
<a href>, mraid.open(), window.open(), and window.location.
Redirects (e.g., HTTP status 3xx) will be followed in the above methods for Display, Native, and Video ad formats.

📘

Important:

When you register for an SKAdNetwork ID, Apple provides an ID with capitalized letters.
You must pass this ID in lowercase to Smaato and use it consistently (e.g., when generating a click signature).
Apple requires a lowercased identifier to send a postback notifying you of an install conversion.

Steps for DSPs to Enable SKAdNetwork Attribution

  1. Register as an Ad Network with Apple’s SKAdNetwork API.
  2. Supply your public key to Apple and configure your postback URLs.
  3. Provide your SKAdNetwork ID to your Smaato Account Manager.
  4. Smaato will add your SKAdNetwork ID(s) to publishers’ Info.plist.
  5. DSPs must ingest the list of SKAdNetwork IDs, version, and source bundle ID from the BidRequest.imp.ext.skadn object in the bid request.
  6. If responding with an SKAdNetwork-enabled campaign, include the SKAdNetwork ID and all relevant fields in the bid response.
  7. The advertiser app must register new users using registerAppForAdNetworkAttribution().
  8. DSPs should operate an install tracking service to process install data and SKAdNetwork postback signatures.

SKAdNetwork Attribution Workflow

Bid Request

Object: BidRequest.imp.ext.skadn

This object will be populated if all of the following are true:

  • The DSP has at least one SKAdNetwork ID registered in the publisher’s Info.plist
  • The user’s device runs iOS 14+
  • The application is integrated with a SKAdNetwork-supported Smaato SDK version
  • The DSP uses OpenRTB 2.4 or higher
AttributeDescriptionTypeExample
versionsArray of supported SKAdNetwork versions ("2.0" or higher)array of strings"versions": ["2.0", "2.1", "2.2", "3.0", "4.0"]
versionVersion of SKAdNetwork supported (deprecated in favor of versions)string"version": "2.0"
sourceappID of the publisher app in Apple’s App Store (matches app.bundle)string"sourceapp": "880047117"
skadnetidsSubset of SKAdNetworkItem entries from the publisher app’s Info.plist (lowercase)array of strings"skadnetids": ["cdkw7geqsh.skadnetwork", "qyjfv329m4.skadnetwork"]
skadnetlistObject containing the IABTL list definitionobject"skadnetlist": { "max": 306, "excl": [2, 8, 10, 55] }
productpageCustom Product Page flag (see Apple’s docs)integer"productpage": 1
extExchange-specific extensionsobject"ext": {}

Object: BidRequest.imp.ext.skadn.skadnetlist

AttributeDescriptionTypeExample
maxMaximum entry ID for IABTL SKAdNetwork listinteger"max": 306
exclList of excluded IABTL registration IDsarray of integers"excl": [44, 14, 18]
addlAdditional SKAdNetwork IDs (not in shared list, lowercase)array of strings"addl": ["cdkw7geqsh.skadnetwork", "qyjfv329m4.skadnetwork"]
extExchange-specific extensionsobject"ext": {}

Example Bid Request

Used for direct SSP to DSP connections where a DSP wants to only consume their own relevant SKAdNetwork IDs.

{
  "imp": [
    {
      "ext": {
        "skadn": {
          "versions": ["2.0", "2.1", "2.2", "3.0", "4.0"],
          "sourceapp": "880047117",
          "productpage": 1,
          "skadnetlist": {
            "max": 306,
            "excl": [2, 8, 10, 55],
            "addl": [
              "cdkw7geqsh.skadnetwork",
              "qyjfv329m4.skadnetwork"
            ]
          }
        }
      }
    }
  ]
}

 

Changes in Bid Request Device Object

If the user does not grant tracking permission through the AppTrackingTransparency framework:

  • IDFA will not be passed.
  • IDFV and an exchange-generated device identifier will be provided (usable only for fraud prevention and frequency capping).
AttributeDescriptionTypeExample
device.ifaIDFA (only if user grants permission)string"ifa": "F52329FE-DAB6-11EA-87D0-0242AC130003"
device.ext.ifvUnique device ID for publisher usestring"ifv": "A9F6BDD8-3343-4E6D-A283-F98986880335"
device.ext.attsApp tracking authorization status (0–3)integer"atts": 3"
user.idExchange-defined user ID (valid for 24h per app)string"id": "F4EE2B2D-1B0E-4BA9-8471-28E9ED8FB95C"

Bid Response

Object: BidResponse.seatbid.bid.ext.skadn

When the bid request includes an SKAdNetwork extension object, DSPs must return a response with the following fields to enable SKAdNetwork install and conversion attribution.

AttributeDescriptionTypeExample
versionVersion of SKAdNetwork (must be "2.0+")string"4.0"
networkSKAdNetwork ID (matches one in request)string"cdkw7geqsh.skadnetwork"
sourceidentifierFour-digit Source ID (SKAdNetwork 4.0+)string"4321"
campaignCampaign ID (1–100), used pre-4.0string"45"
itunesitemAdvertiser app IDstring"123456789"
productpageidCustom Product Page IDstring"45812c9b-c296-43d3-c6a0-c5a02f74bf6e"
fidelitiesArray of fidelity objects for SKAdNetwork 2.2+array of objectssee below
nonceUnique ID per ad response (deprecated in 2.2+)string"473b1a16-b4ef-43ad-9591-fcf3aefa82a7"
sourceappPublisher app IDstring"880047117"
timestampUnix timestamp at signing (deprecated in 2.2+)string"1594406341232"
signatureSKAdNetwork signaturestring"MEQCIEQlmZRNfYzK..."
extExchange-specific extensionsobject"ext": {}

Object: BidResponse.seatbid.bid.ext.skadn.fidelities

Fields that should have different values for the different fidelity types (e.g. fidelity, nonce, signature) are wrapped into an array of objects.

📘

Note:

Adding timestamp to this list allows bidders to parallelize the cryptography portions of creating their bid response when supporting multiple fidelities. The same timestamp can be used across fidelities if desired but this move provides bidders with greater implementation flexiblity.

AttributeDescriptionTypeExample
fidelityAttribution fidelity typeinteger"fidelity": 0
nonceUnique ID per ad responsestring"473b1a16-b4ef-43ad-9591-fcf3aefa82a7"
timestampUnix timestamp used for signaturestring"1594406341"
signatureSKAdNetwork signaturestring"MEQCIEQlmZRNfYzK..."
extExchange-specific extensionsobject"ext": {}

Example v4.0

{
  "seatbid": [
    {
      "bid": [
        {
          "ext": {
            "skadn": {
              "version": "4.0",
              "network": "cdkw7geqsh.skadnetwork",
              "sourceidentifier": "4321",
              "itunesitem": "123456789",
              "sourceapp": "880047117",
              "productpageid": "45812c9b-c296-43d3-c6a0-c5a02f74bf6e",
              "fidelities": [
                {
                  "fidelity": 0,
                  "signature": "TUVRQ0lFUWxtWlJOZll6S0JTRThRbmhMVElIWlpaV0NGZ1pwUnFSeEhzczY1S29GQWlBSmdKS2pkcldka0xVT0NDanVFeDJS==",
                  "nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
                  "timestamp": "1594406341"
                },
                {
                  "fidelity": 1,
                  "signature": "VFVWUlEwbEZVV3h0V2xKT1psbDZTMEpUUlRoUmJtaE1WRWxJV2xwYVYwTkdaMXB3VW5GU2VFaHpjelkxUzI5R1FXbEJTbDBG==",
                  "nonce": "e650de09-2a9f-4dc3-a4d1-544c402e9095",
                  "timestamp": "1594406342"
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

Example v2.2

{
  "seatbid": [
    {
      "bid": [
        {
          "ext": {
            "skadn": {
              "version": "2.2",
              "network": "cdkw7geqsh.skadnetwork",
              "campaign": "45",
              "itunesitem": "123456789",
              "sourceapp": "880047117",
              "productpageid": "45812c9b-c296-43d3-c6a0-c5a02f74bf6e",
              "fidelities": [
                {
                  "fidelity": 0,
                  "signature": "MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg==",
                  "nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
                  "timestamp": "1594406341"
                },
                {
                  "fidelity": 1,
                  "signature": "GRlMDktMmE5Zi00ZGMzLWE0ZDEtNTQ0YzQwMmU5MDk1IiwKICAgICAgICAgICAgICAgICAgInRpbWVzdGTk0NDA2MzQyIg==",
                  "nonce": "e650de09-2a9f-4dc3-a4d1-544c402e9095",
                  "timestamp": "1594406342"
                }
              ]
            }
          }
        }
      ]
    }
  ]
}

Example v2.0

{
  "seatbid": [
    {
      "bid": [
        {
          "ext": {
            "skadn": {
              "version": "2.0",
              "network": "cdkw7geqsh.skadnetwork",
              "campaign": "45",
              "itunesitem": "123456789",
              "nonce": "473b1a16-b4ef-43ad-9591-fcf3aefa82a7",
              "sourceapp": "880047117",
              "timestamp": "1594406341232",
              "signature": "MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg=="
            }
          }
        }
      ]
    }
  ]
}