MiteSDK

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-review

Without 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

PropTypeDefaultDescription
visiblebooleanControls visibility. Required
onClose() => voidCalled whenever the prompt should be dismissed. Required
titlestring'Enjoying the app?'Heading of the initial question
messagestring'Your feedback helps us improve.'Supporting text
positiveTextstring'Yes, I love it!'Positive answer label
negativeTextstring'Not really'Negative answer label
feedbackTitlestring'What could be better?'Heading of the feedback step
feedbackPlaceholderstring'Tell us what went wrong...'Feedback input placeholder
feedbackSubmitTextstring'Send feedback'Feedback submit label
dismissTextstring'Not now'Dismiss button label
feedbackReportTitlestring'In-app feedback'Title of the bug report created from feedback
onPositive(reviewRequested: boolean) => voidCalled after a positive answer
onNegative() => voidCalled on a negative answer. Providing this skips the built-in feedback step
onFeedbackSubmitted(response: SubmitBugReportResponse) => voidCalled 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.

On this page