Docs

Frequency + Delivery

Documentation

Frequency + Delivery

How messages get through eligibility, frequency, and arbitration without creating extra work.

Runtime lifecycle order

  1. Fetch SDK config and build targeting context from current pathname.
  2. Filter by enabled, targeting, dismissal state, schedule, and frequency caps.
  3. Apply experiment assignment (one variant per experiment/user key).
  4. Resolve arbitration (modal/rail/corner ownership) and render winners.
  5. 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) overrides cooldownHours.
  • 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.
  • auto mode picks carousel when rail has multiple banners, otherwise stack.
  • maxVisible applies 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: 0 disables 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 === false removes modal backdrop tint/blur while keeping modal open behavior intact.