Skip to content

Error Codes

This page lists all error and reason codes the SDK may return, organized by category.

Returned in decision.reason_codes[] to explain why a placement was or wasn’t shown.

CodeMeaningFix
cap_limit_exceededImpression cap reached (session/day/week/month/lifetime)Increase cap in dashboard or wait for period reset
suppressedUser recently dismissed, snoozed, or completed CTAWait for cooldown to expire
plan_mismatchUser’s plan doesn’t match placement targetingVerify targeting rules or user context
segment_mismatchUser doesn’t match the required segmentCheck segment definitions
config_not_loadedPlaybook not yet availableEnsure provider initialized before rendering slots
api_errorAPI returned non-200 responseCheck endpoint URL, API key, and network connectivity
network_errorNetwork timeout or unreachable endpointVerify endpoint is accessible from client
fallback_contentUsing fallback placeholder contentProvider failure — check API connectivity
no_matching_templateSlot’s surfaceTemplateIds don’t match any available templateVerify template IDs match dashboard config
no_matching_placementNo placement rules match the current userExpected — slot renders nothing for this user

Returned in result.reason to explain the entitlement check outcome.

Entitlement checks are fail-closed: when the SDK cannot produce an affirmative grant it denies and names the cause. This is the complete emitted set — see Error handling for the enforcement-mode suffixes on the two limit codes.

CodeMeaningFix
no_matching_entitlement_ruleNo rule grants this entitlement to the user’s plan — check deniedAdd an entitlement rule targeting that plan, or check the user’s plan_handle is the plan’s unique_handle
feature_not_enabled_for_planA matching feature rule has enabled: false — check deniedEnable the rule for that plan, or upgrade the user
usage_limit_reachedAt or over a usage_limit rule’s limitReport accurate usage via updateUsage(); raise the limit or change enforcement
credit_balance_exhaustedAt or over a credits rule’s allowanceGrant more credits or change enforcement
config_unavailableThe launched Playbook could not be fetched (Server mode) — check deniedCheck network connectivity; the reason distinguishes an outage from a real denial
entitlement_not_in_playbookLocal mode with no Playbook and no cached result — check deniedAdd the entitlement to the Playbook fixture
sdk_disabled_provider_failureThe SDK disabled itself after a provider failure — check deniedCheck API keys, endpoints, and network
granted_by_reverse_trialAllowed by an active reverse trial rather than by the planNone — expected during a reverse trial
ErrorSourceMeaning
provider_chain_exhaustedAll providers failedCheck API keys, endpoints, and network
config_fetch_failedPlaybook could not be loadedVerify configProvider or API endpoint
invalid_api_keyAPI returned 401Check apiKey value and key status
tenant_not_foundAPI returned 404Verify tenantId value
ErrorContextMeaning
interaction_tracking_failedtrackTreatmentInteraction()Event delivery failed — silently dropped
event_delivery_failedtrackEvent()Custom event could not be sent — buffered for retry
ErrorContextMeaning
storage_unavailablelocalStorage/sessionStorageBrowser storage not accessible — using in-memory fallback
storage_quota_exceededsetItem() failedClear old entries or use custom storage provider

Enable verbose logging to see all reason codes and errors:

localStorage.setItem('revturbine:debug', 'true');

Errors and reason codes are also available programmatically:

const { decision, error } = usePlacement({ placement: { name: 'hero_banner' } });
// Hook-level error (string)
console.log(error);
// Decision-level reason codes
console.log(decision?.reason_codes);