AppPreflight Logo
AppPreflight
loading
Back to Guides

In-App Purchase Compliance Best Practices

AppPreflight Team
2026-06-03
17 min read

In-App Purchase Compliance Best Practices

Publish Date: 2026-03-28
Last Updated: 2026-03-28
Author: AppPreflight Team

Overview

In-App Purchase (IAP) is a core mechanism for iOS app monetization. According to Apple's official review guidelines (2026 edition), all applications involving in-app purchases must strictly comply with regulations, or face rejection during review. This guide is based on real AppPreflight case studies and provides developers with detailed implementation and compliance recommendations for in-app purchases.

Why In-App Purchases Are So Important

The in-app purchase mechanism directly relates to app monetization capability and user trust. Among thousands of applications analyzed by AppPreflight, approximately 35% of rejections are related to improper in-app purchase implementation. This makes IAP compliance the highest priority during the app submission process. Many developers have had their applications rejected multiple times due to oversight in in-app purchase implementation, ultimately forcing them to redevelop or abandon App Store distribution.

Through systematic study of this guide, you will learn:

  • Various types of in-app purchases and their use cases
  • How to correctly implement in-app purchase functionality
  • Apple's core requirements for in-app purchases
  • Common reasons for in-app purchase rejection and their solutions
  • A complete checklist for passing App Store review

Part One: In-App Purchase Fundamentals

What Are In-App Purchases?

In-App Purchase (IAP) refers to transactions that users make within an iOS app while it's running. These purchases can be consumable products, subscription services, or permanent content unlocks. According to Apple's policy, all paid app features and content must be transacted through App Store's in-app purchase system. Developers cannot use third-party payment methods as alternatives.

Any app that wants to conduct commercial transactions on iOS must integrate in-app purchase functionality. Whether the app is free or paid, any sale of virtual goods, services, or content requires implementation through in-app purchases.

Core Functional Modules of In-App Purchases

The In-App Purchase System includes the following core functionalities:

  • Product Configuration: Define in-app purchase products in App Store Connect
  • Purchase Flow: User initiates an in-app purchase, system displays a confirmation dialog
  • Receipt Generation: System generates an in-app purchase receipt
  • Receipt Verification: App verifies the authenticity of the in-app purchase receipt
  • Purchase Restoration: Previously purchased users can restore past in-app purchase transactions

Main Types of In-App Purchases

  1. Consumable: In-app purchases that can be purchased multiple times, such as game currency and items
  2. Non-Consumable: One-time permanent feature unlocks, such as premium features
  3. Auto-Renewable Subscription: In-app purchases that automatically renew according to set cycles
  4. Non-Renewing Subscription: In-app purchases that require manual renewal

Part Two: In-App Purchase Implementation Standards

StoreKit Framework Integration: Technical Foundation of In-App Purchases

Integrating the StoreKit framework is a necessary condition for implementing in-app purchases. According to Apple's 2026 latest guidelines, it is recommended to use the StoreKit 2 framework for new in-app purchase implementations. StoreKit 2 provides modernized APIs that greatly simplify the development complexity of in-app purchases.

The StoreKit 2 framework provides the following core capabilities:

  • Product Queries: Query available in-app purchase products
  • Purchase Processing: Handle user in-app purchase requests
  • Transaction Management: Track and manage in-app purchase transaction states
  • Receipt Verification: Verify the authenticity of in-app purchase receipts

Configuring In-App Purchase Products in App Store Connect

Before implementing in-app purchases, product configuration must be completed in App Store Connect. This is a critical first step in the in-app purchase process and is the most error-prone area.

Steps for configuring in-app purchase products:

  1. Log in to App Store Connect: Use your Apple developer account to log in
  2. Select Your App: Select the corresponding app in "My Apps"
  3. Create In-App Purchase Product: Create a new in-app purchase product in the "App In-App Purchases" menu
  4. Fill In Product Information:
    • In-App Purchase Product ID: Unique identifier, typically using reverse domain format (e.g., com.example.app.premium)
    • Product Type: Select the in-app purchase type (consumable, non-consumable, or subscription)
    • Reference Name: For your reference only; users cannot see this name
    • Pricing: Set the product price (Apple will automatically convert to various currencies)
    • Description and Icon: Optional items for display in purchase receipts

In-App Purchase Product ID Naming Conventions

Product ID is the foundation of the in-app purchase system and must follow these standards:

  • Use reverse domain format, e.g., "com.yourcompany.yourapp.productname"
  • Use only lowercase English letters, numbers, and periods
  • Maximum length of 255 characters
  • Once created, the product ID cannot be modified
  • Must exactly match the ID used in your app code

In-App Purchase Purchase Flow Implementation

