Behavioral Signals
Overview
The Signals bundle is an optional component of the tracking script that detects micro-frustration patterns in visitor behaviour. It runs asynchronously in a Web Worker thread, so it has zero impact on page performance or Core Web Vitals.
What It Detects
| Signal | Code | Description |
|---|---|---|
| Rage Click | RAG | 5+ clicks within 2 seconds in a small area (20px radius) |
| Dead Click | DEC | Click on a non-interactive element with no click handler |
| Mouse Shake | SHM | Rapid mouse movement with direction changes |
| Hesitation | HES | Mouse hovering over an element without clicking |
| Stuck Scroll | STS | Repeated scroll direction reversals (3+ within 500ms) |
| Zoom In | ZOI | Page zoom via pinch or browser zoom |
| Quick Back | QUB | Visitor navigates away and returns quickly |
| Refresh Loop | RFL | Repeated page refreshes |
How It Works
- The tracking script loads a separate signals bundle asynchronously
- The bundle creates a Web Worker thread (isolated from the main thread)
- Observer scripts on the main thread listen for mouse, click, scroll, and zoom events
- When a frustration pattern is detected, it's stored locally
- Aggregated signals are sent to Convert's servers periodically
Because the analysis runs in a Web Worker, it doesn't block the main thread or affect page responsiveness.
When It Activates
Signals are enabled by default for all projects. The bundle loads automatically after the tracking script initialises.
Disabling Signals
Via query parameter (temporary, per-page):
https://example.com?_conv_disable_signals=true
Via project settings in the Convert UI.
Content Security Policy (CSP)
The Signals bundle creates a Web Worker using a blob URL. If your site has a Content Security Policy, you need to allow this:
Content-Security-Policy: worker-src blob:
Without this directive, the browser will block the worker and log a console error:
Refused to create a worker from 'blob:https://www.example.com/...'
because it violates the following Content Security Policy directive...
See the Fix CSP for Signals Worker recipe for details.
Lifecycle Event
When a signal is detected, the signal.detected lifecycle event fires:
window._conv_q = window._conv_q || [];
window._conv_q.push({
what: 'addListener',
params: {
event: 'signal.detected',
handler: function(data) {
console.log('Signal detected:', data);
}
}
});Notes
- Signals data is anonymous — no personally identifiable information is collected
- The signals bundle is a separate file from the main tracking script, loaded asynchronously
- If the Web Worker fails to load (CSP restrictions, browser limitations), the main tracking script continues to function normally
- Signal detection thresholds are not configurable by the customer
Updated about 1 month ago