·8 min read

iOS In-App Purchases: A Complete Guide for Indie Developers

In-app purchases are the most flexible monetization tool on the App Store. This guide covers every IAP type, how to implement them correctly, and how to structure your pricing to maximize revenue without alienating users.

The Business Case for In-App Purchases

The App Store has three core monetization models: paid upfront, in-app purchases (IAP), and subscriptions (which are technically a type of IAP). Of these, IAP is the most flexible — and for most indie developers, it's the most commercially viable.

A free app with IAP gets downloaded by significantly more users than a paid app at the same price point. More downloads mean more reviews, more word of mouth, and more data. Your job is then to convert a portion of those free users into paying customers by delivering enough value that the purchase feels obvious, not forced.

This guide covers the mechanics, the strategy, and the mistakes to avoid.

---

Types of In-App Purchases

Apple offers four IAP types, each suited to different business models:

Consumables Purchased and used up. Can be bought multiple times. Examples: credits, coins, lives, AI tokens, "boosts."

Use consumables when your app's value is transactional — users pay to *do* something, not to *unlock* something permanently. They work well in games and AI-powered apps where users naturally consume a resource.

Non-Consumables Purchased once and owned permanently. Examples: "Remove Ads," unlocking a premium feature set, a specific filter pack, a font library.

Non-consumables are simple and user-friendly. Users appreciate knowing they're paying once. However, they don't generate recurring revenue, which limits your ability to fund ongoing development.

Important: Non-consumables must be restorable. Apple requires you to implement a "Restore Purchases" button — users switching to a new device must be able to get back what they paid for without buying again.

Auto-Renewable Subscriptions Charged on a recurring basis (weekly, monthly, annually) until the user cancels. Examples: premium access, cloud sync, content subscriptions.

This is the model Apple most aggressively promotes, and for good reason: it aligns developer incentives with ongoing value delivery. Revenue is predictable, and Apple's cut drops from 30% to 15% after year one of a continuous subscription.

Non-Renewing Subscriptions Charged once for a fixed duration (e.g., "1 year of premium access") and do not auto-renew. Rarely used in practice — auto-renewable subscriptions replaced them for most use cases.

---

Setting Up IAP in App Store Connect

Before writing a line of code, you need to configure your IAPs in App Store Connect:

  1. Go to Apps → Your App → Monetization → In-App Purchases (or Subscriptions)
  2. Click the + button and select your IAP type
  3. Enter a Reference Name (internal only), a Product ID (permanent — choose carefully), and your pricing
  4. Add a Display Name and Description for each localization
  5. For subscriptions, create a Subscription Group and configure the group-level upgrade/downgrade logic

Product ID conventions: Use reverse domain notation — e.g., `com.yourapp.premium.monthly`. This ID is permanent and cannot be changed or reused once deleted.

Pricing Tiers

Apple uses a tier-based pricing system rather than freeform input. Prices are set in USD and automatically converted to other currencies at Apple's current exchange rates (which you can override per-territory).

For subscriptions, Apple offers Introductory Pricing: free trials, pay-as-you-go intro prices, and pay-upfront intro prices. Always offer a free trial for new subscription apps — the conversion rate from trial to paid is almost always higher than asking for payment upfront.

---

Implementing IAP in Swift

The modern way to implement IAP is with Apple's StoreKit 2 framework, introduced in iOS 15. StoreKit 2 uses Swift concurrency (async/await), is dramatically simpler than the original StoreKit 1, and handles receipt validation on-device without a server.

Fetching Products

```swift import StoreKit

let productIDs = ["com.yourapp.premium.monthly", "com.yourapp.remove_ads"]

let products = try await Product.products(for: productIDs) ```

Making a Purchase

```swift let result = try await product.purchase()

switch result { case .success(let verification): switch verification { case .verified(let transaction): // Grant entitlement await transaction.finish() case .unverified: // Handle suspicious transaction break } case .userCancelled: break case .pending: // Awaiting approval (e.g., Ask to Buy) break @unknown default: break } ```

