How Triggering Works
Every platform runs the same two-stage check before a survey can show. Nothing here is platform-specific — web, iOS, Android, and Flutter all agree on this behavior.
Stage 1: Trigger Check
The cheap eligibility check, run first, with no script execution:
- Does the Trigger (a named event, or a DOM condition on web) match?
- Is the survey allowed to resurvey this user (see Frequency below)?
- Is the Cooldown or Daily Cap satisfied? (Every event frequency skips this — see Frequency.)
- Is another survey already active? (Only one survey evaluation runs at a time — see Trigger Queue below.)
A survey with no triggerEventNames matches any event (a wildcard). Otherwise the incoming
event name must be a member of that list.
Frequency
Stage 1’s resurvey check reads the survey’s Display frequency (Configure → Frequency & Scheduling):
- Once — shown at most once. A display counts, not only a completion.
- Until completed — re-shows until the user completes it.
- Recurring — re-shows after N minutes, hours, or days.
- Every event — shows on every matching trigger, including after completion. Bypasses the project cooldown and daily cap; a permanent dismiss (“Don’t show again if dismissed”) still blocks it. Another survey already on screen still wins.
Because Every event already bypasses cooldown, the per-survey Override global cooldown toggle is unused for that frequency — the dashboard hides it and notes that a custom cooldown is not used.
Stage 2: Rules Engine
Only runs if a survey passes Stage 1 and defines trigger rules. Executes a filter script fetched from the backend, evaluated against the user’s traits, context, and the triggering event — evaluated identically across all platforms.
EVENT_FREQUENCY/EVENT_RECENCY/EVENT_ABSENCE rules read a user’s eventHistory (capped
at 90 days / 100 timestamps per event / 50 distinct event names). If a client’s local history
doesn’t have an entry for a given event name at all, that’s treated as “never happened”
and evaluated normally.
Trigger Queue
Concurrent trigger evaluations are serialized — only one survey evaluation runs at a time, in submission order. This prevents two events firing in quick succession from racing to show two surveys at once.
See Throttling for Cooldown/Daily Cap mechanics, and Survey Lifecycle Events for what fires once a survey does show.