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.
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)SubscriptionStoreViewpaywall-generator was already usedGlob: **/*Offer*.swift, **/*Eligibility*.swift
Grep: "introductoryOffer" or "promotionalOffers" or "winBackOffers"
If existing offer code found, ask:
product.subscription?.introductoryOfferproduct.subscription?.promotionalOfferstry await AppStore.presentOfferCodeRedeemSheet()product.subscription?.winBackOffersAsk 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 planning