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.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().data.get(slug) returns undefined, or a paywall shows no prices.
- 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: 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()only after your auth library has restored the session, andsignOut()only for an identified user. CallingsignOut()for an anonymous person 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.