The correct purchase flow requires the following key steps:

  1. Retrieve In-App Purchase Product Information
  2. Request User Confirmation
  3. Handle In-App Purchase Transaction
  4. Verify In-App Purchase Receipt
  5. Complete In-App Purchase Flow
// 1. Fetch products
let products = try await Product.products(for: ["com.example.app.premium"])
guard let product = products.first else { return }

// 2. Request purchase
let result = try await product.purchase()

// 3. Handle purchase result
switch result {
case .success(let verification):
    // Verify purchase success
    switch verification {
    case .verified(let transaction):
        // Complete transaction
        await transaction.finish()
    case .unverified(_, let error):
        // Handle verification failure
        break
    }
case .pending:
    // Purchase pending approval (parental controls)
    break
case .userCancelled:
    // User cancelled purchase
    break
@unknown default:
    break
}

Receipt Verification Mechanism and In-App Purchase Security

According to Apple's 2026 guidelines, receipt verification is an essential component of in-app purchases. All apps must verify every in-app purchase receipt to prevent fraud and unauthorized purchases:

Local In-App Purchase Receipt Verification: Verify in-app purchases locally within the app, suitable for simple applications. This verification method is fast but has lower security.

Server In-App Purchase Receipt Verification: Send the in-app purchase receipt to a server for verification, recommended for all production apps. Use Apple's official in-app purchase verification endpoint: https://buy.itunes.apple.com/verifyReceipt. This verification method is more secure and can prevent user fraud.

Implementing In-App Purchase Restoration

Many users want to restore previous purchases after changing devices or reinstalling the app. Implementing in-app purchase restoration is mandatory and a sign of excellent user experience:

// Implement in-app purchase restoration
func restorePurchases() async {
    for await result in Transaction.currentEntitlements {
        switch result {
        case .verified(let transaction):
            // Restore previously purchased features
            handlePurchase(transaction)
        case .unverified:
            // Handle failed purchase transaction verification
            break
        }
    }
}

To provide the best in-app purchase restoration experience, we recommend:

  1. Add a "Restore In-App Purchases" button in app settings
  2. Use server-side database to record each user's purchase history
  3. Automatically sync purchase status when users log in

Part Three: In-App Purchase Rejection Reasons Analysis

Rejection Reason 1: Missing In-App Purchase Restoration Mechanism

Problem Description: The app does not provide an effective way for users to restore previously purchased content.

Manifestations:

  • App cannot restore previously purchased content after first installation
  • Users cannot access purchased features after changing devices
  • In-app purchase status is lost after app crash or reinstall

Reviewer Comment: According to AppPreflight's collected real rejection feedback, "Users should be able to restore previous purchases for free without re-paying." This is a fundamental requirement for all in-app purchase implementations.

Solution:

  1. Implement the in-app purchase restoration functionality provided by StoreKit
  2. Add a "Restore In-App Purchases" button in app settings
  3. Use server-side database to record each user's purchase history
  4. Automatically sync purchase status when users log in

Rejection Reason 2: In-App Purchase Price Mismatch with App Store Display Price

Problem Description: The price displayed within the app differs from the actual in-app purchase price on the App Store.

Manifestations:

  • App displays $9.99, but App Store shows $4.99
  • App displays ¥68, but App Store shows ¥28
  • App doesn't display price, just says "Tap to purchase"

Why This is Serious: According to Apple policy, users have the right to know the exact price they are about to pay. Any price deception violates the principle of user trust.

Solution:

  1. Dynamically fetch in-app purchase product prices instead of hardcoding
  2. Use StoreKit API to fetch latest product information and pricing
let products = try await Product.products(for: productIds)
for product in products {
    let formattedPrice = product.displayPrice
    // Display formattedPrice in UI
}
  1. Regularly review the consistency between in-app displayed prices and App Store prices

Rejection Reason 3: Failure to Correctly Display In-App Purchase Content Description Before Purchase

Problem Description: Users cannot clearly understand what they are about to purchase before clicking the in-app purchase button.

Manifestations:

  • Only displays "Unlock Premium Features" without explaining what specific features
  • No clear explanation of subscription cycle and renewal conditions
  • No clear pricing display or terms of service

Solution:

  1. Display in-app purchase content clearly before showing the purchase dialog
  2. Explain the subscription cycle (e.g., monthly, yearly subscription)
  3. Clearly display renewal conditions and cancellation methods

Rejection Reason 4: App Provides Features Before In-App Purchase Charge

Problem Description: Users can access or use content that should be paid before completing the in-app purchase payment.

Manifestations:

  • Premium features unlock immediately after user clicks "Purchase Premium," even if payment fails
  • App provides users with free trial period but fails to correctly restrict features after trial ends
  • App's content trial is not correctly bound to purchase status

