Hi team! Running into something that looks like a test-mode bug on Android and would love a sanity check before we dig deeper.
Per the Test Mode docs, test mode should pull product metadata from the dashboard. Test mode activates fine on our end and the device log
even confirms dashboard products were fetched (Test mode: loaded N products), but productVariables stays [] in the rendered paywall – every
product slot renders blank, no test-mode purchase drawer appears, and tapping purchase fires:
‼️ [paywallTransactions] ERROR: Trying to purchase (...) but the product has failed to load.
Setup on our side
- superwallkit_flutter 2.4.12 → native superwall-android 2.7.11
- TestModeBehavior.ALWAYS
- Android 16, Pixel 8 Pro
- 2 PlayStore-typed subscription products with full metadata (price, period, trial)
- Entitlement linked bidirectionally to both products
- Paywall published with snapshot promoted
- Application bundle_id set on the dashboard
Log
ℹ️ [superwallCore] INFO: Test mode: loaded 5 products ← dashboard fetch succeeds
💬 [productsManager] DEBUG: Requesting products from the store...
💬 [productsManager] DEBUG: Retrieved productDetailsList: ← Play Billing returns empty (expected)
💬 [superwallCore] DEBUG: Template Logic: [..."products":[],"primary":{},"secondary":{},"tertiary":{}]
‼️ [paywallTransactions] ERROR: ... product has failed to load.
It looks like the SDK fetches dashboard products successfully, then also queries Play Billing, and ends up using the empty Play result for
the template substitution – ignoring the dashboard data it just loaded a moment earlier.
Also worth flagging: six of these warnings fire during paywall load, possibly related?
💬 [all] DEBUG: !! Warning: Unsupported type class java.util.ArrayList (Kotlin reflection is not available), skipping...
What we expected vs. what we see
Per the docs, dashboard products should populate productVariables and tapping a product should show the test-mode drawer. Instead the
dashboard fetch seems to be ignored and the empty Play Billing result is what actually drives the WebView.
Workaround we're using
Starting Entitlements → Subscribed in the config modal works for validating the already-entitled path, but it doesn't cover the
fresh-purchase flow which is what we'd really like to be able to test end-to-end.
Let us know if there's anything else helpful we can pull from our side. Thanks!
Hi team! Running into something that looks like a test-mode bug on Android and would love a sanity check before we dig deeper.
Per the Test Mode docs, test mode should pull product metadata from the dashboard. Test mode activates fine on our end and the device log
even confirms dashboard products were fetched (Test mode: loaded N products), but productVariables stays [] in the rendered paywall – every
product slot renders blank, no test-mode purchase drawer appears, and tapping purchase fires:
Setup on our side
Log
ℹ️ [superwallCore] INFO: Test mode: loaded 5 products ← dashboard fetch succeeds
‼️ [paywallTransactions] ERROR: ... product has failed to load.
💬 [productsManager] DEBUG: Requesting products from the store...
💬 [productsManager] DEBUG: Retrieved productDetailsList: ← Play Billing returns empty (expected)
💬 [superwallCore] DEBUG: Template Logic: [..."products":[],"primary":{},"secondary":{},"tertiary":{}]
It looks like the SDK fetches dashboard products successfully, then also queries Play Billing, and ends up using the empty Play result for
the template substitution – ignoring the dashboard data it just loaded a moment earlier.
Also worth flagging: six of these warnings fire during paywall load, possibly related?
💬 [all] DEBUG: !! Warning: Unsupported type class java.util.ArrayList (Kotlin reflection is not available), skipping...
What we expected vs. what we see
Per the docs, dashboard products should populate productVariables and tapping a product should show the test-mode drawer. Instead the
dashboard fetch seems to be ignored and the empty Play Billing result is what actually drives the WebView.
Workaround we're using
Starting Entitlements → Subscribed in the config modal works for validating the already-entitled path, but it doesn't cover the
fresh-purchase flow which is what we'd really like to be able to test end-to-end.
Let us know if there's anything else helpful we can pull from our side. Thanks!