Skip to content

Troubleshooting

SymptomLikely CauseFix
getPlacement returns null unexpectedlySlot/component mismatch or no eligible payloadVerify slotId, componentType, and payload targeting. Start with createSlotPlacementRequest(...).
A slot renders nothing, with no error and no reason codeThe placement targets a slot your code never mounts — it can never showRun sdk.diagnoseSlotInventory(). Comparing slot ids by eye is what this replaces.
A slot renders its fallback foreverYour code mounts a slot no placement targetsSame probe — it reports this direction too.
Entitlement check denies with config_unavailable or sdk_disabled_provider_failurePlaybook fetch or configured provider failedVerify endpoint availability, auth headers, and provider health. See Client vs Server Enforcement for the authoritative fallback contract.
CTA path not firing expected actionPayload action field mismatch (cta_path vs legacy shape)Use canonical cta_path in payloads and parse via PlacementRenderer.
Decisions feel staleCache TTL too longLower ttlMs in decision requests or call refresh flows explicitly.
Interactions not visible in backend telemetryIngestion endpoint misconfiguredValidate ingestEvents/touchpointTransition endpoint wiring and auth.
Runtime mode behavior is incorrectWrong mode or incomplete mode configRe-check mode selection in the runtime modes guide and use mode helper builders.
Console warns primary provider failedThe provider chain is failing: entitlement checks deny with sdk_disabled_provider_failure and slots follow providerFailureSlotBehaviorConfigure providerFallbacks, verify provider health, and choose providerFailureSlotBehavior intentionally.
Type is unknown from SDK routeContract/schema title mismatchEnsure the SDK version matches the schema version and reinstall.
Build fails after SDK API changesMissing migration updates in caller codeMigrate to object-style request helpers and rerun typecheck.

This is the hardest symptom to debug, because there is no error. Almost nothing in the SDK throws — a mismatch degrades instead of erroring — so a placement that can never show looks exactly like a user who is not eligible.

The usual cause is that a placement targets a slot id your code does not mount, or your code mounts a slot id no placement targets. Neither is visible from the Playbook alone: a config-side audit cannot see your call sites. Only the running app knows what it mounted, so ask it:

TypeScript
const diagnosis = sdk.diagnoseSlotInventory();
if (!diagnosis.configAvailable) {
// No Playbook reached the SDK. `authored` is empty for a completely
// different reason than "nothing is authored" — check this FIRST, because
// the two look identical in the lists below.
console.warn('No Playbook available; fix initialization before reading the rest.');
}
// Placements that can never show: they target a slot nothing renders.
console.log(diagnosis.authoredButUnmounted);
// Slots that render their fallback forever: nothing targets them.
console.log(diagnosis.mountedButUnauthored);

Each finding names the placement id and category, so it points at the thing to fix rather than telling you something is wrong somewhere.

If both lists are empty, configAvailable is true, targeting matches the user, and the placement still does not render — stop. That is a correct configuration producing silence, which is not a configuration problem. Open an issue with the diagnostics output above and the SDK version, rather than working around it.

Requires @revturbine/sdk 0.8.0 or newer.

When all configured providers fail for getPlacement, checkEntitlement, or identify, the SDK disables itself to avoid inconsistent behavior.

In this state:

  1. The SDK logs warning messages to the console.
  2. Placements render as hidden (invisible) or safe placeholders (placeholder) depending on providerFailureSlotBehavior.
  3. Entitlement checks return a denied result with sdk_disabled_provider_failure; see Client vs Server Enforcement for why checks and placements have different fallback behavior.
  1. Run API type checks:

    Terminal window
    pnpm typecheck:sdk-api
  2. Run web build:

    Terminal window
    pnpm build
  3. Validate SDK docs generation:

    Terminal window
    pnpm docs:sdk