Solution:

  1. Strictly check in-app purchase status: only successfully verified transactions can unlock features
  2. Correctly handle pending purchase transactions: features should not be unlocked at this time
  3. Confirm validity through server-side receipt verification before unlocking features

Rejection Reason 5: Using Third-Party Payment Instead of In-App Purchase

Problem Description: App provides a way to bypass App Store payment, such as direct credit card payment.

Manifestations:

  • In-app prompts users to "Pay cheaper on our website"
  • App provides third-party payment options like Alipay or WeChat Pay
  • App allows users to purchase in-app content through external means

Why This Violates Policy: According to Apple policy, all virtual goods sales must go through App Store's payment system. Apple's 30% revenue share is in exchange for providing secure payment infrastructure.

Solution:

  1. Remove all third-party payment options
  2. Integrate all paid features into the in-app purchase system
  3. For physical goods delivery services, third-party payment can be used, but virtual content must use IAP

Rejection Reason 6: Missing Subscription Cancellation Method

Problem Description: Users cannot easily cancel auto-renewing subscriptions.

Manifestations:

  • No subscription cancellation option in the app
  • Subscription cancellation process is extremely complex or hidden
  • App tells users to "contact customer service to cancel" instead of self-service

Apple's Strict Requirement: According to 2026 guidelines, the cancellation process must be as simple as the subscription process. If users subscribe within the app, they must be able to cancel within the app.

Solution:

  1. Add a "Manage Subscriptions" option on the app's settings page
  2. Link to iOS system subscription management: Settings > [Your Name] > Subscriptions
  3. Can also provide in-app cancellation option through StoreKit API

Part Four: In-App Purchase Best Practices

Best Practice 1: Comprehensive Error Handling

Apps must gracefully handle various purchase failure scenarios:

enum PurchaseError: Error {
    case productNotFound
    case verificationFailed
    case userCancelled
    case networkError
    case unauthorized
}

func handlePurchaseError(_ error: Error) {
    switch error {
    case StoreKitError.notAuthorizedToMakePurchases:
        showAlert("This user is not authorized to make purchases (might be a child account)")
    case StoreKitError.networkError:
        showAlert("Network connection failed, please check your connection and try again")
    default:
        showAlert("Purchase failed, please try again later")
    }
}

Best Practice 2: Server Synchronization

For important apps, it's recommended to sync purchase status to a server:

  1. Sync on User Login: New logged-in users restore all purchases
  2. Periodic Sync: Verify purchase status each time app launches
  3. Exception Handling: Handle network failures, verification failures, etc.

Best Practice 3: Clear User Notification

Users need to clearly understand purchase status:

  • Display clear confirmation after successful purchase
  • Show renewal date and amount after subscription activation
  • Display subscription status and expiration date on app home screen
  • Remind users in advance when subscription is about to expire

Best Practice 4: Testing and Verification

Thorough testing is key to passing app review:

  1. Use Sandbox Test Accounts: Create test accounts in App Store Connect
  2. Full Testing on TestFlight: Simulate real purchase scenarios
  3. Testing Checklist:
    • ✓ Successfully purchase consumables
    • ✓ Successfully purchase non-consumables
    • ✓ Start and manage subscriptions
    • ✓ Restore purchase functionality
    • ✓ Purchase status after network interruption
    • ✓ Purchase requests under parental controls

Part Five: In-App Purchase Review Checklist

Before submitting your app, check all the following items:

  • Product Configuration: All in-app purchase products are configured in App Store Connect
  • Product ID Matching: Product IDs in code exactly match those in App Store Connect
  • Receipt Verification: App correctly verifies all purchase receipts
  • Purchase Restoration: Implemented functionality for users to restore purchases
  • Price Display: App dynamically displays product prices consistent with App Store
  • Purchase Description: Display purchase content, price, and terms clearly before purchase
  • Feature Unlock: Only successfully verified transactions unlock features
  • Third-Party Payment: Removed all third-party payment options
  • Subscription Management: Provide link to iOS subscription management page
  • Error Handling: All purchase failure scenarios have appropriate user notifications
  • Data Privacy: App privacy label correctly describes collected purchase data
  • Localization: All purchase copy supports all languages supported by the app

Part Six: In-App Purchase Implementation Guides for Different Scenarios

Scenario 1: Consumable In-App Purchase Implementation for Game Apps

For game apps, consumable in-app purchases are the most common monetization model. Users can purchase game currency, items, and other consumable products multiple times through the in-app purchase system, with each purchase being recorded and charged. Selling consumables through the in-app purchase system is the standard practice for game monetization.

Characteristics of Consumable In-App Purchases:

  • Users can purchase the same consumable product multiple times
  • Each consumable purchase is an independent IAP transaction
  • Must provide clear balance display and usage reminders

