v1.1.30 - 29-September-2026
- Fix: A failed feedback submission no longer blocks the deactivation. An expired nonce or an unreachable analytics API previously left the plugin active with the popup unusable. This applies to every product, not only those using `extra_options`.
- New: Added an `extra_options` key to the deactivation survey so a product can surface one of its own settings in its popup. The library renders the control and posts the value; the product owns the storage and the capability check. The value is saved when the user commits by deactivating, so abandoning the popup changes nothing, and only a control the user changed is posted. If that save fails the value is left unchanged and a "Deactivate anyway" fallback is offered, so a failed save can never leave a plugin impossible to deactivate from the popup.

v1.1.29 - 30-June-2026
- Improvement: Added `spectra-blocks` slug to UTM analytics.

v1.1.28 - 22-June-2026
- Fix: Deactivation survey loaded a non-existent RTL stylesheet (`feedback.min-rtl.css`) producing a 404 in RTL locales. Registered the file suffix so the correct `feedback-rtl.min.css` is requested.

v1.1.27 - 16-June-2026
- Improvement: Added `SureDonation` slug to UTM analytics.

v1.1.26 - 20-April-2026
- Improvement: Switched from `Astra_Notices` to `BSF_Admin_Notices`.

v1.1.25 - 13-April-2026
- New: Added optional `$force` parameter (4th arg) to `track()` — when true, bypasses the post-send dedup and overwrites any pending entry with the latest value. Default behavior (skip on duplicate) is unchanged. Useful for recurring events like `plugin_updated`.

v1.1.24 - 8-April-2026
- Improvement: Updated admin notice copy — concise heading, description, and button labels.

v1.1.23 - 7-April-2026
- Improvement: Improved consent notice copy — leads with benefit, clearer CTAs.
- Improvement: Standardized usage doc link with dynamic product-specific UTM parameters.
- Fix: Clear tracking transient immediately on opt-out for instant effect.
- New: Added `bsf_usage_tracking_enabled` global filter as a kill switch for hosting providers and compliance plugins.
- New: Include admin email in tracking payload.

v1.1.22 - 1-April-2026
- Improvement: Added `surecontact`, `surecookie`, `suredash`, `power-coupons` and `sigmize` slugs to UTM analytics.

v1.1.21 - 27-March-2026
- New: Introduced BSF_Analytics_Events class for reusable one-time milestone event tracking with dedup.
- New: Support for custom option resolver callbacks (get/update) or default plugin-slug-prefixed WordPress options.

v1.1.20 - 4-March-2026
- New: Added PHPUnit test suite with 73 tests covering all 6 classes using WP_Mock.
- New: Added GitHub Actions CI workflow for PHPUnit tests across PHP 7.4, 8.0, 8.1, and 8.2.

v1.1.19 - 1-March-2026
- Fix: Resolved dead-code form ID fallback and reduced AJAX timeout from 90s to 15s in deactivation survey.
- Fix: Moved nonce verification before $_GET access in handle_optin_optout() to comply with WordPress.org coding standards.

v1.1.18 - 19-February-2026
- Improvement: Added `modern-cart` slug to UTM analytics.

v1.1.17 - 29-January-2026
- Improvement: Renamed options from `*_analytics_*` to `*_usage_*`.

v1.1.16 - 15-July-2025
- Improvement: Added `SureRank` slug to UTM analytics.

v1.1.15 - 1-July-2025
- Improvement: Added `Ultimate_VC_Addons` slug to UTM analytics.

v1.1.14 - 6-May-2025
- New: Introduced a key 'hide_optin_checkbox' to hide checkbox from Settings > General.
- Improvement: Single optin notice for all bsf products.
- Improvement: Introduced delay of 7 days for next optin message if user has reqested request from product.

v1.1.13 - 17-April-2025
- Improvement: Ensured unique id for label's `for` attribute in deactivation survey fields by prefixing them with product slugs.
- Improvement: Prevented deactivation survey from triggering when switching from a child theme to its parent.

v1.1.12 - 24-March-2025
- Improvement: Added `suremails` and `latepoint` slugs to UTM analytics.