How to time iOS subscription review prompts: a lifecycle-aware strategy with requestReview()
Most subscription apps burn Apple's three annual review prompt slots on low-sentiment moments. This guide maps requestReview() calls to subscription lifecycle events — trial conversion, renewals, milestones — where subscribers are most likely to leave a positive rating.
App Store ratings sit near the top of the subscription conversion funnel. Data shared by platforms including AppFollow and Sensor Tower consistently indicate that conversion from product-page browse to download correlates with average rating, and for subscription apps, even a fractional difference can shift paywall performance. A 4.7-star average is practically invisible — users expect it. A 4.1 triggers hesitation at precisely the moment you most need confidence.
Yet most subscription apps handle review prompts as an afterthought. A single requestReview() call fires at a generic trigger — session count three, or a 10-second timer after app open — with no relation to what the subscriber just experienced. This post builds a lifecycle-aware framework: matching prompts to moments when subscriber sentiment peaks, making the most of Apple's tightly capped annual budget.
How Apple's requestReview() actually works
Two persistent misconceptions distort most implementations.
Calling the API does not guarantee a dialog appears. Apple's system decides whether to display the native review prompt or suppress it silently. The documented constraint is that the system will not show the prompt more than three times in any 365-day period, per app, per device. Calling requestReview() a hundred times in a session produces no errors — it just does nothing after the internal cap is met. Developers have no visibility into how many slots have been used.
The API has evolved across StoreKit versions. For iOS 16 and later, the recommended approach uses the scene-based method:
if let scene = UIApplication.shared.connectedScenes
.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
AppStore.requestReview(in: scene)
}
The older SKStoreReviewRequestAPI.requestReview() remains valid on iOS 14–15. Both respect the same three-per-year cap. Apple's documentation makes clear that developers cannot override this cap, customize the prompt's text, or intercept the user's response — the API is intentionally opaque.
Strategic implication: Three prompts per year is a scarce resource. A subscription app that fires one at app launch — before the user has formed any opinion — has burned 33% of its annual budget on the lowest-sentiment moment in the subscriber journey. Each call should be deliberate, targeting a moment when the probability of a positive response is highest.
Mapping subscription lifecycle events to sentiment peaks
Auto-renewable subscriptions create structured lifecycle events that one-time-purchase apps don't have. These events carry direct sentiment signal if you know how to read them.
- Trial-to-paid conversion. A user who just completed a free trial and paid for the first time has made an active value judgment in your app's favour. Research from RevenueCat and Adapty consistently identifies this as the highest-satisfaction moment in the subscription arc — the subscriber has weighed alternatives and chosen to stay.
- First meaningful premium action. The first time a subscriber uses the premium feature they specifically paid for — whether that's exporting a document, unlocking a level, or accessing an advanced dashboard — is a goal-accomplishment moment that transfers well to a rating prompt.
- First auto-renewal (month 2 or 3). A subscriber who let the initial billing period pass without cancelling has signalled continued approval. This implicit retention event is often underused as a review trigger despite being one of the clearest satisfaction signals available. Phiture's mobile growth research suggests that engagement-based triggers tend to outperform time-based ones for review quality.
- Milestone completion. For productivity, fitness, and utility subscription apps, reaching a measurable milestone — a tenth export, a streak completion, a hundredth session — creates a moment of accomplishment that pairs naturally with an ask for feedback.
The subscription lifecycle also tells you when not to prompt. Immediately after a billing event — especially an unexpected charge — is high-risk. During or after a grace period or billing retry sequence, users may already be frustrated. Post-cancellation re-engagement flows are obviously poor timing. Mid-onboarding, before the user has formed a view of the product, is too early to get meaningful signal.
Timing strategies compared
| Trigger point | Subscriber state | Sentiment risk | Recommended? |
|---|---|---|---|
| App launch (session 3–5, no context) | Free or early trial user | Medium — no value delivered yet | Weak baseline only |
| Trial-to-paid conversion event | Just became paying subscriber | Low — peak satisfaction window | Strongly recommended |
| First use of premium feature | Active paid subscriber | Low — goal just accomplished | Strongly recommended |
| First auto-renewal (month 2) | Retained paid subscriber | Low — implicit satisfaction signal | Recommended |
| Feature milestone (streak, export count) | Engaged active subscriber | Low — accomplishment moment | Recommended for utility/productivity apps |
| Post-cancellation | Churned or lapsing | High — user has already exited | Avoid |
| Grace period or billing retry | Payment issue in progress | High — potential frustration | Avoid |
| Immediately after major app update | Any state | Variable — new bugs may surface | Only after a stable release cycle |
A sensible allocation of three annual prompts for most subscription apps looks like: one at trial conversion (or first premium feature use if no trial is offered), one at the second or third renewal, and one reserved for a significant feature launch or milestone. Subscribers prompted at these moments are substantially more likely to leave genuine 4–5 star reviews than users prompted at arbitrary session counts.
Implementation: receiving lifecycle events in your app
To trigger a review prompt at subscription lifecycle moments, your app needs to observe those events in real time. With StoreKit 2 (iOS 15+), Transaction.updates provides an async sequence of verified transactions as they arrive:
for await result in Transaction.updates {
guard case .verified(let transaction) = result else { continue }
if transaction.productType == .autoRenewable {
// New renewal or trial conversion detected
await triggerReviewPromptIfEligible()
}
await transaction.finish()
}
This listener should run for the lifetime of your app session, typically started in your App struct or AppDelegate. When a new transaction arrives matching your criteria, set a local flag and trigger the prompt on the next clean foreground moment — after a short settling delay so that any post-payment UI has resolved.
If your backend also receives App Store Server Notifications, the DID_RENEW notification type signals a successful auto-renewal. You can use this as a push trigger to set a flag the app reads on next launch. This complements the StoreKit-side listener rather than replacing it — the server notifications lifecycle guide covers the full event taxonomy.
Distinguish renewals from plan changes. A subscriber upgrading from monthly to annual also generates a new transaction event. Plan changes don't carry the same satisfaction signal as organic renewals — avoid triggering a review prompt on them unless you've verified the user completed the upgrade voluntarily. Check transaction.subscriptionGroupID and compare previous vs. current transaction.productID to identify upgrades versus renewals.
Avoid burning prompt slots in rapid succession. If your app detects a trial conversion and, in the same week, the subscriber's first auto-renewal, you should not prompt twice. Use a local flag stored in UserDefaults or your app's state layer to ensure at least 60–90 days pass between prompts. This both conserves your annual budget and avoids creating a pattern that App Review could flag as aggressive.
The territory dimension: ratings are market-specific
A detail many developers overlook: App Store ratings are territory-specific. Your global average rating does not aggregate uniformly across all markets — each storefront accumulates its own review count and average. This has a direct consequence for subscription apps with meaningful revenue in specific territories.
If you have a significant subscriber base in Germany, Japan, or Brazil, those markets may have lower review volumes and more volatile averages than your primary English-language market. A handful of negative reviews in a smaller territory can drag down the local average materially. Targeting review prompts to active, retained subscribers in those markets — using territory awareness from StoreKit or your subscription analytics platform — can help stabilize ratings where you're most commercially exposed.
Localization also affects the experience leading up to the prompt. A subscriber who uses your app in their native language, encounters clear pricing, and accomplishes their goal without friction is already primed for a positive rating. The review prompt converts existing satisfaction — it doesn't create it. If the in-app purchase localization layer or the paywall copy feels generic or mistranslated, no review timing strategy compensates for that friction. For apps managing territory-level subscription pricing, the AppsOps pricing tool can surface which markets deserve closer attention.
The subscription lifecycle approach to review prompts scales naturally as your app matures. Early on, trial conversion and first premium use cover most of the calendar year. As retention cohorts deepen, renewal-based triggers kick in and add a second wave of high-quality reviews. The result is a compounding feedback loop: better ratings improve conversion, which grows the subscriber base, which generates more lifecycle events to prompt on.
Sources and further reading
- Apple Human Interface Guidelines: Ratings and Reviews
- Apple Developer Documentation: StoreKit framework
- RevenueCat Blog: iOS subscription analytics and lifecycle management
- Phiture Mobile Growth Stack: ASO, ratings, and engagement research
- AppFollow Blog: App Store review management and analytics
- Sensor Tower Blog: App Store performance benchmarks and research
Share this post
Ready to put this into practice?
AppsOps is the first App Store ops dashboard — PPP-fair pricing for 175 App Store territories, AI metadata localization in 39 languages, AI screenshot localization for 14 Apple device classes, and one-click App Store Connect API push — all from one dashboard, all for $19/month.
Try AppsOps free — no card →