Google Play In-App Review API: Best Practices and Testing
Google Play In-App Review API best practices: when to call requestReviewFlow, how the quota works, Google's design rules and how to test before launch.
ScreenShipper team · · 8 min read
Quick answer: The Google Play In-App Review API shows a native rating card inside your app. You request a ReviewInfo object with requestReviewFlow(), then show the card with launchReviewFlow(). Google applies an undisclosed, time-bound quota, so the card may not appear. Never trigger it from a button, never ask "Do you like the app?" first, and test through an internal test track.
How the In-App Review API works
The API is part of the Google Play Core libraries. When you launch the flow, Google Play draws a bottom card where people pick one to five stars and can add an optional comment. The review is sent to the Play Store and appears publicly after Google's usual processing; Play Console Help says new reviews are generally held back for around 24 hours.
Before you write any code, check the requirements Google currently lists:
| Requirement | Details |
|---|---|
| Devices | Android phones, tablets and TVs with Google TV running Android 5.0 (API level 21) or higher, with the Play Store installed |
| ChromeOS | Chromebooks that have the Play Store installed |
| Library | Play Core library 1.8.0 or higher; the current docs use com.google.android.play:review (plus review-ktx for Kotlin) |
| Platforms | Kotlin or Java, native C++, Unity and Unreal Engine each have an integration guide |
| Distribution | The app must be available on Google Play, at least on the internal testing track |
Two behaviors shape everything else. First, the API never tells you whether the card was shown or whether the person left a review. Second, Google can decline to show the card because of its quota. Your code has to work the same way in every case.
Integrate it in Kotlin or Java
The flow has two calls, and Google's guide recommends a specific order:
- Add the
com.google.android.play:reviewdependency from Google's Maven repository. Kotlin projects can addcom.google.android.play:review-ktxfor coroutine-friendly extensions. - Create a manager with
ReviewManagerFactory.create(context). - When your app reaches a good moment (for example, the player finishes a level), call
manager.requestReviewFlow(). If the task succeeds, keep the returnedReviewInfo. If it fails, read the error code fromReviewExceptionand log it. - Call
manager.launchReviewFlow(activity, reviewInfo)and wait for the task to complete before you continue, such as advancing to the next level. - In the completion listener, continue your normal flow no matter what happened. Google is explicit that an error during the review flow should not be shown to the user.
Note: The ReviewInfo object is only valid for a limited time. Google suggests requesting it slightly ahead of time, but only once you are certain you will launch the flow. Don't fetch it at app start and use it an hour later.
Cross-platform frameworks such as Flutter and React Native rely on plugins that wrap these same two calls, so the rules below apply to them too.
Quotas: why the review card sometimes doesn't show
Google Play enforces a time-bound quota on how often one person can see the review card. Google's documentation says that calling launchReviewFlow more than once in a short period, giving "less than a month" as an example, might not display a dialog. It also says the exact quota is an implementation detail that can change without notice.
That has three practical consequences:
- No "Rate us" button wired to the API. If the person has hit the quota, tapping the button does nothing, which looks broken. For a permanent rating link in your settings, send people to your Play Store listing instead, for example with a
market://details?id=your.package.nameintent. - Your own throttle comes first. Decide when someone qualifies (sessions, days since install, success events) and remember when you last asked. Treat the quota as a ceiling you should rarely reach.
- No retry loops. If nothing appeared, you have no way of knowing why, and calling again right away only burns quota.
Google's rules for when and how to ask
Google publishes strict guidelines for this API, and Play policy backs them up. Here is the short version:
| Do | Don't |
|---|---|
| Trigger the flow after the person has used your app enough to give useful feedback | Prompt excessively, which frustrates people and burns quota |
| Show the card as-is | Change its size, opacity, shape or any other property |
| Keep the card on the topmost layer until Play removes it | Add overlays on or around the card, or remove it in code |
| Continue your normal flow after the call completes | Ask any question before or during the card, such as "Do you like the app?" or "Would you rate us 5 stars?" |
| Prompt in a clear, non-deceptive way | Offer discounts, coins or other rewards for ratings |
The last row comes from Google Play's User Ratings, Reviews, and Installs policy, which prohibits incentivized ratings and forced or deceptive rating pop-ups. Filtering people with a sentiment question before showing the card breaks the API guidelines even if you don't offer a reward.
Good moments look the same as on iOS: right after a completed workout, a finished project, a won level or a reached goal. Bad moments are app launch, onboarding, errors and paywalls.
How to test the in-app review flow
You can't fully test the review card on an app that isn't on Google Play, but you don't need a production release either. Google documents three options:
| Method | What you see | Main limits |
|---|---|---|
| Internal test track | The real card, and you can submit a review | Tester account must be in the track, selected as the primary account in the Play Store, have the app in its Play library, and have no existing review |
| Internal app sharing | The real card for fast iteration | You can't submit; the button is disabled |
FakeReviewManager | No UI at all | Only for unit or integration tests; always returns a fake ReviewInfo and a success result |
Google notes that quota limits are not enforced when the app was downloaded from the internal test track. Once the tester account has installed the app from that track, you can deploy newer builds to the same device from Android Studio and keep testing.
If the card still doesn't show, work through Google's troubleshooting list:
- The
applicationIdisn't on any Play track yet. Upload it to internal testing. - The app isn't in the account's Play library. Download it once from the Play Store with that account.
- Several accounts are on the device and the primary one isn't selected in the Play Store.
- The account is protected, such as an enterprise account. Use a regular Gmail account.
- The account already reviewed the app. Delete that review in the Play Store.
- The Play Store was sideloaded. Use a device with a valid Play Store and Google Play services.
How it compares with the iOS review prompt
If you ship on both platforms, you can share most of your timing logic, but not your assumptions:
| Google Play In-App Review API | iOS review prompt | |
|---|---|---|
| Display limit | Undisclosed quota that can change | Up to three times in 365 days, documented by Apple |
| Feedback to your app | None | None |
| Button-triggered prompt | Not allowed in practice; link to the listing instead | Not allowed; use the action=write-review link |
| Pre-test without release | Internal test track or internal app sharing | Debug builds always show it; TestFlight shows nothing |
The iOS in-app review prompt guide covers Apple's side in detail. Once reviews start arriving, reply to them: Play notifies the reviewer by push and email when you answer. Our guide on how to respond to app reviews includes templates, and how to get more app reviews covers the wider funnel. If you're still preparing your listing, start with the Google Play store listing guide.
Frequently Asked Questions
Why is the Google Play in-app review dialog not showing?
Usually because the quota was reached, the account already reviewed the app, the app isn't in that account's Play library, or the build wasn't installed through a Play track. Testing from the internal test track removes the quota and makes the cause easier to find.
Can I tell whether the user left a review?
No. The completion listener fires either way, and Google states the API doesn't indicate whether the person reviewed or even whether the dialog was shown. Check Play Console for incoming ratings instead.
How often can I call launchReviewFlow?
Google doesn't publish the number. Its documentation only says that calling it more than once in a short period, such as less than a month, might not show a dialog. Ask far less often than that, at moments you choose.
Does the In-App Review API work in closed testing?
Yes. Google's data safety notes say that when the app is in a closed test track, the rating and comment are shared privately with the developer instead of being posted publicly.
Can I use the API on Android TV or Chromebooks?
Google lists TVs with Google TV running Android 5.0 or higher and ChromeOS devices with the Play Store installed as supported, alongside phones and tablets.
Sources
Localize your screenshots in 50 languages
Add languages to one design, translate with AI on Pro and get warnings when a headline overflows.