Consumable Purchase Flow:

  1. User views current consumable balance
  2. User clicks consumable purchase button to initiate IAP purchase
  3. IAP system displays consumable price and App Store payment interface
  4. User confirms consumable purchase and completes payment
  5. App verifies consumable purchase IAP receipt
  6. App increases consumable balance

Scenario 2: Auto-Renewable Subscription Implementation for Subscription Apps

Auto-renewable subscriptions are a common monetization method for SaaS and content apps. Once a user purchases an auto-renewable subscription, the system automatically charges according to the set cycle (monthly or yearly) through the IAP system.

Characteristics of Auto-Renewable Subscriptions:

  • After user purchases an auto-renewable subscription, system automatically renews through IAP
  • User can manage auto-renewable subscriptions in iOS settings
  • Must clearly display subscription cycle and renewal date

Key Requirements for Auto-Renewable Subscriptions:

  • Clearly state the subscription cycle before confirming the in-app purchase
  • Provide options to manage subscriptions within the app
  • Clearly display when users will be charged and the next charge date
  • Users must be able to easily cancel subscriptions

Scenario 3: One-Time Premium Feature Unlock for Free Apps

Many free apps offer one-time in-app purchases to unlock premium features. This type of in-app purchase is called non-consumable and is implemented through the IAP system.

Characteristics of Non-Consumable In-App Purchases:

  • Users only need to purchase once through IAP to permanently access features
  • Users can restore purchases when logging in on any device
  • One user account can only have one purchase record for this product

Part Seven: In-App Purchases and Privacy Compliance

In-App Purchase Data Collection and Privacy Labels

When implementing the in-app purchase system, you must correctly declare collected in-app purchase related data in your privacy label:

Data Types Related to In-App Purchase System:

  • Purchase History: User's in-app purchase records
  • User Identifiers: User IDs associated with purchase transactions
  • Transaction Information: Purchase amount, time, product ID, etc.

Declaring In-App Purchase Data in Privacy Label:

  • Accurately list collected in-app purchase related data in App Store Connect
  • Explain whether purchase data is used for tracking
  • Explain whether system data is bound to user identity

Personal Information in In-App Purchase Receipts

In-app purchase receipts may contain user personal information, and the app must protect this information:

  • Don't print complete in-app purchase receipts in app logs
  • Use secure HTTPS connections when transmitting receipts
  • Delete in-app purchase receipt copies only after verification
  • Don't share complete in-app purchase receipt data with third parties

Part Eight: In-App Purchase Frequently Asked Questions

Q1: Can my app use third-party payment instead of in-app purchases?

Answer: No. According to Apple's in-app purchase policy, all virtual goods and services sales must use the in-app purchase system and cannot use payment services like Alipay or WeChat Pay. IAP is the only authorized payment method. The only exception is for physical goods delivery services.

Q2: How can users restore in-app purchases after purchase?

Answer: Users can restore previous purchases through the "Restore In-App Purchases" button in the app. The restoration process queries the user account's purchase history and restores all valid purchase records. It's recommended to automatically restore purchases on app first launch.

Q3: How do I handle in-app purchase refunds and features after refund?

Answer: Users can request in-app purchase refunds through the App Store. If a refund is approved, the system automatically notifies the app, which should then remove or disable the corresponding purchase.

Q4: When should I verify in-app purchase receipts?

Answer: Receipt verification should happen immediately after the purchase transaction completes. For critical in-app purchase features, it's recommended to re-verify receipts on each app launch to prevent fraud.

Q5: Does the in-app purchase system support multiple currencies?

Answer: Yes. App Store automatically converts in-app purchase prices to local currencies. When setting product prices in App Store Connect, just set the base price tier, and the system will automatically convert to other currencies.

Conclusion

Implementing in-app purchases is at the core of iOS app monetization, but it's also one of the most common reasons for app rejection. By following the in-app purchase standards and best practices in this guide, you can significantly improve your app's review pass rate.

Key Points Summary:

  1. All virtual content sales must go through App Store's in-app purchase system
  2. Must implement complete receipt verification and purchase restoration
  3. In-app purchase prices, content, and terms must be clear and transparent
  4. Thoroughly test all in-app purchase scenarios
  5. Provide excellent in-app purchase user experience
  6. Accurately declare in-app purchase data collection in privacy labels
  7. Comply with all Apple requirements and policies for in-app purchases

Final Reminder

Implementing the in-app purchase system is a complex process, but once correctly implemented, it provides stable revenue for your app. Before submission, be sure to conduct thorough testing to ensure all in-app purchase functionality works correctly. If your app review is rejected, carefully analyze the rejection reason and make modifications according to this guide.

For more questions, feel free to contact AppPreflight support team. We're committed to helping developers successfully implement the in-app purchase system and pass App Store review.


Was this guide helpful?