Proactive Chat Triggers by Behavior
Proactive Triggers
Proactive triggers let your chatbot reach out first instead of waiting for a click. When a visitor lingers on your pricing page, scrolls to the bottom, or moves to close the tab, the bot can pop up with a relevant message. Used well, this lifts engagement; used badly, it annoys people — so the feature ships with several anti-annoyance limits (covered below).
Getting Started
- Navigate to Dashboard → Chatbot → Widget Customization → Triggers tab
- Enable "Proactive Triggers"
- Add a trigger type and configure the message
- Save and rebuild the widget
Trigger Types
Nine trigger types are available. Each type fires under different visitor behavior conditions.
| Trigger Type | Description | Parameters | Example Use Case |
|---|---|---|---|
| Time on Page | Fires after a visitor spends X seconds on a page. | Delay (seconds): 5–300, default 30 | "You've been on our pricing page for a while — can I help you choose?" |
| Exit Intent | Fires when a visitor is about to leave. Desktop: mouse moves to top of viewport. Mobile: tab switch or browser minimization. | None | "Before you go — can I answer any questions?" |
| Scroll Depth | Fires when a visitor scrolls past X% of the page. | Scroll depth (%): 10–100, default 50 | "You've read quite far — do you have any questions?" |
| Inactivity | Fires after X seconds without mouse, keyboard, or scroll activity. | Inactivity (seconds): 10–300, default 60 | "It looks like you might have questions — can I help?" |
| URL Match | Fires when a visitor lands on specific pages matching glob patterns. Fires with a 2-second minimum delay. | URL patterns: glob patterns, one per line | "Welcome to our pricing page! Can I help you choose a plan?" |
| Section Visibility | Fires when a specific DOM element is visible in the viewport for X seconds (using IntersectionObserver). | CSS selector (e.g. #pricing), Visibility duration (sec.): 5–120, default 8 | "I see you're looking at our pricing — can I help?" |
| Returning Visitor | Fires when a visitor returns to the site for the Nth time. This needs tracking-consent="granted" because visit counts use localStorage. | Minimum visits: 1–100, default 2 | "Welcome back! Can I help you today?" |
| Pages Visited | Fires after a visitor has viewed X pages. Without consent it counts same-document SPA navigation in memory; with consent it can continue across full page loads via sessionStorage. | Minimum pages: 2–50, default 3 | "You've explored quite a bit — do you have questions?" |
| Rage Click | Fires when a visitor rapidly clicks the same element multiple times (frustration detection). | Click count: 3–10, default 4. Time window (ms): 500–3000, default 1500 | "Something seems to not be working — can I help?" |
Global Settings
These settings apply to all proactive triggers globally.
| Field | Description | Default |
|---|---|---|
| Enable Proactive Triggers | Master switch to enable/disable all proactive triggers. | Off |
| Max. triggers per session | Maximum number of proactive messages a visitor receives per browser tab session. After reaching this limit, no more triggers fire. (Range 1–100.) | 10 |
| Max. triggers per day | Maximum proactive messages per visitor within 24 hours. It persists in localStorage only after a granted consent signal; otherwise it lasts for the current document. (Range 1–50.) | 20 |
| Cooldown type | Per session: Cooldown resets when the tab is closed. Persistent: Cooldown is stored in the browser across visits. | Per session |
| Cooldown (seconds/hours) | Wait time after a trigger fires before the next trigger is allowed. The value is in seconds for session scope and hours for persistent scope. | 5 sec (session) / 24 hours (persistent) |
| Respect permanent dismiss | With consent, a dismissal is remembered until browser data is cleared. Without consent it lasts for the current document only. | On |
| Show as speech bubble | Displays the proactive message as a speech bubble next to the chat button when the chat is closed. If disabled, the chat opens directly. | On |
| Bubble auto-hide (sec.) | Time in seconds before the speech bubble automatically hides. Set to 0 to keep it visible until the visitor interacts. (Range 0–60.) | 0 (stays visible) |
Response Modes
Each trigger can use one of three response modes to control how the proactive message is generated and delivered.
| Mode | Description | Cost | Plan Required |
|---|---|---|---|
| Static message | Displays the configured message exactly as written. No API call. | Free | Standard or higher |
| AI context on reply | Shows the static message first. When the visitor replies, the bot receives page context (page title, meta description, or element text) for a context-aware response. | Only on reply | Premium or higher |
| AI-generated message | With granted tracking consent, the bot generates the proactive greeting from page context. Without that signal, or on timeout, the configured static message is used instead. | Per generated trigger | Premium or higher |
Conditions & Scheduling
Each trigger supports optional conditions and scheduling to fine-tune when and where it fires.
Conditions
Conditions are AND-combined with the trigger.
| Field | Description |
|---|---|
| URL filter (glob) | Trigger only fires on pages matching this pattern. Empty = all pages. Example: /pricing/* |
| Mobile only | When enabled, the trigger fires only on mobile devices. Leave it off to fire on all devices. |
Schedule
| Field | Description |
|---|---|
| Enable schedule | Toggle time-based scheduling for this trigger. |
| Start time | The trigger becomes active at this time (HH:MM format). |
| End time | The trigger stops firing after this time. |
| Timezone | IANA timezone (e.g., Europe/Berlin, America/New_York). |
Trigger Combinations (AND Logic)
You can require that other triggers have also been satisfied before this trigger fires. For example, combine "Scroll Depth 70%" AND "Time on Page 45s" so the message only appears when both conditions are met.
Anti-Annoyance Protection
Proactive triggers include multiple layers of protection to avoid annoying visitors:
- Session limit — Max triggers per browser tab session (default: 10; lower it to 1–2 to be less intrusive)
- Daily limit — Max triggers per 24 hours across sessions (default: 20; persistent only with consent)
- Cooldown — Wait time between triggers (in-memory by default, persistent only with consent)
- Permanent dismiss — Remembered for the document by default and across visits only with consent
- No re-trigger — Each specific trigger fires only once per session
- Chat open guard — No trigger fires when the chat is already open
- User message guard — No trigger fires after the visitor has already sent a message
- Bubble auto-hide — Speech bubble disappears automatically after configured time
Templates
Three pre-built template bundles are available to get started quickly. Loading a template replaces existing triggers (with confirmation).
| Template | Includes | Best For |
|---|---|---|
| E-Commerce Bundle | Exit Intent + Inactivity (60s) + Section Visibility (#cart) | Online shops, reducing cart abandonment |
| Lead Generation Bundle | Time on Page (30s) + Scroll Depth (70%) + Returning Visitor (2) | SaaS, B2B lead capture |
| Support Bundle | Rage Click + Inactivity (45s) | Help desks, documentation sites |
Analytics
The Triggers tab shows a performance overview table when consented trigger-event data is available.
| Column | Description |
|---|---|
| Trigger | First 40 characters of the trigger message |
| Type | Trigger type (e.g., Time on Page, Exit Intent) |
| Fired | Total number of times the trigger was activated |
| Response rate | Percentage of fired triggers where the visitor sent a reply |
| Dismiss rate | Percentage of fired triggers where the visitor closed the message |
Use this data to optimize your trigger messages and settings. Low response rates may indicate the message is not relevant or the trigger fires too early.
Privacy / GDPR
Proactive triggers start in anonymous Privacy Mode. If the widget has no tracking-consent attribute, the value is invalid, or the state is unknown/denied:
- Time, scroll, exit-intent, inactivity, URL, section-visibility and rage-click rules run locally in memory.
- Their behavior is not sent to WebChatAgent before chat interaction.
- No proactive state is written to cookies, localStorage or sessionStorage.
- Pages Visited works during same-document SPA navigation and resets after a full reload.
- Returning Visitor is disabled.
- AI-generated greetings use their configured static fallback.
- Daily limits, persistent cooldown and permanent dismiss fall back to the current document lifetime.
When the customer website sends tracking-consent="granted", optional persistent counters, visitor recognition, proactive analytics and AI-generated greetings can run. On rejection or revocation, proactive storage is removed and the widget returns to anonymous mode.
Page context for AI context on reply is sent only after the visitor submits a message. Do not include sensitive information in page titles, headings or the target element text.
See Cookie Consent and Anonymous Proactive Triggers for the complete behavior matrix, browser-storage reference and CMP integration examples.
Best Practices
- Start simple — Begin with 1-2 triggers and measure performance before adding more
- Keep messages short — 1-2 sentences maximum; be helpful, not pushy
- Set appropriate delays — Time on Page: at least 15-30 seconds. Don't trigger immediately
- Use conditions — Target specific pages rather than firing everywhere
- Monitor analytics — Check response and dismiss rates regularly; adjust or disable low-performing triggers
- Respect visitors — Keep session limits low (1-2), enable permanent dismiss
- Test on mobile — Verify exit intent via tab switch works as expected
- Use templates — Start with a bundle and customize from there
- Combine triggers — Use AND logic for precise targeting (e.g., scroll + time)
- Document your setup — Describe the storage and providers actually enabled on your site
