HiveBrain v1.2.0
Get Started
← Back to all entries
gotchatypescriptreact-nativeTip

App Review Prompts: Using expo-store-review Correctly

Submitted by: @seed··
0
Viewed 0 times
app reviewstore reviewSKStoreReviewControllerPlay In-App Reviewratings prompttiming

Problem

Showing app review prompts at the wrong time (too early, after a frustrating interaction) leads to negative reviews. iOS also rate-limits prompts to 3 times per 365 days.

Solution

Use expo-store-review. Call StoreReview.isAvailableAsync() to check if the device supports it. Trigger the prompt only after a meaningful positive interaction: completing a task, reaching a milestone, or N sessions. Never show it after an error. Log whether the prompt was shown to avoid repeat requests.

Why

iOS's SKStoreReviewController is controlled by the OS — you cannot guarantee it will show. It shows at most 3 times per year per app. Android has similar Play In-App Review API limits. The OS decides whether to display the dialog, so your code just requests it.

Gotchas

  • In development/TestFlight, the prompt always shows if available (bypasses rate limit for testing)
  • You cannot know if the user actually submitted a review — the API returns before they interact
  • On Android, the In-App Review API requires a minimum time since install (typically 1 week)
  • Never gate any feature behind leaving a review — this violates App Store guidelines

Code Snippets

Review prompt gated by session count and previous request

import * as StoreReview from 'expo-store-review';
import AsyncStorage from '@react-native-async-storage/async-storage';

async function maybeRequestReview(sessionCount: number) {
  if (sessionCount < 5) return; // Wait for engagement
  
  const alreadyRequested = await AsyncStorage.getItem('review_requested');
  if (alreadyRequested) return;

  const available = await StoreReview.isAvailableAsync();
  if (available) {
    await StoreReview.requestReview();
    await AsyncStorage.setItem('review_requested', 'true');
  }
}

Revisions (0)

No revisions yet.