Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2025 App Store, Distribution & MarketingApp Services

WWDC25 · 24 min · App Store, Distribution & Marketing / App Services

What’s new in AdAttributionKit

Learn about new features in AdAttributionKit, including how to measure overlapping reengagement conversions and customize ad attribution rules for your app. Gain insight on a new postback property you can use to measure the success of ad campaigns across countries and regions. We’ll also demonstrate new functionality and best practices for testing your AdAttributionKit implementation. To get the most out of this session, we recommend first watching “Meet AdAttributionKit.”

Watch at developer.apple.com ↗

Transcript all transcripts

Chapters

  • 0:00 — Introduction
  • 3:23 — Measure overlapping conversion windows
  • 7:50 — Customize attribution rules
  • 14:46 — Receive geography data in postbacks
  • 18:12 — Test AdAttributionKit

Code shown on screen · 11 snippets

Function that retrieves a conversion tag from a URL swift · at 5:42 ↗
func retrieveConversionTag(fromURL url: URL) -> String? {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
        print("Could not get components for URL.")
        return nil
    }

    guard let queryItems = components.queryItems else {
        print("URL does not contain query items.")
        return nil
    }

    for item in queryItems {
        guard item.name == Postback.reengagementOpenURLParameter else {
            continue
        }
        return item.value
    }
    return nil
}
Function that updates conversion value using a conversion tag swift · at 6:55 ↗
func updateConversionValue(_ conversionValue: Int, conversionTag: String) async {
    do {
        let update = PostbackUpdate(fineConversionValue: conversionValue,
                                    lockPostback: false,
                                    conversionTag: conversionTag)
        try await Postback.updateConversionValue(update)
    }
    catch {
        print("An error occurred while updating the conversion value: \(error)")
    }
}
Example Info.plist for configuring attribution window json · at 9:32 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionWindows": {
      "com.example.adNetwork": {
        "install": {
          "click": 2,
          "view": 1
        }
      }
    }
 }
Example Info.plist for configuring attribution window json · at 9:58 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionWindows": {
      "com.example.adNetwork": {
        "install": {
          "click": 2,
          "view": 1
        }
      }
    }
 }
Example Info.plist for configuring attribution window json · at 10:14 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionWindows": {
      "com.example.adNetwork": {
        "install": {
          "click": 2,
          "ignoreInteractionType": "view"                     
        }
      }
    }
 }
Example Info.plist for configuring attribution window json · at 10:30 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionWindows": {
      "global": {
        "install": {
          "view": 3
        }
      }
      "com.example.adNetwork": {
        "install": {
          "click": 5,
          "ignoreInteractionType": "view"
        }
      }
    }
 }
Example Info.plist for configuring attribution window json · at 11:05 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionWindows": {
      "global": {
        "install": {
          "view": 3
        }
      }
      "com.example.adNetwork": {
        "install": {
          "click": 5,
          "ignoreInteractionType": "view"
        }
      }
    }
 }
Example Info.plist for configuring attribution cooldown json · at 13:52 ↗
{
  "AdAttributionKitConfigurations": {
    "AttributionCooldown": {
      "install-cooldown-hours": 6"reengagement-cooldown-hours": 1
    {
  }
}
Example install verification token payload json · at 16:02 ↗
{"iss": 13421973,
  "iat": 1745255692,
  "iid": "34890933",
  "vid": "46392455",
  "aud": "AppleDownloadVerification-v1",
  "bid": "com.example.marketplace",
  "dtype": "download",
  "nonce": "9BC2C5CC-A1F8-4F93-9D6A-4D524685B67E"
}
Example install verification token payload json · at 16:26 ↗
{"iss": 13421973,
  "iat": 1745255692,
  "iid": "34890933",
  "vid": "46392455",
  "aud": "AppleDownloadVerification-v1",
  "bid": "com.example.marketplace",
  "dtype": "download",
  "nonce": "9BC2C5CC-A1F8-4F93-9D6A-4D524685B67E",
  "ccode": "MT"
}
Example postback with country code json · at 17:05 ↗
{
   "ad-interaction-type": "click",
   "jws-string": "eyJraWQiOiJhcHBsZS1jYXMtaWRlbnRpZmllci8wIiwiYWxnIjoiRVMyNTYifQ.eyJhZHZlcnRpc2VkLWl0ZW0taWRlbnRpZmllciI6Njg0OTM5LCJjb252ZXJzaW9uLXR5cGUiOiJyZS1lbmdhZ2VtZW50IiwibWFya2V0cGxhY2UtaWRlbnRpZmllciI6ImNvbS5hcHBsZS5BcHBTdG9yZSIsImFkLW5ldHdvcmstaWRlbnRpZmllciI6InRlc3QuYWRhdHRyaWJ1dGlvbmtpdCIsImltcHJlc3Npb24tdHlwZSI6ImFwcC1pbXByZXNzaW9uIiwicG9zdGJhY2stc2VxdWVuY2UtaW5kZXgiOjAsInNvdXJjZS1pZGVudGlmaWVyIjoiODM0NCIsImRpZC13aW4iOnRydWUsInBvc3RiYWNrLWlkZW50aWZpZXIiOiIzZjUwZmU1Ny0yOWFlLTQ4NjEtOGMwYi1hYzZhZGRkZmY3MmMiLCJwdWJsaXNoZXItaXRlbS1pZGVudGlmaWVyIjo1ODM4NDkyfQ.AemK1x2ahIPKOnFEEscG4wvipRtR1G6DzpNF4M4joPb8POIH4FJjm4VvcNgLXc9rWBrEDQPvDblduoc7MFcK5w",
   "coarse-conversion-value": "medium",
   "country-code": "MT"
}

Resources