Checking Entitlements on Launch

```swift for await result in Transaction.currentEntitlements { if case .verified(let transaction) = result { // User has active entitlement for transaction.productID } } ```

Listening for Transaction Updates

Always set up a listener at app launch to handle transactions that complete outside the app (e.g., from a Family Sharing purchase or a subscription renewal):

```swift Task { for await result in Transaction.updates { if case .verified(let transaction) = result { await updateEntitlements(for: transaction) await transaction.finish() } } } ```

---

Third-Party Libraries Worth Knowing

While StoreKit 2 covers the basics, most production apps benefit from a higher-level library:

Using RevenueCat in particular can cut your IAP implementation time significantly and gives you server-side receipt validation, cross-platform support (if you ever add Android), and real-time subscription analytics without building your own backend.

---

Pricing Strategy for Indie Developers

Anchor Pricing Offer a yearly plan alongside your monthly plan. The yearly plan should be priced to represent a 30–40% discount over 12 months of the monthly plan. Most users who subscribe to the yearly plan calculate the savings themselves — the monthly plan is the anchor that makes the yearly plan feel like a deal.

Example: Monthly $4.99, Yearly $29.99 (saves ~50%). Users who see this comparison convert to annual at a high rate, which dramatically improves your LTV.

Paywall Placement The most common mistake is showing the paywall too early. Users who hit a paywall before experiencing value have no reason to convert. The optimal moment to show a paywall is *immediately after* the user has experienced a clear, tangible benefit from the feature you're asking them to pay for.

Think of it as: trigger → value → paywall, not launch → paywall.

Free Trials For subscriptions: always offer a free trial. A 7-day trial generally converts at similar rates to a 14-day trial, but you get revenue 7 days sooner. Test both.

For non-consumables: consider a "try before you buy" pattern — let users access a premium feature for a limited number of uses before prompting a purchase.

---

Handling Edge Cases

Refunds Apple processes refunds without your involvement and can revoke a transaction. Listen to `Transaction.updates` at app launch — if a transaction is revoked, `transaction.revocationDate` will be set. Check for this and revoke the user's entitlement.

Family Sharing Non-consumables and subscriptions can be made available to the user's Family Sharing group. Enable this in App Store Connect. Transactions shared via Family Sharing are marked with `transaction.ownershipType == .familyShared`.

Billing Retry and Grace Periods For subscriptions, if a renewal payment fails, Apple will retry for up to 60 days. You can optionally offer a **billing grace period** (in App Store Connect) that keeps the subscription active during this retry window. This significantly reduces involuntary churn.

---

Promoting Your IAP

Your app's store listing should reflect your IAP structure: - Mention premium features explicitly in your description - Consider including a screenshot that shows your paywall or premium feature set - Use App Store Promotional Offers to run limited-time discounts on subscriptions (these are configured in App Store Connect and can be surfaced in your paywall or via push notifications)

Creating polished app preview images that highlight your premium experience is part of this — tools like AppFrame make it easy to generate professional device mockups that showcase what paid users see.

---

Common Mistakes to Avoid

  1. Gating core functionality immediately — users need to experience value before they'll pay for it
  2. Forgetting Restore Purchases — Apple will reject your app if non-consumable IAPs aren't restorable
  3. Not testing Sandbox properly — create a Sandbox account in App Store Connect and test every IAP flow including cancellation and renewal
  4. Ignoring subscription metrics — track MRR, churn rate, and trial conversion rate from day one; you can't improve what you don't measure
  5. Using StoreKit 1 in new projects — StoreKit 2 is significantly better; only use StoreKit 1 if you must support iOS 14 and earlier

In-app purchases done well can transform a free app with modest downloads into a sustainable business. The key is patience: deliver value first, price fairly, and optimize based on real data rather than assumptions.

Continue reading

Made withby Simone Ruggiero
Privacy·Terms·© 2026 AppFrame