Troubleshooting
Fix common React Native SDK problems, organized by symptom.
Find your symptom below; each section lists causes in the order to check them. Set debug: true
and an onDiagnostic handler while you investigate: most problems show up there first. See
Diagnostics.
FLOW_RENDERER_MISSING
The build doesn't include the paywall renderer. The published packages don't ship it yet, so follow Add the paywall renderer and check:
node_modules/@voidhash/ios-uicontainsArtifacts/VoidhashUIEngine.xcframework, andnode_modules/@voidhash/android/ui/src/main/jniLibscontainslibvoidhash_ui.sofor each ABI. Reinstalling dependencies removes them.- In Expo, the plugin is registered as
["@voidhash/react-native", { "renderer": true }], not the bare string. In a bare app, the Podfile has theVoidhashUIpod andandroid/gradle.propertieshasVoidhash_renderer=true. - You ran
npx expo prebuildand rebuilt the native app. A JavaScript reload or an over-the-air update doesn't add native code.
The paywall doesn't appear
Check the failed result's error.code:
FLOW_NOT_ASSIGNED: nothing is shown at the location. Check the slug you pass topresentFlow, that the location isn't archived, and that a paywall is deployed and shown there. See Paywall locations. If it is, the deployed build may need a newer SDK.FLOW_UNAVAILABLE: the device has never loaded this location and is offline, or the paywall wasn't ready to show within 15 seconds.FLOW_UNSUPPORTED_PACKAGE: update the SDK.FLOW_PRESENTATION_FAILED: present from a screen that is mounted and visible.
A paywall you just deployed can take up to about an hour to replace a cached one on a device that showed the location before. Reinstall the app to test a deploy right away.
Products are empty
useProducts() returns undefined for a product, or a paywall shows no prices. The SDK reports each
missing product through onDiagnostic as PRODUCT_NOT_FOUND, with the store's reason.
- In a debug build with
dev: true, check that you use the test key (vh_pk_test_...) and that Enable simulated purchases is on in Settings → General. - Otherwise, check that the App Store or Google Play is connected and the product is mapped to its store product ID. See Products and perks.
- Check the product in the store: on the App Store, the Paid Applications Agreement is active and the product is ready to submit; on Google Play, the app is published to a testing track and the product is active.
- Test on a real device signed in to a sandbox or license tester account; see Test purchases (Help center).
A purchase doesn't unlock the perk
- Check the purchase result.
deferredmeans the receipt is still queued for Voidhash; access arrives once it's accepted.pendingwaits for approval. - Check that the product unlocks the perk you check, by slug, in Products → Products.
- Watch
onDiagnosticforTRANSACTION_REJECTED: Voidhash refused the receipt, usually because the store isn't connected for this bundle ID or package name. - Check the key: a TestFlight or Play test build on the test key doesn't see production perks, and
with the
store-sandbox-unlocks-productionsetting off, sandbox purchases don't unlock production apps. See Environments. - In observer mode, check that you report the purchase with
reportTransaction.
Expo Go isn't supported
The SDK ships native modules, which Expo Go can't load: the app still runs, but initialization
fails with FAILED_TO_INITIALIZE_VOIDHASH_CLIENT. Use a development build (npx expo run:ios,
npx expo run:android or EAS). The same error appears when an over-the-air update ships the SDK's
JavaScript to a binary built without it; rebuild the binary.
Native build fails
- iOS
pod installcan't findVoidhashCore: in a bare app, add the Podfile lines from the quickstart. In Expo, the plugin needs ause_expo_modules!oruse_native_modules!line in the Podfile. - Errors mentioning Nitro: every Nitro module in the app must use the same 0.37.x version.
- Android billing errors at runtime: another billing library in the app still uses APIs removed in
Google Play Billing 8. Upgrade it. The SDK needs
compileSdkVersion35. effecterrors: install exactlyeffect@4.0.7.
Sandbox purchases
- TestFlight and Play test-track builds use the production key; their purchases are recorded in
the
sandboxenvironment and appear under Sandbox in Studio. - The App Store sandbox renews subscriptions on an accelerated schedule; the renewals arrive as regular renewals.
- Simulated purchases from development mode appear under Test. Move them through renewals and
refunds with
voidhash sandbox; see Development mode.
Events don't show up
- Check analytics consent: with
"denied"or"pending", nothing is recorded andANALYTICS_CONSENT_DENIEDis reported once. - Check the environment in Studio: debug builds on the test key send
testevents, shown under Test. - Check Settings → Events: a turned-off built-in event or a blocked custom event isn't stored.
- Events are sent every 5 seconds or 20 events. Call
flush()and checkpendingandlastError. AUTHENTICATION_FAILEDinonDiagnosticmeans the publishable key was rejected.
See Check your data for what Studio received.
Access is wrong after sign-in
- Call
identify()andsignOut()only after your auth library has restored the session. Signing out while the session is still loading discards the identity that holds the person's purchases.signOut()does nothing for an anonymous person;reset()replaces their identity and leaves their purchases behind. PERSON_WRITE_REJECTEDafteridentify()means the anonymous ID already belonged to another identified user, so its purchases weren't merged. A Restore button moves them according to the project's paid access sharing setting.
Next steps
- Errors
- Test purchases (Help center)
- Troubleshooting across platforms
Something wrong or missing on this page? Tell us by email or on Discord.