Documentation
Frequency + Delivery
How messages get through eligibility, frequency, and arbitration without creating extra work.
Runtime lifecycle order
- Fetch SDK config and build targeting context from current pathname.
- Filter by enabled, targeting, dismissal state, schedule, and frequency caps.
- Apply experiment assignment (one variant per experiment/user key).
- Resolve arbitration (modal/rail/corner ownership) and render winners.
- Track impressions and interaction events for rendered messages.
Frequency caps
perSession: positive integer cap per session key.total: positive integer lifetime cap per message.- Cooldown precedence:
cooldownMinutes(if > 0) overridescooldownHours. - Frequency checks use persisted display history when persistence is enabled.
Snippetjson
{
"frequency": {
"perSession": 2,
"total": 5,
"cooldownMinutes": 30
}
}Banner and toast delivery
- Banner defaults:
mode:auto,transition:slide,intervalMs:6000,maxVisible:2. automode pickscarouselwhen rail has multiple banners, otherwisestack.maxVisibleapplies to stack mode (not carousel rotation).- Toast stacks are deterministic per position with queueing.
- Toast defaults: max visible 3, auto-close 5000ms while more than one toast is present.
- A single toast stays open until dismissed.
autoCloseMs: 0disables toast auto-close.- Toast hover pauses auto-close timers and resumes on mouse leave.
Dismissal and backdrop behavior
- Dismiss button is rendered only when
content.dismiss.enabled === true. - Modal lock mode: if dismiss is not enabled, close button/Escape/outside-click are all blocked.
- Modal outside click only works when dismiss is enabled and
clickOutside !== false. content.backdrop.enabled === falseremoves modal backdrop tint/blur while keeping modal open behavior intact.