image
  • +91 7821055537, +91 9982201414
  • bdm.br
  • +1-603-275-9923
  • +1-650-727-6690

Maximize iOS In-App Revenue with StoreKit 3 — Without Killing UX

iOS Game Development
Jul 17, 2025
Follow Us: BR Softech Success Story Graphic BR Softech YouTube Channel Icon
iOS In-App Revenue with StoreKit 3

Everybody wants to maximize their in-app revenue; however, sometimes they compromise with the UX to achieve that. The trick to raising your revenue graph is by providing a super UX to your users. If you are developing an app for the iOS audience, learning how you can leverage StoreKit 3 is crucial.

In this blog, we will discuss the nuances of monetization in iOS, iPadOS, macOS, watchOS, and tvOS while developing an app. From the benefits of StoreKit 3 to how you can get started with it, we will share all the important stuff required in building an app that provides maximum revenue.

Why StoreKit 3 Matters in 2025?

StoreKit 3 is primarily known for providing privacy-focused and efficient ways to manage in-app purchases and subscriptions across Apple platforms. It is a robust and crucial tool for developers. Let’s understand why it matters in 2025:

  • Privacy-Centric Design: StoreKit 3 stays ahead of the evolving App Store policies and ensures compliance by minimizing data tracking. It also offloads purchase validation to Apple’s secure servers.
  • Simplified Subscription Management: You get modern API integrations through StoreKit 3, which positively affects handling of renewals, cancellations, billing, and upgrade issues.
  • Real-Time Transaction Updates: The TransactionListener tool in StoreKit 3 allows developers to access timely and reliable transaction data.
  • Support for Family Sharing & Offer Codes: These features allow developers to drive retention and reach wider audiences without additional implementation burden.
  • Cross-Platform Consistency: Platform-specific bugs are reduced through StoreKit 3 as it unifies behavior across iOS, iPadOS, macOS, watchOS, and tvOS. This helps in a consistent IAP experience for users.

If you’re also exploring how to render 2D or 3D content for your games or apps, it helps to understand the difference between SpriteKit, SceneKit, and Metal to make an informed architectural decision alongside StoreKit 3.

How to Get Started With StoreKit 3?

Getting started with StoreKit 3 is fairly simple. Let’s understand what changed and what didn’t in StoreKit 3, frameworks in modern Swift, and how you can use Xcode StoreKit to test the environment effectively.

What changed in StoreKit 3?

  • Modern Swift Concurrency Support
  • TransactionListener
  • Entitlement Verification
  • Unified Across Platforms

Fetching products, handling purchases, and checking entitlements have become easier with modern Swift concurrency support. StoreKit 3 replaces SKProduct and SKPaymentTransaction with strongly typed Swift structs, improving readability and safety. Developers can easily listen to transactions in real time. Receipt validation happens via secure Apple servers, and the same API is seen across iOS, macOS, watchOS, and tvOS.

What did not change?

  • App Store Review Requirements
  • Revenue Share Model
  • Product Setup in App Store Connect

Apple’s IAP mechanisms for digital content have been the same. Moreover, Apple’s commission and rules on digital purchases remain the same. App Store Connect is still available; you can configure products or subscriptions from there, just as before.

Overview of StoreKit Framework in Modern Swift

StoreKit 3 is Swift-friendly and asynchronous. Here’s a simple flow:

import StoreKit

// Fetching available products

let products = try await Product.products(for: ["com.example.app.premium"])

guard let premiumProduct = products.first else { return }

// Purchasing a product

let result = try await premiumProduct.purchase()

switch result {

case .success(let verificationResult):

    switch verificationResult {

    case .verified(let transaction):

        // Grant entitlement

        await transaction.finish()

    case .unverified(_, let error):

        print("Unverified: \(error)")

    }

case .userCancelled:

    break

case .pending:

    // Handle pending state

    break

}

Not sure whether to go with Swift or Unity for your next app or game? Learn more about the pros and cons in Swift vs Unity for iOS game development to decide which suits your monetization model better.

How to Set Up Your Product Catalog & .storekit Configuration?

You can set up your product catalog and .storekit configuration through these steps:

Step 1: Define Products in App Store Connect

Go to App Store Connect → My Apps → Your App → In-App Purchases

Add products like consumables, non-consumables, subscriptions, etc.

Use clear Product IDs (e.g., com.appname.premium.yearly)

Step 2: Create .storekit Configuration

In Xcode:

File → New → File → StoreKit Configuration File

