Placement does not render
Check:- The app requests the same placement ID that exists in Remote UI.
- The placement is enabled.
- The requested locale has a config, or the placement has a default locale.
- The config JSON is valid.
- Runtime placeholders have matching definitions.
- Product placeholders point to existing products.
- The user has not already seen a placement configured as Show only once per user.
- The user matches the placement targeting conditions.
- Capture protection has not blocked this user.
Requests increase but shown does not
This usually means PNLight received the request but had no config it could return for display. Common causes:- Placement missing from Remote UI.
- Placement disabled.
- Missing locale config.
- Missing or unresolved runtime placeholder.
- Attribution is required but not resolved yet.
- Show-once rules suppress the placement for that user.
- Targeting conditions do not match the user.
- Capture protection blocks the user after capture is detected.
Placeholder does not resolve
Check the placement in Remote UI:- Every placeholder token uses the
{{key}}format. - Each token has a matching placeholder definition.
- Placeholder keys start with a letter and contain only letters, numbers, and underscores.
- Product placeholders point to products that still exist in Products.
Config request fails
Recent SDK wrappers separate loading errors from “no UI for this placement”.- In Swift, use
getUIConfigResultwhen you fetch configs manually. - In React Native and Flutter, handle
onErroronRemoteUiView. - During QA, pass
ignoreCachewhen you need a fresh server response.
Actions do not work
Check your app action handler:- Handle the expected
logId, path, or action value. - Read parameters defensively.
- Provide a fallback for unknown actions.
Purchase follow-ups do not run
Check the Remote UI document:on_successneeds"schemaVersion": 3or"schemaVersion": 4.on_failandon_cancelneed"schemaVersion": 4. Schema v3 configs still runon_successonly.- A pending StoreKit purchase runs no follow-up. The current screen stays in place until Apple approves or fails the transaction.
Flow navigation does not work
For server-driven flows, check:- The config uses
schemaVersion: 2andtype: "flow". - The destination route exists in the
routesobject. - The navigation URL is inside a valid flow route.
- The app uses the current Swift SDK, React Native wrapper, or Flutter wrapper for its integration.
pnlight://navigation/... URLs inside flows before they reach onAction. Use app-specific URLs, action IDs, or action paths for actions the host app should handle.