skills/generators/subscription-offers/SKILL.md
Generates StoreKit 2 code for all subscription offer types — introductory, promotional, offer codes, and win-back. Includes eligibility checks, offer presentation, and the preferredSubscriptionOffer modifier. Use when adding subscription offers, free trials, or promotional pricing.
npx skillsauth add rshankras/claude-code-apple-skills subscription-offersInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate complete StoreKit 2 implementation for all four subscription offer types with eligibility verification, offer presentation, and transaction handling.
Use this skill when the user:
import StoreKit)SubscriptionStoreView offers, iOS 15+ for manual)paywall-generator was already usedGlob: **/*Offer*.swift, **/*Eligibility*.swift
Grep: "introductoryOffer" or "promotionalOffers" or "winBackOffers"
If existing offer code found, ask:
product.subscription?.introductoryOfferproduct.subscription?.promotionalOffersofferType (1 = introductory, 2 = promotional, 3 = offer code) + offerIdentifiertry await AppStore.presentOfferCodeRedeemSheet()product.subscription?.winBackOffers| Typical trial | Categories | |---------------|------------| | ~1 month | Entertainment, social, music, books | | 1 week | Health & fitness, productivity, education, weather | | 3 days | Photo/video, games, utilities, business |
isEligibleForIntroOffer and render only offers the user can actually redeem.| Playbook | Trigger | Move | |----------|---------|------| | Win-back | Subscription expired | Offer on relaunch / re-engagement | | Retention | Auto-renew flipped off — you get the server notification the moment it flips | Save offer before expiry | | Upgrade | Downgrade notification received | Nudge back to the higher tier | | Customer-service appeasement | Support flags a bad experience | Offer on next launch | | Loyalty | Long tenure (e.g., a free month at the 11th consecutive renewal) | Surprise reward | | Save | User heads to Manage Subscriptions | Intercept with an offer first |
Ask user via AskUserQuestion:
Which offer types? (multi-select)
Introductory offer details (if selected)
Deployment target
Server-side signature (if promotional offers selected)
Read templates.md for all offer implementation code.
SubscriptionOfferManager.swift — Central offer management
OfferEligibility.swift — Eligibility verification
isEligibleForIntroOffer)OfferConfiguration.swift — Offer type definitions and configuration
OfferBannerView.swift — Contextual offer banners
OfferCodeRedemptionView.swift — Offer code entry UI (if offer codes selected)
- If Sources/Store/ exists → Sources/Store/Offers/
- If Store/ exists → Store/Offers/
- If Subscriptions/ exists → Subscriptions/Offers/
- Otherwise → Offers/
Store/Offers/
├── SubscriptionOfferManager.swift # Central offer management
├── OfferEligibility.swift # Eligibility verification
├── OfferConfiguration.swift # Offer type definitions
├── OfferBannerView.swift # Contextual offer UI
├── OfferCodeRedemptionView.swift # Code entry (optional)
├── OfferSignatureProvider.swift # Server signatures (optional)
└── OfferAnalytics.swift # Offer tracking (optional)
Check Introductory Offer Eligibility:
let manager = SubscriptionOfferManager()
let isEligible = await manager.isEligibleForIntroOffer(
productID: "com.app.subscription.monthly"
)
Present Best Available Offer:
// Automatically selects the best offer for the user's state
let offer = await manager.bestAvailableOffer(
for: "com.app.subscription.monthly"
)
// Use with SubscriptionStoreView (iOS 16.4+)
SubscriptionStoreView(groupID: groupID)
.preferredSubscriptionOffer(offer)
Present Offer Code Sheet:
// iOS 16+
try await AppStore.presentOfferCodeRedeemSheet()
Win-Back Offer (iOS 18+):
let winBackOffers = await manager.availableWinBackOffers(
for: "com.app.subscription.monthly"
)
if let bestOffer = winBackOffers.first {
// Present win-back UI
}
generators/win-back-offers — Dedicated win-back flow skillgenerators/paywall-generator — Full paywall with offer integrationapp-store/marketing-strategy — Strategic offer planningdevelopment
US web checkout via the StoreKit External Purchase Link entitlement — currently 0% Apple commission (litigation ongoing), how to ship it safely, and how to architect for a commission flip so a future ruling is a config change, not a rewrite. Use when adding external purchase links, weighing web checkout vs IAP, or planning US-storefront pricing strategy.
tools
Revenue beyond the single-app price tag — own-app bundles, Family Sharing as a conversion lever, cross-developer bundles & suites, and institutional licensing via Group Purchases / Apple School & Business Manager. Use when a developer has multiple apps, a subscription worth sharing, complementary indie partners, or school/clinic/business buyers.
testing
Run a structured accessibility audit on an iOS/macOS app — automated XCUITest audits, Accessibility Inspector, manual VoiceOver/Dynamic Type passes, and App Store Accessibility Nutrition Label evaluation. Use before release, when preparing Nutrition Label declarations, or for EU Accessibility Act compliance.
tools
Stage-by-stage audit of an app's App Store growth machinery against a 54-item P0–P9 playbook — every item scored from an App Store Connect MCP call, a codebase check, or an explicit question to the user, then routed to the skill or command that fixes it. Read-only on App Store Connect. Use for a growth audit or scorecard, a pre-launch growth plan, a quarterly re-audit, or "which growth levers am I missing."