StoreKit 2 runs the purchase
It loads products, charges the customer, verifies the transaction on the device and lists what the customer owns.
Honest answer
For many iOS-only apps, StoreKit 2 is enough. It runs the purchase and tells the app what the customer owns, and Apple's server notifications tell your server about renewals and refunds. You need a backend such as RevenueCat or RevenueDot when you add Android or the web, need entitlements on a server, want webhooks, charts or paywall tests, or do not want to maintain Apple's edge cases.
We build a backend, so we link Apple's documentation for every fact about StoreKit. Already have an account? Sign in
It loads products, charges the customer, verifies the transaction on the device and lists what the customer owns.
App Store Server Notifications tell a server about renewals, refunds and billing problems, even while the app is closed.
Android and web customers need a server that gives one customer one set of access across every store.
Grace periods, refunds, family sharing and offer codes are where homemade setups break, not the first purchase.
Apple only
Apple's own tools cover a complete iOS subscription app. Each item links to Apple's documentation.
Product.products(for:) loads your products from the App Store (Apple).SubscriptionStoreView shows a subscription group with names, prices and a buy button (Apple).Transaction.currentEntitlements lists the customer's active, verified purchases and leaves out refunded ones (Apple).Transaction.updates delivers renewals, offer codes and purchases from other devices while the app runs (Apple).func isPro() async -> Bool {
for await result in Transaction.currentEntitlements {
if case .verified(let transaction) = result, transaction.productID.hasPrefix("pro_") {
return true
}
}
return false
} Decision table
Find the row that matches your app. If every row you need says StoreKit 2 is enough, you do not need RevenueCat or RevenueDot yet.
| Your situation | StoreKit 2 alone | With a backend |
|---|---|---|
| One iOS app that checks access on the device | Enough. Use currentEntitlements and listen to updates | Not needed yet |
| You add an Android app or a web version | Covers App Store purchases only | One customer, one entitlement across App Store, Google Play and Stripe |
| Your server or website must know who paid | You build a server that calls the App Store Server API | Server-side entitlements through a REST API |
| You want purchase events in your backend, Slack or analytics | No webhooks; you build a notification receiver | Webhooks and integrations |
| You want MRR, churn and trial conversion | App Store Connect reports, Apple only | Charts across every store |
| You want to change paywalls or prices without a release | You build remote config yourself | Remote paywalls, offerings and A/B tests |
| Apple asks for refund consumption data | Your server must answer within 12 hours | Answered for you (Refund Control) |
Apple sources: App Store Server API · Send Consumption Information · App Store Server Notifications.
The real work
The first purchase takes an afternoon. These cases take the weeks, because each one needs code, a test and a server that is always on.
RevenueDot
RevenueDot is an open-source backend that works with the RevenueCat SDK, so you get the same SDK and paywalls without a RevenueCat account. It handles the App Store, Google Play, Amazon Appstore and Stripe in one customer record, with webhooks, 43 charts, paywalls and Refund Control. RevenueDot Cloud is free up to $10,000 a month, and you can self-host it.
It is new: it launched in 2026, has far less production history than RevenueCat, and has no SOC 2 report. Test your app in Apple's sandbox before launch. You can also start with StoreKit 2 today and add a backend when you add Android. See how to add subscriptions.
FAQ
For an iOS-only app that checks access on the device, yes. StoreKit 2 loads products, runs the purchase, verifies transactions and lists what the customer owns. Add a backend when you need Android or web customers, server-side access checks, webhooks, charts or paywall tests.
Not for access inside the app, because StoreKit verifies signed transactions on the device. You need a server when something outside the app must trust the purchase, such as your API or website. Apple's App Store Server API and server notifications are built for that.
When you add a second store or web checkout, when your backend must know who paid, when you want purchase events and revenue charts, or when the edge cases (grace periods, refunds, offer codes, Family Sharing) start costing more time than the backend costs money.
Yes. Your products and subscribers stay in App Store Connect. When you add the RevenueCat SDK pointed at RevenueDot, call its restore or sync method so existing subscribers are recorded on the server, and set Apple's server notification URL to RevenueDot.
No. RevenueDot uses the open-source RevenueCat SDK with its own keys and its own server. You never sign up with RevenueCat. RevenueDot is not affiliated with RevenueCat.
Get started
Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.
Already have an account? Sign in · Prefer your own servers? Self-host free