Define mock products for local testing.

Use this file in your scheme for testing StoreKit locally.

How to Implement In-App Purchases in StoreKit 3?

Here is a step-by-step guide to implement in-app purchases in StoreKit 3.

  • The very first step is to import the StoreKit framework. After that, you need to fetch products.
@MainActor

func loadProducts() async {

    do {

        let storeProducts = try await Product.products(for: ["com.example.app.premium"])

        self.products = storeProducts

    } catch {

        print("Failed to load products: \(error)")

    }

}
  • The next step includes the display of products in the UI. You can do this using SwiftUI or UIKit.
Text(product.displayName)

Text(product.displayPrice)

Button("Buy Now") {

    Task {

        await purchase(product: product)

    }

}
  • The next step involves purchasing the product and verifying its authenticity.
@MainActor

func purchase(product: Product) async {

    do {

        let result = try await product.purchase()

        switch result {

        case .success(let verification):

            switch verification {

            case .verified(let transaction):

                // Grant access

                print("Purchase verified: \(transaction.productID)")

                await transaction.finish()

            case .unverified(_, let error):

                print("Purchase unverified: \(error)")

            }

        case .userCancelled:

            print("User cancelled the purchase.")

        case .pending:

            print("Purchase is pending approval.")

        }

    } catch {

        print("Purchase failed: \(error)")

    }

}
  • In the next step, you need to ensure that users keep access even after relaunch or device change.
func startTransactionListener() {

    Task.detached {

        for await result in Transaction.updates {

            if case .verified(let transaction) = result {

                // Grant/refresh access

                await transaction.finish()

            }

        }

    }

}
  • Now you need to allow users to restore their purchases in the last step.
@MainActor

func restorePurchases() async {

    do {

        for await result in Transaction.currentEntitlements {

            if case .verified(let transaction) = result {

                print("Restored: \(transaction.productID)")

                // Grant access again

            }

        }

    } catch {

        print("Restore failed: \(error)")

    }

}

If you’re working on casual games and want a lightweight framework, here’s a guide on how to build a 2D iOS game without Unity while still taking advantage of StoreKit 3’s monetization features.

How to Build Paywalls That Don’t Annoy in 2025?

Paywalls should be persuasive and not pushy. If your paywall annoys users, it counts as bad UX. Here’s a simple guide to building a paywall that does not repel users. First things first, launching a paywall right when the app starts is a big red flag. Research shows that users rarely convert if you throw a paywall right at the beginning.

Users are far more likely to convert when:

  • They’ve just experienced value from your app
  • They’re trying to access a premium feature
  • They’ve completed an onboarding flow or task

Make sure to apply the above pointers when you are onboarding a user for the first time. There are strategies through which you can soft-launch your paywall. These include providing the paywall after the user completes a task, after certain sessions, or after the user taps on a locked feature.

Soft Walls vs. Hard Walls: Which One Should You Use?

There are mainly two types of paywall barriers, soft wall and hard wall. Let’s understand this through a table, and you will also understand which one you should use.

TypeDescriptionIdeal For
Soft WallLimits access but doesn’t block entirelyHabit-based apps, games, and learning tools
Hard WallCompletely blocks access until payment is madePremium utilities, pro features, B2B apps

Use soft walls when your app benefits from user trust and long-term retention, or when you offer freemium content or trial-based engagement. Use hard walls when your app offers professional-grade features or tools, or when users are already familiar with the product’s value before paying.

Whether you’re planning to implement soft or hard walls, a good foundation starts when you make an iPhone game from scratch with scalable monetization options in mind.

How to Increase Revenue Without Breaking the UX?

One of the toughest tasks in developing games is balancing monetization with user experience. Data-backed strategies will help you boost revenue and retention. Let’s start by understanding how to implement introductory offers, free trials, and promos.

  • Configure intro offers and trials in App Store Connect under your product’s pricing.
  • StoreKit 3 automatically displays these offers via the Product.SubscriptionOffer API.
if let offer = product.subscription?.introductoryOffer {

    print("Trial: \(offer.paymentMode), Duration: \(offer.duration)")

}

You can easily increase revenue by tweaking your paywalls, and it is not about pushing harder; it is about selling smarter. Let’s understand what works in detail.

  • Offer trials to lower commitment anxiety
  • Segment users with meaningful pricing
  • Test, measure, and optimize continuously
  • Use P-IAP to bring users into the funnel via marketing
  • Respect UX to keep users happy

