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 did not return a displayable config. 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.