v1.7.1
2026-07-12- Feature: Added a tracker heartbeat detection layer — if site traffic keeps flowing but no heatmap/funnel/A/B events arrive for six hours, a dismissible admin notice identifies the caching or optimization plugin most likely blocking the trackers, with a link to the fix guide.
- Feature: Added an early-event capture queue printed at the very top of the page, so clicks and interactions that happen before the (deferred or delayed) tracker script loads are buffered and replayed instead of lost. Guarantees zero missed early clicks under WP Rocket "Delay JavaScript execution" and similar optimizers.
- Enhancement: Centralized the cache and page-optimizer compatibility logic into a single `Opti_Behavior_Optimizer_Compat` layer, replacing the duplicated exclusion rules that lived across the heatmap, funnel, and Pro tracking classes.
- Enhancement: Unified the tracking script-tag protection attributes (`nowprocket`, `data-cfasync="false"`, `data-no-optimize`, `data-no-defer`, `data-noptimize`, `data-jetpack-boost="ignore"`) so every self-hosted tracker is shielded consistently from JS minify, combine, defer, and delay optimizations.
- Enhancement: Registered verified optimizer exclusion filters — WP Rocket (minify/combine, defer, deferred and combined inline JS), SiteGround Optimizer (handle-based combine and inline combine), Perfmatters (defer and minify), WP-Optimize (URL-substring minify), Jetpack Boost (concatenation), LiteSpeed Cache (defer), W3 Total Cache (tag minification), and Breeze (aggregation) — all fed from the shared protected-scripts registry for zero-config coverage.
- Enhancement: A/B tracking batches now retry up to 3 times with backoff on network or HTTP failure (nonce re-read on every retry), and expired security nonces are transparently refreshed with one retry, so conversions recorded on long-cached pages are no longer rejected. Server-side unique keys keep retries idempotent.
- Enhancement: A/B variant assignment now also sets a companion `opti_ab_v` cookie registered with WP Rocket and LiteSpeed Cache dynamic-cookie/vary lists, so variant-specific caching stays correct.
- Enhancement: Preview and editor requests now set cache-bypass constants (`DONOTCACHEPAGE`, `DONOTROCKETOPTIMIZE`) so page previews are never optimized or cached.
- * Enhancement: Activating or deactivating the plugin now purges all known full-page caches (WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, WP Fastest Cache, Cache Enabler, Hummingbird, SiteGround Optimizer, Autoptimize), so stale cached HTML never keeps serving trackers that no longer match the plugin state. Page caches are also purged when funnels change, so new funnels start tracking on cached pages immediately.
- Performance: Cut per-visitor admin-ajax request volume by roughly 90% through consolidated tracker batching and reduced flush frequency, stopping site-wide slowdowns on busy sites.
- Fix: WP Rocket minify/combine and defer exclusion patterns were emitted as self-delimited regexes that never matched once WP Rocket joined and re-wrapped them; they are now bare regex fragments, restoring tracker exclusion under "Minify/Combine JavaScript" and "Defer JavaScript".
- Fix: SiteGround Optimizer exclusion filters now receive script handles (previously filenames, which never matched), and WP-Optimize filters now receive URL substrings only — both silently ineffective before. Removed a Jetpack Boost render-blocking filter that does not exist in the plugin; concatenation exclusion via `js_do_concat` remains and is verified.
- Fix: Funnel "Exact match" steps compared the full page URL against the stored path pattern with raw string equality, so path-only patterns (e.g. `/checkout/`) never matched and conversions silently recorded zero. Matching is now a normalized comparison (scheme/host aware, trailing-slash and case insensitive, fragments ignored, query compared only when the pattern includes one), mirrored in PHP and JS.
- Fix: Funnels analytics queried the wrong sessions table and columns, so funnel reports could undercount or miss sessions entirely.
- Fix: A new funnel did not appear in the dashboard until a manual page refresh.
- Fix: Pages with an active A/B test send `Cache-Control: no-store` and set `DONOTCACHEPAGE`, so page caches and CDNs never serve stale variant HTML or expired nonces.
- Fix: Element A/B variant changes never rendered for non-`#id` selectors (class, attribute, or path selectors); all valid CSS selectors now apply.
- Fix: The A/B unload flush stayed disarmed after the first tab switch, dropping conversions recorded near the end of a visit.
- Fix: With the Pro add-on deactivated, the heatmap dashboard showed no data when "Exclude spam traffic" was on — the spam allow-list depended on a table only Pro populates. It now also accepts equivalent evidence from the free tracker's own pageview records, so free-only installs keep full heatmap visibility with identical spam/bot/duration gates.
- Fix: The heatmap tracker crashed when optimization plugins delayed script execution; it now initializes safely regardless of load order.
- Fix: Heatmap overlays failed on very tall pages in Firefox due to the browser canvas area cap; rendering now respects the cap and stays visible.
- Fix: `CREATE TABLE IF NOT EXISTS` statements caused dbDelta fatals under W3 Total Cache database caching; table creation is now dbDelta-safe.
- Fix: Empty page titles are backfilled from tracked data and orphan URL-less page stubs are removed, so pages stop showing as "Untitled Page".
- Maintenance: Safer data-cleanup defaults for new and updated installs — scheduled cleanup now runs daily (was weekly), the short-session cleanup rule is now "shorter than 5s, older than 1 day" (was 2s/30 days), and the spam duration threshold is now 3s (was 10s). Existing installs receive the new defaults once after update.