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 submitted through mite.submitBug 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.isStoreReviewAvailable()
if (available) {
const reviewRequested = await mite.requestStoreReview()
}Both resolve to false rather than throwing when expo-store-review is
missing or the dialog is unavailable on the device.