The team at BR Softech is well-versed in building paywalls that not just attract but convert. If you want help building a smart paywall or setting up A/B tests using StoreKit 3 + RevenueCat, you can contact us, and we can help you boost your revenue through our tested methods.

Contact us

How to Optimize Price and Subscription Strategy in 2025?

Launching a subscription model is easy; optimizing it according to your target audience is a bit tricky. Choosing pricing tiers, experimenting with durations, minimizing churn, and maintaining a smooth transaction experience are some of the healthy subscription optimization strategies.

Let’s understand how we can apply price and subscription strategies without hurting the user experience.

Choose the Right Price Tiers

Your app should have a tailored price tier specific to every country, and not just currency conversion.

CountrySuggested Price (USD Equivalent)Strategy
US$4.99/monthStandard pricing
India₹149/month (~$1.79)Lower tier
UK£3.99/monthMid-tier

Research regional spending habits, and in price-sensitive markets offer lower tier subscription for a high LTV.     Here’s another intuitive table to describe how you can optimize the subscription duration.

DurationBest ForProsCons
MonthlyPrice-sensitive usersLow barrier to entryHigh churn potential
AnnualCommitted usersHigher LTV, fewer renewalsLower initial conversion
LifetimePower users, one-time valueBig upfront revenueNo recurring income

You must offer all the options; however, you should persuade users to choose the annual option through:

  • Visual pricing comparisons
  • ‘Best Value’ tags
  • Limited-time annual discounts

Why is Monitoring Performance and Iteration Necessary?

We shall understand deeply why metrics matter in this part of the blog. Moreover, how you can track user activity using StoreKit 3 and Apple Server Notifications. We shall also discuss some of the third-party tools like Mixpanel, RevenueCat, and Adapty.

If you truly want to grow your business in the long term, monitoring performance is necessary, as it helps you optimize pricing and subscription strategies over time. Study the behavior of your audience and continuously improve both revenue and user experience.

MetricWhy It’s Important
Revenue (ARPU)Tells you how much each user is worth
LTV (Lifetime Value)Helps forecast and justify paid acquisition
Churn RateIndicates where and why users are leaving
Trial-to-Paid RateMeasures the effectiveness of your free trial strategy
Paywall ConversionReveals how well your pricing and design are working

Now you know why metrics like ARPU, LTV, Churn Rate, Trial-to-Paid Rate, and Paywall Conversion are important. You can benchmark these metrics monthly and track changes after each product or pricing update.

How to Use StoreKit 3 Analytics and App Store Server Notifications?

Let’s understand how we can leverage StoreKit 3 and App Store Server Notifications.

StoreKit 3 Features:

  • Transaction Streams: Use Transaction.updates to listen for real-time purchase activity.
  • Entitlements: Check active subscriptions using Transaction.currentEntitlements.
  • Renewal Status: Detect downgrades, cancellations, and billing issues in-app.

App Store Server Notifications:

  • Trial start and conversion
  • Subscription renewal or failure
  • Refunds, pauses, and billing grace periods

What are the Third-Party Analytics That Help in Gaining Insights?

RevenueCat, Mixpanel, and Adapty are some of the third-party apps that can help you gain substantial insights.

RevenueCat

It is purposely built to seamlessly integrate with StoreKit 3. It tracks revenue, churn, and LTV automatically. It easily cohorts tracking and paywall A/B testing.

Mixpanel

A great tool for building user funnels and behavior flows. It also tracks action before and after the purchase. Ideal for product and growth teams.

Adapty

Adapty is a perfect tool for price testing and regional segmentation. It provides real-time dashboards for measuring subscription performance. It offers a no-code paywall for A/B testing.

Monitoring your app’s performance is not only crucial but mandatory if you want to sustain your growth. With the help of StoreKit 3, Apple server notifications, and analytics platforms like RevenueCat, Mixpanel, and Adapty, you can easily monitor performance and iteration.

What are the Common Mistakes in App Monetization?

StoreKit 3 is a great tool, but it cannot help you if you execute a poorly planned monetization strategy. There are some mistakes that a user does not appreciate and bounces away from your platform. Hence, make sure to pay extra attention to this part of the blog and do not repeat these common mistakes developers make while developing an app.

Overengineering Your Paywall

Do not pack your paywall with multiple animations, features, toggles, comparisons, and testimonials; this slows down conversion. Instead, you should focus on providing a clear message to your audience. Use a clear, strong CTA, highlight the benefits of the app, and not every other feature.

