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: Instrument 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?

Instrument any event you might want to use. Even if you aren’t using them all in your first version, they may be useful later for iteration. By tracking them from the start you’ll have more history to query, and more options to improve your targeting.

Step 3: Create 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).

With Critical Moments, you can create a conditional string checking for the right conditions, and push updates over the air, without code updates.

To quickly get started, here is a starter condition template we suggest for most apps. Read through each condition, remove any you don’t want to include. Uncomment any of the optional checks which make sense for your app.

/* 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 '&&' */

Step 4: Add app specific logic to 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.

Step 5: Pick your trigger

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!

To define your trigger consider:

  • Which event starts the trigger: trigger.eventName. In the example below it’s a completed_task event, a custom event from our hypothetical Todo list app.

  • Add any count checks you want. In the example below the trigger.condition checks that the user has completed at least 3 tasks before firing the trigger. If you don’t want a count check, this can be excluded. If you’ve already defined these in step 4, there’s no need to add them here as well.

Here is an example trigger section to be added to your config file. It will fire the ask_for_review action when these condition are met (we'll define this action in the next step).

"triggers": {
    "namedTriggers": {
        "app_review_trigger": {
            "eventName": "completed_task",
            "actionName": "ask_for_review",
            "condition": "eventCount('completed_task') >= 3"

Step 6: Setup your app review prompt action UI

Finally, decide what you want your app review prompt to look like. To do this we’ll define an action named ask_for_review in your config file. While you can change this name, be sure to update the references to it in your trigger and conditional targeting string from earlier steps.

You’ll include the condition targeting string from Step 3/4 as the action’s condition. The action won’t fire unless your condition passes.

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

The simplest option is to use the system’s native review prompt. On iOS this is an SKStoreReviewController:

The action configuration for this option is as follows:

"ask_for_review": {
    "actionType": "review_prompt",
    "condition": "[CONDITION STRING FROM STEP 3/4]",
    "actionData": {}

Alternatively, you can show a custom UI offering options to review or get help. Here’s a visual example:

The action configuration for this option is as follows. Be sure to replace the app name and help page link with your own:

"ask_for_review": {
    "actionType": "alert",
    "condition": "[CONDITION FROM STEP 3/4]",
    "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!

Step 7: Bring it all together

Now that you have your targeting condition from step 3/4, your trigger from step 5, and your prompt action from step 6 defined, you can add them all to your Critical Moments config!

    "configVersion": "v1",
    "appId": "YOUR_BUNDLE_ID",
    "triggers": {
    "actions": {

Try it out in your dev environment and ensure everything works as expected. At this point your app review prompt should be fully functional. All that's left is to deploy it!

Optional Next Step: Improve Targeting

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: 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