How to Intercept Negative Reviews Before They Hit the App Store
02 Mar 2025
A single one-star review can undo months of hard-earned five-star ratings. For apps with fewer than a thousand reviews, just a handful of negative ratings can drop your average by a full star — pushing you below the critical 4.0 threshold where downloads start to decline. The worst part? Most of these negative reviews are preventable.
In this guide, we'll walk through a multi-step review interception pattern that routes unhappy users to an in-app feedback form while directing satisfied users to the native review dialog. The result: negative feedback stays private and actionable, while your public rating climbs. We'll implement the entire flow using the Amply SDK.
The Multi-Step Review Interception Pattern
- Show a custom rating popup after a value moment
The user sees an in-app prompt asking them to rate their experience from 1 to 5 stars. This is not the native review dialog — it's your own UI.
- Route based on the rating
Users who give 4-5 stars are directed to the native Rate Review dialog. Users who give 1-3 stars are deeplinked to an in-app feedback form.
- Capture negative feedback privately
The feedback form collects the reason for dissatisfaction, which you can track, categorize, and act on — all without it ever becoming a public review.
The goal isn't to suppress negative feedback. It's to give yourself a chance to fix the problem before it becomes permanent public damage.
Step 1: The Custom Rating Popup
Timing is everything. You want to trigger your custom rating popup after a value moment. The popup presents a star rating selector. When the user taps a rating, you track it as an event and store it as a custom property for targeting:
// Track the rating event when the user submits
AmplySDK.track("CustomRatingGiven", mapOf(
"rating" to selectedRating,
"screen" to "post_workout_summary"
))
// Store as a custom property for campaign targeting
AmplySDK.setCustomProperties(mapOf(
"last_custom_rating" to selectedRating
))Step 2: Routing Happy vs. Unhappy Users
After the user submits their custom rating, two separate Amply campaigns react to the CustomRatingGiven event — each with different targeting criteria:
Campaign A: Happy Path (4-5 Stars)
Target users where last_custom_rating >= 4. The campaign action is Rate Review, which triggers the native App Store / Google Play review dialog.
Campaign B: Recovery Path (1-3 Stars)
Target users where last_custom_rating < 4. The campaign action is a Deeplink to happens://feedback-form, which opens your in-app feedback form.
// Handle the feedback form deeplink in your app
AmplySDK.setDeeplinkHandler { url ->
if (url.contains("feedback-form")) {
showFeedbackForm()
}
}This uses multi-campaign chaining: Campaign A fires the CustomRatingGiven event, which triggers either Campaign B or Campaign C based on the custom property value. No hardcoded branching logic required.
Step 3: The In-App Feedback Form
Keep it short — a category selector and a free-text field are usually enough. When the user submits, track the feedback with structured event parameters:
// Track negative feedback with categorized reasons
AmplySDK.track("NegativeFeedbackProvided", mapOf(
"reason" to "app_crashes",
"rating" to 2,
"detail" to "Crashes every time I open settings"
))Every piece of negative feedback that stays in-app is a one-star review that never reaches the App Store.
Setting Up with Amply
- Create Campaign 1: Custom Rating Popup
Set the trigger to your value-moment event. Use session-level impression limits to avoid showing it more than once per session.
- Create Campaign 2: Native Rate Review
Set the trigger to CustomRatingGiven. Add filter: last_custom_rating >= 4. Set action to Rate Review.
- Create Campaign 3: Feedback Redirect
Set the trigger to CustomRatingGiven. Add filter: last_custom_rating < 4. Set action to Deeplink happens://feedback-form.
Code Implementation
// 1. Register your deeplink handler at app startup
AmplySDK.setDeeplinkHandler { url ->
if (url.contains("feedback-form")) {
showFeedbackForm()
}
}
// 2. When the user submits a custom rating
fun onCustomRatingSubmitted(rating: Int, screen: String) {
AmplySDK.track("CustomRatingGiven", mapOf(
"rating" to rating,
"screen" to screen
))
AmplySDK.setCustomProperties(mapOf(
"last_custom_rating" to rating
))
}
// 3. When the user submits the feedback form
fun onFeedbackSubmitted(reason: String, rating: Int, detail: String) {
AmplySDK.track("NegativeFeedbackProvided", mapOf(
"reason" to reason,
"rating" to rating,
"detail" to detail
))
}Three functions, three SDK calls. The Amply dashboard handles the conditional routing, impression limits, and action execution.
Measuring Rating Protection
- 1-2 star App Store review reduction
Compare weekly low-star reviews before and after. A 40-60% reduction is realistic.
- Average rating growth
Track your rolling 30-day average rating for steady upward movement.
- Feedback category distribution
Aggregate the reason parameter from NegativeFeedbackProvided events to prioritize fixes.
- Interception rate
Percentage of low-rating users who submit feedback through the in-app form instead of going to the App Store.
Conclusion
Negative App Store reviews are not inevitable. With a well-designed interception pattern, you can catch dissatisfied users at the moment of frustration, give them a private channel to voice their concerns, and earn the chance to fix the problem before it becomes public.
The pattern we've built — custom rating popup, conditional routing, in-app feedback form — requires minimal client code and zero app updates to adjust. Stop treating negative reviews as an unavoidable cost. Start intercepting them.