Improve your App Store Rating

How to target app review prompts to increase your App Store rating.

This guide will walk you through using Critical Moments to prompt users to review your app at the optimal time to maximize your app store rating.

You can also read our blog post series on app reviews, which which discusses these topics in more depth:

Step 1: Install Critical Moments

Follow our quick start guide to integrate Critical Moments into your app.

Step 2: Log important events

Instrument events in your app so your app review prompt can fire at the right moment, and target the right users.

This includes 2 categories of events:

  • Events that determine the timing of the app review prompt. For example, a Todo list app might want to ask for a review after a user completes a task, or a backup app might want to ask when the user completes a backup.

  • Events which impact if a user is a good candidate to ask. For example, have they used all the key features in your app? Have they hit a critical error that would make their experience less than stellar?

CriticalMoments.shared().sendEvent("completed_task")

Step 3: Add a Smart App Review Action

Add the a smart app review action to the config file you created. The template below is a great starting point for any app. It checks the following before asking a user for a review:

  • Don't show a review prompt if one has been shown in the last 21 days (504h)

  • Check the min app version we want to ask for reviews on. Set to v1.0 here, but you can increase this over time, remotely disabling reviews on older or buggy builds.

  • Check for times to avoid which are correlated to lower reviews: low power more, no network connection, low data mode, or a battery under 20%.

  • Check the user isn't running very outdated version of iOS (before iOS 16)

{
    "configVersion": "v1",
    "appId": "YOUR_APP_ID",
    "actions": {
        "namedActions": {
            "smartReviewAction": {
                "actionType": "review_prompt",
                "actionData": {},
                "condition": "(eventCount('system_app_review_requested') == 0 || latestEventTime('system_app_review_requested') < now() - duration('504h')) && versionGreaterThan(app_version, '1.0') && !device_low_power_mode && has_active_network && !low_data_mode && device_battery_level > 0.2 && !versionLessThan(os_version, '16.0')"
            }
        }
    }
}

When this action is fired, you'll see the system review prompt:

Step 4: Trigger the Smart Review

Each app has a special moment where the user feels its value: reaching a streak in Duolingo, completing a meditation in Calm, or finishing backing up your photos in Google Photos. In that moment the user feels maximal appreciation for the app, and its place in their life. This is the best time to prompt for an app review!

Here is an example trigger section to be added to your config file. It will fire the smartReviewAction action when a completed_task event is fired in the app (done in step 2). We also add a conditional check here: wait until at least 3 tasks have been completed (optional).

"triggers": {
    "namedTriggers": {
        "completedTaskReviewTrigger": {
            "eventName": "completed_task",
            "actionName": "smartReviewAction",
            "condition": "eventCount('completed_task') >= 3"
        }
    }
}

If you app has multiple good moments to ask for a review, simply add more triggers in your config calling the smartReviewAction.

You're done!

Everything should now work!

Test that the app review appears in your app when you complete the trigger. During testing you may want to temporarily remove the condition which only shows the review prompt once every 21 days.

Optional Improvements

The following steps are optional enhancements to further improve your app review logic.

Optional Step 1: Refine your app-review targeting condition

Prompting the right set of users to review your app is essential to improving your app rating. You want to pick users who have had sufficient experience with your app, who aren’t experiencing any negative conditions (like low battery or no network connection).

We started with a base-template above. The list below offers an even longer set of options you can add to your smartReviewAction.condition string to tune app review timing.

/* Device condition checks we suggest for almost all apps */
device_battery_level > 0.2 && 
!device_low_power_mode && 
has_active_network && 
!low_data_mode &&
device_orientation != 'face_up' && 
device_orientation != 'face_down' && 
foreground && 

/* Optional device checks. You decide if these make sense for your app */
!other_audio_playing && 
!on_call && 
!has_car_audio &&

/* Check last prompt time was not in last 21 days. Note: this uses the 'ask_for_review' action we fire below.  */
(
  eventCount('ask_for_review') == 0 || 
  latestEventTime('ask_for_review') < now() - duration('504h')
) &&

/* Check the app wasn't installed in last week */
app_install_date < now() - duration('168h') &&

/* Check their app version isn't too old. Comment out until you have old clients you no longer want to request reviews on */
/* versionGreaterThan(app_version, '2.4.0') && */

/* Check the app version isn't in the 'known buggy versions' list. Commented out until you have versions you wish to add. */
/* app_version not in ['buggy_version_1', 'buggy_version_2'] && */

/* Out of date OS check */
!versionLessThan(os_version, '16.0') &&

/* only prompt users who's native language is supported in your UI. Uncomment once you set the correct values in the list. */
/* locale_language_code IN ['en', 'es', 'de'] && */

/* Trailing 'true' to make editing this template easier, as lines above end in '&&' */
true

We’ve written a blog post with additional ideas to improve the targeting and timing of your app rating prompt with the goal of improving your overall rating.

Read the full blog post here, or jump to a section that sounds relevant to your app:

Optional Step 2: Refine app-specific logic in your conditional targeting

The template above only considers factors that apply to every app (low battery, is the user on a phone call, etc). It’s also important to check the user has had adequate time to engage with your app's core features before asking for a review. This assures that they have a well-rounded experience to base their review on.

Some examples:

  • For a game: max_level_reached >= 5

  • For a language learning app: eventCount('picked_language') > 0 && eventCount('completed_written_lesson') > 2 && eventCount('completed_spoken_lesson') > 2

  • For a meditation app: eventCount('completed_meditation') > 3

The events you instrumented in step 2 can be used here, as well as the properties built-in to Critical Moments like app_install_date.

Add this conditional logic to the contition you defined in step 3.

Optional Step 3: Consider a Pre-review Prompt UI

It may make sense to ask users if they need help/support before directing them to the review prompt. Directing users in need of help to your support channels can help improve their experience, while cutting down on negative reviews.

Here’s a visual example:

Our blog post on app review UI has a longer discussion on how to format this prompt to best help users and maximize ratings.

We can update our config file to create this UI entirely in config as follows. Be sure to replace the app name and help page link with your own:

"smartAppReview": {
    "actionType": "alert",
    "condition": "[CONDITION FROM EARLIER STEPS]",
    "actionData": {
        "title": "Enjoying [APP NAME]?",
        "message": "If you’re enjoying [APP NAME], we would greatly appreciate an app review!\n\nIf you are having an issue, our Help Docs and support team are here to help!",
        "showOkButton": false,
        "showCancelButton": false,
        "customButtons": [
            {
                "label": "Rate Us",
                "actionName": "system_app_review",
                "style": "primary"
            },
            {
                "label": "Help, Feedback & Contact Us",
                "actionName": "help_page"
            },
            {
                "label": "Not Now"
            }
        ]
    }
},
"system_app_review": {
    "actionType": "review_prompt",
    "actionData": {}
},
"help_page": {
    "actionType": "link",
    "actionData": {
        "url": "https://[YOUR SUPPORT URL]",
        "useEmbeddedBrowser": true
    }
},

You can get creative here. Explore different text in your alert, trying a fully native modal UI, a less intrusive banner request, or an inline UI asking for a review which still checks the condition using a conditional feature flag. You can also change this UI over time, updating over-the-air without app updates!

Optional Step 4: A/B Test to Find Optimal Targeting

We've written a blog post explaining how you can implement A/B testing of your app review targeting. This allows you to find the optimal target to improve your app store rating.

Last updated