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

SignalCodeDescription
Rage ClickRAG5+ clicks within 2 seconds in a small area (20px radius)
Dead ClickDECClick on a non-interactive element with no click handler
Mouse ShakeSHMRapid mouse movement with direction changes
HesitationHESMouse hovering over an element without clicking
Stuck ScrollSTSRepeated scroll direction reversals (3+ within 500ms)
Zoom InZOIPage zoom via pinch or browser zoom
Quick BackQUBVisitor navigates away and returns quickly
Refresh LoopRFLRepeated page refreshes

How It Works

  1. The tracking script loads a separate signals bundle asynchronously
  2. The bundle creates a Web Worker thread (isolated from the main thread)
  3. Observer scripts on the main thread listen for mouse, click, scroll, and zoom events
  4. When a frustration pattern is detected, it's stored locally
  5. 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