Skip to content
This repository was archived by the owner on Apr 18, 2026. It is now read-only.
This repository was archived by the owner on Apr 18, 2026. It is now read-only.

In-App Review Quota? #42

Description

@moldovev

Hi, here is my setup for the In-App Review:

I have a button which triggers the In-App Review process. I know it is not the recommended way but for me it's the way that makes sense for my app.

The current behavior that happens is that the Review dialog shows the first time the user taps the Review button, but it does nothing if the user cancels the review dialog and taps the Review button again. I believe this scenario happens?

"To provide a great user experience, Google Play enforces a quota on how often a user can be shown the review dialog. Because of this, calling a launchReviewFlow method might not always display a dialog. For example, you should not have a call-to-action option (such as a button) to trigger a review as a user might have already hit their quota and the flow won’t be shown, presenting a broken experience to the user." (from here: https://developer.android.com/guide/playcore/in-app-review#quotas)

  1. What is the quota? is it once every 12 hours, once every 3 hours, once per day, etc. ? When does it reset?
  2. If there is no dialogue displayed, the code still executes successfully and there is no error. Is there a way for me as a developer to know if the In-App Dialog has not been displayed due to quota limits? What I want to achieve is that if the quota is reached, then I want to open the classical link to the Play Store and let the user review the old fashioned way.
private ReviewManager _reviewManager;
 private PlayReviewInfo _playReviewInfo;
 private string errorMessage;

IEnumerator OpenRateGameAPI()
	{
		_reviewManager = new ReviewManager();
		errorMessage = string.Empty;

		Debug.Log("Request ReviewFlow");
		var requestFlowOperation = _reviewManager.RequestReviewFlow();
		yield return requestFlowOperation;
		Debug.Log("RequestFlow result: " +requestFlowOperation.ToString());

		if (requestFlowOperation.Error != ReviewErrorCode.NoError)
		{
			errorMessage = requestFlowOperation.Error.ToString();

			Debug.Log(errorMessage);

			yield break;
		}

		_playReviewInfo = requestFlowOperation.GetResult();


		Debug.Log("Launch Review Flow");
		var launchFlowOperation = _reviewManager.LaunchReviewFlow(_playReviewInfo);		
		yield return launchFlowOperation;
		Debug.Log("LaunchFlow operation: " + launchFlowOperation.ToString());

		_playReviewInfo = null; // Reset the object

		if (launchFlowOperation.Error != ReviewErrorCode.NoError)
		{
			errorMessage = launchFlowOperation.Error.ToString();

			Debug.Log(errorMessage);
			yield break;
		}

		Debug.Log("RateApi Complete");
	}

This is the Logcat of the above code, maybe it helps.

image

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions