Critical Moments Docs
Quick StartHomepageAccount
  • Documentation Home
  • What is Critical Moments?
  • Quick Start
  • Concepts Overview
  • Remote Control / Service
    • Host Config on Github Pages
  • Config File Structure
  • Demo App
  • Homepage & Account
  • πŸ“šGuides
    • Mobile App Toolbox: 13 Features Most Apps Need
    • Reduce App Churn with Notifications
    • Improve your App Store Rating
    • Feature Flags Guide
  • ⏰Notifications
    • Intro to Notifications
    • Notifications Spec
    • Smart Delivery
    • Badges
  • 🎯Conditional Targeting
    • Intro to Conditions
    • Built-in Properties
    • Custom Properties
    • Syntax and Operators
    • Conditional Guides
      • Working with Dates
      • Locations and Weather
      • Event and Property History
  • πŸŽͺEvents
    • Event Overview
    • Recommended Events
    • Built-In Events
  • πŸ’¬Actions / In App Messaging
    • Actions Overview
    • Modals
      • Modal Content Sections
      • Modal Buttons
      • Modal Images
    • Banners
    • Alerts
    • App Reviews
    • Open Link
    • Custom Actions
    • Conditional Actions
    • Triggers
  • 🎨Themes
    • Theme Overview
    • Built In Themes
  • β›³Feature Flags
    • Feature Flag Guide
    • Conditional Feature Flags
    • Named Conditions Config
  • πŸ”‘Trustless SaaS
  • πŸ‘‹Support
  • πŸ‘©β€πŸ’»SDK API Reference
Powered by GitBook
On this page
  • Step 1: Install Critical Moments
  • Step 2: Log important events
  • Step 3: Add a Smart App Review Action
  • Step 4: Trigger the Smart Review
  • You're done!
  • Optional Improvements
  • Optional Step 1: Refine your app-review targeting condition
  • Optional Step 2: Refine app-specific logic in your conditional targeting
  • Optional Step 3: Consider a Pre-review Prompt UI
  • Optional Step 4: A/B Test to Find Optimal Targeting

Was this helpful?

  1. Guides

Improve your App Store Rating

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

Last updated 7 months ago

Was this helpful?

This guide will walk you through using 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 to integrate Critical Moments into your app.

Step 2: Log important 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")
[CriticalMoments.shared sendEvent:@"completed_task"];

Step 3: Add a Smart App Review Action

Add the a smart app review action to the 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!

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

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

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

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:

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
    }
},

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

Here is an example to be added to your . 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).

You're done!

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

Read the , or jump to a section that sounds relevant to your app:

: for memory/cpu/gpu intensive apps

The events you instrumented in step 2 can be used here, as well as the like app_install_date.

Our has a longer discussion on how to format this prompt to best help users and maximize ratings.

You can get creative here. Explore different text in your alert, trying a fully native , a less intrusive , or an inline UI asking for a review which still checks the condition using a . You can also change this UI over time, !

We've written 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.

πŸ“š
βœ…
Critical Moments
How to use targeting to improve app store rating
How to help users and improve your app rating through better UI
quick start guide
Instrument events
config file
trigger section
config file
blog post
full blog post here
Exclude older devices
Exclude outdated app versions
Excluded outdated operating systems
Exclude OS versions with bugs
Pause after major UX updates
Check essential app permissions
Avoid users with negative experiences
Pause prompting when appropriate
Other creative options to improve your rating
properties built-in to Critical Moments
blog post on app review UI
modal UI
banner request
conditional feature flag
updating over-the-air without app updates
a blog post
SKStoreReviewController
Custom review pre-prompt