Measure ad effectiveness with privacy-preserving attribution using AdAttributionKit. Use when registering ad impressions, handling attribution postbacks, updating conversion values, implementing re-engagement attribution, configuring publisher or advertiser apps, or replacing SKAdNetwork with AdAttributionKit for ad measurement.
97%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Privacy-preserving ad attribution for iOS 17.4+. AdAttributionKit enables ad networks and advertisers to measure app installs and re-engagements across the App Store and alternative marketplaces without disclosing user-level identity.
Three distinct roles participate in attribution:
UIEventAttributionView or StoreKit overlays.Declare supported ad networks in Info.plist with lowercase identifiers:
<key>AdNetworkIdentifiers</key>
<array>
<string>example123.adattributionkit</string>
<string>partner456.skadnetwork</string>
</array>For custom click-through ads, overlay a UIEventAttributionView directly above the tappable surface:
import UIKit
let attributionView = UIEventAttributionView()
attributionView.frame = adContainer.bounds
attributionView.isUserInteractionEnabled = true
adContainer.addSubview(attributionView)Opt in to receive copies of winning conversion and re-engagement postbacks at your HTTPS endpoint:
<key>AdAttributionKit</key>
<dict>
<key>AttributionCopyEndpoint</key>
<string>https://example.com</string>
<key>OptInForReengagementPostbackCopies</key>
<true/>
</dict>The system sends postbacks to https://example.com/.well-known/appattribution/report-attribution/.
Register signed JWS impressions provided by the ad network:
import AdAttributionKit
import StoreKit
// Check device availability
guard AppImpression.isSupported else { return }
let impression = try await AppImpression(compactJWS: signedJWS)
// Option A: Custom view-through or click-through
try await impression.handleView()
try await impression.handleTap() // Must be called within 15 minutes of creation
// Option B: StoreKit overlay automatic tracking
let config = SKOverlay.AppConfiguration(appIdentifier: "123456789", position: .bottom)
config.appImpression = impressionUpdate conversion values on launch and key milestone completions:
// Initial window start
try await Postback.updateConversionValue(0, lockPostback: false)
// Milestone update with coarse tier and early lock
try await Postback.updateConversionValue(
42,
coarseConversionValue: .high,
lockPostback: true // Finalizes window early to accelerate postback receipt
)UIEventAttributionView fail attribution registration.Postback.updateConversionValue on initial launch prevents the conversion window from starting.impression.handleTap() must be invoked within 15 minutes of AppImpression initialization.Info.plist are lowercaseUIEventAttributionView covers the interactive ad area without touch interceptionAttributionCopyEndpoint configured with valid HTTPS and .well-known routethienqo/ios-skills
6bf8b62
Canonical home
since May 23, 2026
Also appears in
on Sep 6, 2026
since May 22, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.