Skip to content

Placement Cookbook

This guide provides ready-to-use patterns for each surface type supported by the SDK.

Surface TypeComponentUse Case
bannerBannerSlotFull-width sticky banner (top/bottom)
modalModalSlotCentered overlay dialog
in_pageInlineEmbedSlotInline card in page flow
toastToastSlotEphemeral auto-dismiss notification
buttonButtonSlotSingle CTA button
full_pageFullPageSlotDedicated full-page (plans/upgrade)
cliCliSlotCLI-style monospace message
in_page (quota)QuotaMeterSlotUsage meter (bar/gauge/numeric)
in_page (credits)CreditBalanceSlotDepleting credit balance display
<SurfaceSlotComponent
id="upgrade_banner"
surfaceType="banner"
/>

Try it live → Usage Warning Banner

<SurfaceSlotComponent
id="mp4_download_gate"
surfaceType="modal"
/>

Try it live → Data Export Gate

<SurfaceSlotComponent
id="brand_kit_inline"
surfaceType="in_page"
/>
<SurfaceSlotComponent
id="trial_countdown_toast"
surfaceType="toast"
/>
<SurfaceSlotComponent
id="nav_upgrade_button"
surfaceType="button"
/>

Try it live → Upgrade Button

<SurfaceSlotComponent
id="plans_page_surface"
surfaceType="full_page"
/>
<SurfaceSlotComponent
id="cli_usage_warning"
surfaceType="cli"
/>
<SurfaceSlotComponent
id="core_credits_quota_meter"
surfaceType="in_page"
/>

Try it live → Quota Meter

<SurfaceSlotComponent
id="credit_balance_panel"
surfaceType="in_page"
/>
import type { PlacementUiPath } from '@revturbine/sdk';
const createPlacementCallbacks = (
sdk: import('@revturbine/sdk').RevTurbineCustomerSdk,
placementId: string,
) => ({
onImpression: () => {
void sdk.trackTreatmentInteraction({
userId: 'user_123',
placementId,
interactionType: 'impression',
});
},
onDismiss: () => {
void sdk.trackTreatmentInteraction({
userId: 'user_123',
placementId,
interactionType: 'dismiss',
});
},
onCtaClick: () => {
void sdk.trackTreatmentInteraction({
userId: 'user_123',
placementId,
interactionType: 'cta_clicked',
});
},
});

Use typed helper creators for placement requests:

import {
createSlotPlacementRequest,
createEntitlementPlacementRequest,
createChainedPlacementRequest,
} from '@revturbine/sdk';
const slotRequest = createSlotPlacementRequest('dashboard_banner', 'banner');
const entitlementRequest = createEntitlementPlacementRequest('mp4_download', {
surfaceType: 'modal',
});
const chainedRequest = createChainedPlacementRequest('upgrade_follow_up', {
slotId: 'settings_footer',
surfaceType: 'in_page',
});