FeedbackJar
·

React Native In-App Feedback: Native SDK vs WebView vs Canny (2026)

Three ways to collect feature requests in React Native: a JS SDK, a WebView of Canny/Featurebase/Nolt, or a Canny mobile embed that requires SSO. Friction, offline, theming, App Review.

react native in-app feedback canny webview feature voting wishkit

React Native in-app feedback

WishKit has no React Native package. Canny’s “mobile widget” is a WebView that will not render without SSO. Featurebase and Nolt are the same shape.

If you ship one RN binary to both stores, you have three options. Only one of them is an SDK.

WishKit alternative for Android · Does Canny have a mobile SDK? · Best in-app feedback SDKs.


The three options

Native / JS SDKGeneric WebViewCanny mobile embed
What you shipnpm package + your screen (or theirs)WebView → board URLWKWebView / Android WebView → webview.canny.io
Login to voteOptional identityUsually a hosted loginSSO required (Canny docs)
ThemingYour RN styles / their board componentTheir website chromeCanny chrome + theme= query param
OfflineList can cache; submit queues or fails in-appBlank pageBlank page
MetadataOS, screen, locale, app version from Platform / DimensionsUser-AgentUser-Agent + Identify if SSO works
App Review / PlayNormal Settings screenFine if it is clearly your boardFine. Completion rate is the loss
WishKitNo RN artifactYou would wrap wishkit.ion/a
Second storeSame JS, one widget IDSame URL, same problemsSame WebView twice

“SDK” means the UI is React Native views and the network calls are yours. A URL in react-native-webview is a website.


1. Native / JS SDK

Package: @feedbackjar/react-native-sdk (0.7.1)
Docs: React Native SDK
Min RN: 0.70. Autolinked native helpers for app id + storage; networking uses fetch, Platform, and Dimensions. No manual linking.

ts
import { FeedbackJar, FeedbackJarBoard } from '@feedbackjar/react-native-sdk';

FeedbackJar.configure({ widgetId: 'your-widget-id' });

// Drop-in board
<FeedbackJarBoard accentColor="#e5484d" />

// Or your own screen
const result = await FeedbackJar.submit(text);
await FeedbackJar.vote(postId);

Same widget ID as the Swift and Kotlin packages. iOS, Android, and RN do not get three backlogs.

Identity is optional:

ts
await FeedbackJar.setIdentity({ name: user.name, email: user.email });
// logout
await FeedbackJar.clearIdentity();

Guest votes use a per-install id. Reinstall resets it. That is the point — not an advertising id.

Friction: you write or drop in a screen that looks like the rest of the app. Keyboard, dark mode, and back gesture are RN’s. Offline submit fails in your UI instead of showing a white WebView.


2. Generic WebView (Featurebase, Nolt, Canny site, WishKit web)

tsx
<WebView source={{ uri: 'https://your-company.canny.io' }} />

Works until it does not:

  • Auth opens a popup or a new window. RN WebView eats that.
  • Third-party cookies. Nolt documents this and tells you to flip localStorage + an unofficial skipTests flag.
  • Theme is their marketing site inside Settings.
  • Cold start is HTML/CSS/JS. Airplane mode is an empty screen.
  • Metadata is a UA string unless you inject JS.

Use this when the board is a rare support hatch, not a product surface.


3. Canny’s official mobile embed

Not the generic site. Canny’s own recipe:

  1. WKWebView / Android WebView
  2. https://webview.canny.io?boardToken=...&ssoToken=
  3. Mint ssoToken on your server

Their docs: the mobile widget only works with SSO. No token → send the user to your-company.canny.io in the browser.

That is the hidden cost. You do not “add Canny to RN.” You add JWT minting, a WebView, and a fallback to Safari. Full cut.

App Review does not care. Users who bounce on the login wall do.


App Review, Play, and theming

A Settings row labelled “Feature requests” that posts text and votes is normal app functionality. Declare what you collect. Do not scrape an advertising id for guest voting.

A WebView of a third-party board is also usually fine. The review risk people worry about is overstated. The product risk is not: mismatched type, cookie banners, and a login you did not design.

Dark mode: native SDK follows the app. WebView follows the website, which may fight userInterfaceStyle.


What to pick

  • RN is the product, both stores, one backlog → JS SDK, same widget ID as native if you also have a Swift/Kotlin app.
  • Canny already runs the website and mobile is a companion → keep Canny on the web. Do not force the SSO WebView unless you will maintain the token path.
  • WishKit on iOS, RN for Android → you will run two tools. WishKit alternative when the double-count hurts.

Trial is 7 days, no card: feedbackjar.com.


Short install (if you already picked the SDK)

sh
npm install @feedbackjar/react-native-sdk@0.7.1
ts
// App.tsx
import { FeedbackJar } from '@feedbackjar/react-native-sdk';
FeedbackJar.configure({ widgetId: 'your-widget-id' });

Settings stack:

tsx
<Pressable onPress={() => navigation.navigate('Feedback')}>
  <Text>Feature requests</Text>
</Pressable>

// Feedback screen
<FeedbackJarBoard />

Seed two posts in the dashboard before you ship the screen. An empty board looks like a bug.


FAQ

Does WishKit work in React Native?

No RN package. Apple-only native SDK + a web widget.

Is @feedbackjar/react-native-sdk a native module?

It ships two small autolinked helpers (app id + on-device storage). No manual pod / Gradle steps. Networking is JS fetch.

Can I keep Canny on web and this SDK in the app?

Yes. Two lists. Import later if the split gets painful.

Offline?

SDK: your screen can show a cached list and a failed submit. WebView: empty.


Bottom line

If the install instructions start with “create a WebView,” you do not have a React Native feedback SDK. You have a website with extra steps.

Start a 7-day trial. Same widget ID on RN, iOS, and Android.