Treating UX as a Second Thought

If your paywall looks like an afterthought, if it interrupts the flow, or if it breaks the UI guidelines, your revenue will suffer. To fix this problem, you can:

  • Integrate your paywall contextually (after a key action or feature preview)
  • Maintain design consistency with the rest of your app
  • Use animations sparingly and intentionally
  • Always allow an exit or dismiss option

Neglecting Testing Environments

Launching new paywalls and pricing without testing them in a sandbox or StoreKit config mode is a big mistake. You can use StoreKit configuration files in Xcode to test products and flows. Do not forget to run thorough tests with sandbox users before App Store submission. Lastly, use platforms like RevenueCat or Adapty to A/B test offers without code updates.

Pushing Too Early

Do not impose a paywall on users the instant they log into the app. Doing so, you will lose the user’s interest. Wait until the user experiences value, or you can use soft walls to show premium features, but allow partial interaction.

MistakeFix
Overcomplicated paywallsKeep it clear and conversion-focused
Bad UXMatch app design, show at the right time
No testingUse sandbox, .storekit files, and test platforms
Generic pricingSegment, localize, and offer options
Paywall too earlyDelay until users see value

Conclusion

In 2025, it is not necessary that you have to compensate UX in order to achieve good numbers in revenue. You can do both, provide decent UX, and gain good profits. You just need to align them strategically. If you focus on timing, personalization, transparency, and iteration, you can attain users’ credibility, which will result in a more seamless revenue model.

Whether you’re using StoreKit 3, RevenueCat, or a custom implementation, you must remember that great monetization is invisible when it works and powerful when it’s needed.

The team at BR Softech offers professional iOS game development services that blend immersive gameplay and strategic monetization using tools like StoreKit 3 and RevenueCat.

Frequently Asked Questions (FAQs)

Q1. How do I use StoreKit 3 to implement in-app purchases in iOS?

To implement IAPs using StoreKit 3, follow these steps:
– Define products in App Store Connect (subscriptions, consumables, non– consumables).
– Use Product.products(for:) to fetch products via StoreKit.
– Present them in your UI.
– Call .purchase() on a Product instance to initiate a purchase.
– Use Transaction.currentEntitlements and Transaction.updates to track access and listen for purchase events.

Q2. Is there a StoreKit 3 tutorial with working Swift code?

Yes, please find it below.
 
import StoreKit
@MainActor
class StoreManager: ObservableObject {
    @Published var products: [Product] = []
 
    func loadProducts() async {
        do {
            products = try await Product.products(for: [“com.app.premium”])
        } catch {
            print(“Failed to fetch products: \(error)”)
        }
    }
 
    func purchase(_ product: Product) async {
        do {
            let result = try await product.purchase()
            // Handle transaction result here
        } catch {
            print(“Purchase failed: \(error)”)
        }
    }
}

Q3. How can I optimize in-app purchases on iOS in 2025?

You can use StoreKit 3 and App Store Server Notifications for better purchase visibility. You can also offer localized pricing, introductory trials, and behavioral discounts. Test paywall copy, visuals, and price points using tools like RevenueCat or Adapty. Lastly, track LTV, churn, and conversion rates regularly and iterate monthly.

Q4. What does a high-converting paywall design look like on iOS?

A great paywall includes:
– Visual preview of premium features
– Clear CTA (“Start 7-Day Free Trial”)
– Bullet list of value points
– Pricing comparisons (Monthly vs Yearly)
– Legal footer (Terms, Restore, Privacy)
– Trust elements (ratings, testimonials, secure badge)

Nitin Garg

Nitin Garg is a seasoned tech entrepreneur and the visionary founder of BR Softech, a globally recognized leader in game development. With over 13 years of industry experience, he has been instrumental in transforming BR Softech into a powerhouse of innovation, offering cutting-edge solutions in Video Games, Blockchain Games, NFT Game Development, and card games like Poker, Rummy, and Teen Patti. Nitin’s deep expertise in emerging technologies, combined with a sharp business acumen, has helped position BR Softech as a trusted name in the international gaming arena. Under his leadership, BR Softech has built a global clientele of 3,000+ satisfied customers and scaled a dedicated in-house team of 180+ skilled professionals.

Game Development Solutions

Scan QR Code

For Immediate Contact

skypeSkype whatsappWhatsapp

Categories

Get in Touch

Name*

Email*

Country Name*

Mobile No*

Message*

close

Get in Touch

Country Name *