Apple Promotional Offers are only valid for users who have previously subscribed to the product — presenting them to first-time users generates an invalid purchase attempt that fails at the platform level. An offer identifier string that does not match exactly what is configured in App Store Connect causes the same failure. Both scenarios result in a purchase error that the user experiences as a broken "Subscribe" button. Apple's promotional offer system requires server-side signature generation to prevent unauthorized use, so a mismatch between the code's offer identifier and App Store Connect configuration breaks the entire offer flow silently.
Low because misconfigured promotional offers break the discount flow for targeted users but do not affect the primary subscription purchase path for new subscribers.
Verify that every promotional offer identifier string in your codebase matches exactly the identifier configured in App Store Connect under Subscriptions → [Your Subscription] → Subscription Prices → Promotional Offers. Check eligibility before showing a promotional offer to a user.
// StoreKit 2 — check eligibility before showing the offer
if let promoOffer = await subscription.promotionalOffer(offerID: "win_back_50") {
// User is eligible (has a prior subscription history)
try await product.purchase(options: [.promotionalOffer(promoOffer)])
}
// If subscription.promotionalOffer returns nil, the user is not eligible
For RevenueCat promotional offers, use Purchases.purchasePackage(package, promotionalOffer: offer) and confirm the offer's identifier property matches App Store Connect before shipping. Audit all offer identifier strings in src/lib/iap/offers.ts or equivalent against your current App Store Connect configuration.
app-store-iap-subscriptions.pricing-compliance.promo-offerslowProduct.SubscriptionOffer usage in StoreKit 2, or SKPaymentDiscount in StoreKit 1 (older API). (2) RevenueCat promotional offers: Purchases.purchasePackage(package, promotionalOffer: offer). (3) Promotional offer eligibility checks — Apple Promotional Offers are only valid for users who have previously subscribed. Showing a promotional offer to a first-time subscriber is invalid. (4) Offer codes: look for redeemOfferCode() (StoreKit 2) or openStoreProductWithParameters() calls that handle offer code redemption. (5) In promotional offer configurations: the offer identifier string in the code must match exactly what is configured in App Store Connect. Fail pattern: a promotional offer (win-back campaign) incorrectly shown to users who never subscribed, causing an invalid purchase attempt."Promotional offer ID 'win_back_50_off' in src/lib/iap/offers.ts does not match the offer identifier configured in App Store Connect — promotional offer purchase will fail at the platform level" or "Apple Promotional Offer shown to all users in PaywallScreen.tsx without checking prior subscription history"// StoreKit 2
if let promoOffer = await subscription.promotionalOffer(offerID: "win_back_50") {
// User is eligible
try await product.purchase(options: [.promotionalOffer(promoOffer)])
}