/ad-attribution
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring
$ npx -y skills add rshankras/claude-code-apple-skills --skill ad-attribution --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/ad-attribution
Context preview
The summary Claude sees to decide when to auto-load this skill.
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring
SKILL.md
ad-attribution.SKILL.mdname: ad-attribution
description: Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring re-engagement campaigns, designing conversion values, or migrating from SKAdNetwork.
allowed-tools: [Read, Write, Edit, Glob, Grep]
last_verified: 2026-07-16
review_by: 2027-06-22
os_version: iOS 27 / macOS 27
Ad Attribution (AdAttributionKit)
You can't optimize paid traffic you can't measure. AdAttributionKit is Apple's privacy-preserving attribution framework — interoperable with SKAdNetwork, and the go-forward path (it also works in alternative marketplaces). This skill covers the *advertised-app* side: what an indie running paid campaigns must implement and how to design conversion signals that survive privacy thresholds.
Note the seam: **Apple Ads attribution uses the AdServices framework, not AdAttributionKit** — campaigns there are measured in the Apple Ads console (see `app-store/apple-search-ads`). This skill is for every *other* paid channel (ad networks, social, publishers).
When This Skill Activates
- Running or planning paid user acquisition outside Apple Ads
- "How do I know which campaign drove installs?" / measuring re-engagement ads
- Designing or debugging conversion values / postbacks
- Migrating from SKAdNetwork (fully interoperable — registered networks need no re-enrollment)
How it works (the 60-second model)
Ad network signs an ad (compact JWS impression) → publisher app shows it → user installs (or re-engages) → after a privacy-delayed measurement window, a **postback** with your conversion info goes to the ad network (and optionally to you). Attribution requires no user tracking; the price is coarser data, governed by **crowd anonymity**.
Conversion-value strategy (the part that's actually yours)
- Two granularities: **fine value 0–63** and **coarse low/medium/high**. Low crowd sizes
downgrade fine → coarse and can trim the 4-digit campaign `source-identifier` to as few as its **first 2 digits** — so encode what matters most (campaign family, geo tier) in the first two digits, detail in the rest.
- Map values to *revenue-predictive* early behavior (completed onboarding, trial start, first
purchase), not vanity events. 64 slots go fast; reserve ranges (e.g. 0–15 activation, 16–47 monetization ladder, 48–63 reserved).
- Update with `updateConversionValue(_:)` / `PostbackUpdate`; set `lockPostback` when the value
is final to schedule transmission (still privacy-delayed, never instant).
- Re-engagement postbacks are separate from install postbacks: update them independently via
`conversionTypes` (.install / .reengagement); the **first re-engagement update must land within 48 hours**.
- Multiple simultaneous re-engagement campaigns need **conversion tags** (iOS 18.4+): read the
tag from the re-engagement URL's query items, store it, and pass it in `PostbackUpdate` — without a tag, updates hit only the most recent conversion.
Publisher-side mechanics (if your app also *shows* ads)
- Click-through: `UIEventAttributionView` over the tappable ad + `appImpression.handleTap()`
within **15 minutes** of creating the impression.
- View-through: `beginView()`/`endView()` on the same instance; **≥2 seconds** on screen to
count; one open view-through per network per advertised app.
- `SKOverlay` / `SKStoreProductViewController`: attach the impression — they count view on
present, click on tap.
Attribution windows & cooldowns (iOS 18.4+ configurability)
- Defaults: **30 days click-through, 1 day view-through** (install ads).
- Override per ad network and interaction type in Info.plist
(`AdAttributionKitConfigurations` → `AttributionWindows`); you can ignore "view" or "click" (not both) per network.
- Set **cooldowns** (`install-cooldown-hours`, `reengagement-cooldown-hours`) so a
re-engagement tap minutes after an install isn't double-attributed.
- Country-level postback data (iOS 18.4): storefront country at install, gated behind an extra
crowd-anonymity tier — a bonus signal when volume allows, never guaranteed.
- Overlapping re-engagement conversions require opting in:
`EligibleForAdAttributionKitOverlappingConversions` = YES in Info.plist.
Testing — never ship blind
- **Developer Mode → Settings → Developer → Ad Attribution Testing**: removes time
randomization, shortens all conversion windows, sends postbacks on demand — full end-to-end rehearsal in minutes instead of days.
- Point development postbacks at a **separate dev endpoint**, never production: they're signed
with a different key (`kid`), the network ID is always `development.adattributionkit`, and the advertised item ID may be 0 from Xcode.
- ✅ Verify the postback pipeline before spending a dollar. ❌ Debugging attribution *after*
a live campaign burns budget on unmeasurable installs.
Checklist
- [ ] Conversion-value map documented (0–63 + coarse fallback + first-2-digit priority)
- [ ] `lockPostback` fired once value is final; re-engagement first update < 48h
- [ ] Conversion tags wired if >1 re-engagement campaign runs at once
- [ ] Cooldowns configured; windows tuned per network where defaults don't fit
- [ ] Dev-endpoint postback rehearsal done in Developer Mode
- [ ] Campaign readout joined with `growth/analytics-interpretation` (source-type funnel) —
attribution tells you *which ad*, App Analytics tells you *what they did after*
References
- https://developer.apple.com/documentation/adattributionkit
- https://developer.apple.com/videos/play/wwdc2024/10060/ (Meet AdAttributionKit)
- https://developer.apple.com/videos/play/wwdc2025/221/ (What's new in AdAttributionKit)
- Related skills: `app-store/apple-search-ads` (Apple Ads uses AdServices, not this), `growth/analytics-interpretation`, `growth/store-growth-audit`
Read more
name: ad-attribution description: Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring re-engagement campaigns, designing conversion values, or migrating from SKAdNetwork. allowed-tools: [Read, Write, Edit, Glob, Grep] last_verified: 2026-07-16 review_by: 2027-06-22 os_version: iOS 27 / macOS 27
Ad Attribution (AdAttributionKit)
You can't optimize paid traffic you can't measure. AdAttributionKit is Apple's privacy-preserving attribution framework — interoperable with SKAdNetwork, and the go-forward path (it also works in alternative marketplaces). This skill covers the *advertised-app* side: what an indie running paid campaigns must implement and how to design conversion signals that survive privacy thresholds.
Note the seam: **Apple Ads attribution uses the AdServices framework, not AdAttributionKit** — campaigns there are measured in the Apple Ads console (see `app-store/apple-search-ads`). This skill is for every *other* paid channel (ad networks, social, publishers).
When This Skill Activates
- Running or planning paid user acquisition outside Apple Ads
- "How do I know which campaign drove installs?" / measuring re-engagement ads
- Designing or debugging conversion values / postbacks
- Migrating from SKAdNetwork (fully interoperable — registered networks need no re-enrollment)
How it works (the 60-second model)
Ad network signs an ad (compact JWS impression) → publisher app shows it → user installs (or re-engages) → after a privacy-delayed measurement window, a **postback** with your conversion info goes to the ad network (and optionally to you). Attribution requires no user tracking; the price is coarser data, governed by **crowd anonymity**.
Conversion-value strategy (the part that's actually yours)
- Two granularities: **fine value 0–63** and **coarse low/medium/high**. Low crowd sizes
downgrade fine → coarse and can trim the 4-digit campaign `source-identifier` to as few as its **first 2 digits** — so encode what matters most (campaign family, geo tier) in the first two digits, detail in the rest.
- Map values to *revenue-predictive* early behavior (completed onboarding, trial start, first
purchase), not vanity events. 64 slots go fast; reserve ranges (e.g. 0–15 activation, 16–47 monetization ladder, 48–63 reserved).
- Update with `updateConversionValue(_:)` / `PostbackUpdate`; set `lockPostback` when the value
is final to schedule transmission (still privacy-delayed, never instant).
- Re-engagement postbacks are separate from install postbacks: update them independently via
`conversionTypes` (.install / .reengagement); the **first re-engagement update must land within 48 hours**.
- Multiple simultaneous re-engagement campaigns need **conversion tags** (iOS 18.4+): read the
tag from the re-engagement URL's query items, store it, and pass it in `PostbackUpdate` — without a tag, updates hit only the most recent conversion.
Publisher-side mechanics (if your app also *shows* ads)
- Click-through: `UIEventAttributionView` over the tappable ad + `appImpression.handleTap()`
within **15 minutes** of creating the impression.
- View-through: `beginView()`/`endView()` on the same instance; **≥2 seconds** on screen to
count; one open view-through per network per advertised app.
- `SKOverlay` / `SKStoreProductViewController`: attach the impression — they count view on
present, click on tap.
Attribution windows & cooldowns (iOS 18.4+ configurability)
- Defaults: **30 days click-through, 1 day view-through** (install ads).
- Override per ad network and interaction type in Info.plist
(`AdAttributionKitConfigurations` → `AttributionWindows`); you can ignore "view" or "click" (not both) per network.
- Set **cooldowns** (`install-cooldown-hours`, `reengagement-cooldown-hours`) so a
re-engagement tap minutes after an install isn't double-attributed.
- Country-level postback data (iOS 18.4): storefront country at install, gated behind an extra
crowd-anonymity tier — a bonus signal when volume allows, never guaranteed.
- Overlapping re-engagement conversions require opting in:
`EligibleForAdAttributionKitOverlappingConversions` = YES in Info.plist.
Testing — never ship blind
- **Developer Mode → Settings → Developer → Ad Attribution Testing**: removes time
randomization, shortens all conversion windows, sends postbacks on demand — full end-to-end rehearsal in minutes instead of days.
- Point development postbacks at a **separate dev endpoint**, never production: they're signed
with a different key (`kid`), the network ID is always `development.adattributionkit`, and the advertised item ID may be 0 from Xcode.
- ✅ Verify the postback pipeline before spending a dollar. ❌ Debugging attribution *after*
a live campaign burns budget on unmeasurable installs.
Checklist
- [ ] Conversion-value map documented (0–63 + coarse fallback + first-2-digit priority)
- [ ] `lockPostback` fired once value is final; re-engagement first update < 48h
- [ ] Conversion tags wired if >1 re-engagement campaign runs at once
- [ ] Cooldowns configured; windows tuned per network where defaults don't fit
- [ ] Dev-endpoint postback rehearsal done in Developer Mode
- [ ] Campaign readout joined with `growth/analytics-interpretation` (source-type funnel) —
attribution tells you *which ad*, App Analytics tells you *what they did after*
References
- https://developer.apple.com/documentation/adattributionkit
- https://developer.apple.com/videos/play/wwdc2024/10060/ (Meet AdAttributionKit)
- https://developer.apple.com/videos/play/wwdc2025/221/ (What's new in AdAttributionKit)
- Related skills: `app-store/apple-search-ads` (Apple Ads uses AdServices, not this), `growth/analytics-interpretation`, `growth/store-growth-audit`
A collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.
Repo: rshankras/claude-code-apple-skills
Other skills on rshankras-apple-skills.
- /app-store
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user needs help with App Store presence, ASO, marketing, or customer communication.
Open skill - /app-description-writer
Generate compelling App Store descriptions that convert browsers into users. Use when writing initial descriptions, improving existing copy, or drafting promotional text and What's New for a major update.
Open skill - /apple-search-ads
Apple Search Ads campaign strategy for indie developers — paid acquisition, keyword bidding, budget planning, and ROAS optimization. Use when user asks about running ads, paid user acquisition, or Apple Search Ads campaigns.
Open skill - /iap-finalizer
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/description (and optional review screenshot) via the ASC REST API. Use at Phase 6 (Pre-Release), after the IAP is built in-app (Phase
Open skill - /keyword-optimizer
Optimize app title, subtitle, and keywords for maximum App Store discoverability. Use when launching a new app, improving search rankings, entering new markets/languages, or safely optimizing ASO for an app with existing traffic.
Open skill - /marketing-strategy
App Store marketing strategy advisor that analyzes your app and recommends the best promotional features. Orchestrates sub-skills for implementation. Use when planning app promotion, launch strategy, user acquisition, or re-engagement campaigns.
Open skill

