How to Intercept Negative Reviews Before They Hit the App Store

Stan

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

  1. 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.

  2. 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.

  3. 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

  1. 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.

  2. Create Campaign 2: Native Rate Review

    Set the trigger to CustomRatingGiven. Add filter: last_custom_rating >= 4. Set action to Rate Review.

  3. 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.