Store Review Prompt
Ask users if they are enjoying the app, and route unhappy ones to feedback instead of the store.
StoreReviewPrompt is a review-deflection prompt. It asks "Enjoying the app?"
— happy users go to the native App Store / Play Store review dialog, unhappy
users go into a feedback form that files a Mite bug report instead of a
one-star review.
import { StoreReviewPrompt } from '@usemite/sdk'
export default function App() {
const [visible, setVisible] = useState(false)
return (
<>
<Button title="Rate us" onPress={() => setVisible(true)} />
<StoreReviewPrompt
visible={visible}
onClose={() => setVisible(false)}
onPositive={reviewRequested => console.log({ reviewRequested })}
onFeedbackSubmitted={response => console.log(response.id)}
/>
</>
)
}You control when it appears — the SDK does not decide for you. Trigger it after a moment of success, not on first launch.
Optional dependency
The native dialog comes from expo-store-review:
npx expo install expo-store-reviewWithout it the SDK logs a [Mite] warning once and skips the review request.
The prompt still works: onPositive is called with reviewRequested: false,
and the negative path is unaffected.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
visible | boolean | — | Controls visibility. Required |
onClose | () => void | — | Called whenever the prompt should be dismissed. Required |
title | string | 'Enjoying the app?' | Heading of the initial question |
message | string | 'Your feedback helps us improve.' | Supporting text |
positiveText | string | 'Yes, I love it!' | Positive answer label |
negativeText | string | 'Not really' | Negative answer label |
feedbackTitle | string | 'What could be better?' | Heading of the feedback step |
feedbackPlaceholder | string | 'Tell us what went wrong...' | Feedback input placeholder |
feedbackSubmitText | string | 'Send feedback' | Feedback submit label |
dismissText | string | 'Not now' | Dismiss button label |
feedbackReportTitle | string | 'In-app feedback' | Title of the bug report created from feedback |
onPositive | (reviewRequested: boolean) => void | — | Called after a positive answer |
onNegative | () => void | — | Called on a negative answer. Providing this skips the built-in feedback step |
onFeedbackSubmitted | (response: SubmitBugReportResponse) => void | — | Called after built-in feedback is submitted |
The two paths
Positive — the prompt closes immediately, then the native review dialog is
requested. onPositive(reviewRequested) reports whether the request actually
went through; it is false when expo-store-review is missing or the OS
declines (both platforms rate-limit these dialogs heavily, so false is normal
and not an error).
Negative — by default the prompt switches to a built-in feedback step. The
text is filed as a bug report with feedbackReportTitle as the title, so it
lands on your bug board like any other report.
To route users into your own flow instead, pass onNegative:
<StoreReviewPrompt
visible={visible}
onClose={() => setVisible(false)}
onNegative={() => router.push('/report-bug')}
/>When onNegative is provided the prompt closes and the built-in feedback step
never renders.
Failed feedback submissions keep the prompt open, show
"Something went wrong. Please try again.", and log a [Mite] warning — the
user's text is preserved so they can retry.
Triggering the dialog directly
Skip the prompt UI entirely:
const available = await mite.storeReview.isAvailable()
if (available) {
const reviewRequested = await mite.storeReview.request()
}Both resolve to false rather than throwing when expo-store-review is
missing or the dialog is unavailable on the device.