Version 5.0.5

September 17, 2026

Fixed

  • Clicking Leads in the control panel sidebar 404'd. getCpNavItem() inherited its top-level URL from BasePlugin, which points at the bare plugin handle — and leads had no CP route of its own, only its four children. The nav item now points at the first subnav entry the signed-in user can actually reach, and leads is routed to the dashboard so bookmarks and typed URLs resolve too. (#2)
  • The Dashboard and Submissions subnav entries were shown to anyone holding leads:accessPlugin, but their controllers require leads:viewDashboard and leads:viewSubmissions — so those users were offered links that answered 403. Each subnav gate now mirrors the permission its controller enforces, and the nav item is hidden entirely when none of them are reachable.

Version 5.0.4

September 7, 2026

Fixed

  • The popup editor was unusable. Control panel → Leads → Popups → New (and the edit screen for any existing popup) died with Twig\Error\RuntimeError: Variable "forms" does not exist before any field rendered. popups/edit.twig used forms.textField() etc. without importing Craft's form macros — the 5.0.2 fix for this same bug in the settings template never made it to the popup editor. (#1)

Version 5.0.3

August 26, 2026

Fixed

  • The Popups screen was unusable. It rendered _elements/indexcontainer by hand and got three things wrong at once: no |raw, so the entire element-index markup was printed on the page as escaped HTML; sources: null, which makes Craft's index controller return no rows by design; and no source list, so Modals, Slide-ins, Drafts and the rest were unreachable. It now extends _layouts/elementindex like every other screen.
  • The popups index returned HTTP 500 whenever the status column was shown. Craft 5 expects statuses() to return craft\enums\Color cases rather than colour strings.

Version 5.0.2

August 19, 2026

Fixed

  • Settings → Plugins → Leads now redirects to the plugin's own settings screen instead of embedding it. The embedded copy nested a full control panel page (with its own fullPageForm and action input) inside Craft's settings form, producing a form-in-a-form with two action inputs that could post to the wrong handler.
  • The settings template now imports Craft's forms macros, which it relies on for every field it renders.

Version 5.0.1

July 19, 2026

Fixed

  • Custom popup index columns (status badge, type and trigger labels) now render on the element index — updated the element to Craft 5's attributeHtml() hook (the old tableAttributeHtml() was silently ignored and could fatal on its fallback).
  • Submission custom fields are no longer double-encoded when saved — the value is stored as JSON once instead of a JSON-encoded string.

Added

  • PHPStan (level 5) and ECS configuration, plus composer phpstan, composer ecs, and composer check scripts.
  • Regression tests pinning the Craft 5 element index-column contract.

Version 5.0.0

June 12, 2026

Added

  • Initial release
  • Popup types: modal, slide-in, notification bar, inline
  • Trigger types: time delay, scroll percentage, exit intent, click
  • 8 built-in popup templates (clean, bold, minimal styles)
  • Form submissions with email, name, and custom fields
  • Daily aggregated analytics (impressions, conversions, closes)
  • Email integrations: Mailchimp, ConvertKit, webhook
  • Queue-based background sync to email service providers
  • Page URL targeting rules with wildcard matching
  • Cookie-based frequency capping (frontend)
  • Analytics dashboard with date filtering and per-popup stats
  • Full Craft element index for popups with search and bulk actions
  • Auto-inject script option or manual Twig functions (leadsPopups(), leadsInline())
  • Honeypot spam protection and per-IP rate limiting