Smart Cycle Discounts

Changelog

All notable changes, improvements, and fixes for Smart Cycle Discounts.

Version 2.0.0

April 2026 Major Release
Cycle AI
  • Describe the sale you want in plain English and get a complete, store-aware campaign draft in seconds — works for percentage discounts, BOGO, tiered pricing, fixed amounts, spend thresholds, and bundles
  • Conversational refinement — keep the chat going to tweak anything (“make it 25% instead,” “add a 2-week deadline,” “cap at 200 uses”) and the AI updates the draft in place
  • Store-aware drafts — Cycle AI reads your real catalog so “all winter jackets” finds your actual products and categories
  • Dashboard chat panel — a persistent Cycle AI conversation on every admin page, pick up where you left off
  • One-click “Review & Launch” — every AI draft drops into the campaign wizard pre-filled, you review every setting before launch
  • Hosted AI service — works out of the box after a one-click consent, no API keys to configure
  • Free plan includes 10 AI drafts per month; Pro plan gets 50 per day
  • First-use consent flow — a modal explains exactly what data is sent and links to the privacy policy before anything is transmitted
  • Plan-aware recommendations — Cycle AI knows which discount types are on your plan and focuses suggestions accordingly
  • Real-time streaming — AI reasoning text appears word-by-word as it thinks, with automatic fallback for older browsers

Version 1.8.28

April 2026 Bug Fixes
Fixed
  • Campaign name uniqueness check now correctly excludes the current campaign in edit mode
  • Store opportunity category prefill used invalid selection type and non-numeric priority
  • BOGO “Apply To” dropdown offered unsupported option that failed server validation
  • Percentage discount JS validation now matches PHP minimum (1%)
  • Schedule recurrence validator used non-existent field — weekly/monthly interval warnings now fire correctly
  • AJAX handler test_provider_connection was unreachable due to missing security configuration
Improved
  • Added missing capability check for save_view_preference AJAX action
  • Stopped loading 3 unused JS modules on wizard pages (~46KB saved)
  • Removed dead code across all wizard steps — unused methods, empty overrides, ghost security entries

Version 1.8.27

April 2026 New Feature
Added
  • Card grid view for the campaigns page β€” toggle between list table and visual card grid with a single click, preference persists per user
  • Cards display status accent bar, campaign name, priority, discount type, scope chips, schedule, and stats footer with smart CTA button that adapts per status
  • Tags now shown in campaign overview panel targeting section and scope_text summary across all surfaces
Fixed
  • TomSelect dropdown arrow artifact from CSS skeleton loader and native select styling
  • TomSelect preload/openOnFocus race condition resolved with shouldLoad guards
  • Tag TomSelect no longer freezes after category change
  • False error notifications on concurrent AJAX requests
  • Product dropdown no longer re-fetches on every open
Improved
  • TomSelect optimized with manual onDropdownOpen loading instead of preload
  • Removed dead code from products step (orphaned comments, empty loops, unused methods)

Version 1.8.26

April 2026 Bug Fixes
Fixed
  • Tag filter now applied to product pool queries β€” selecting tags actually filters the product dropdown
  • Tags filtered by selected categories β€” only shows tags with products in the chosen categories, preventing empty pool combinations
  • Conditions validator crash β€” PHP array() syntax in JavaScript caused errors on certain condition checks
  • Product reload on tag change properly clears stale items and handles empty responses
Improved
  • Tag-category query optimized β€” replaced N+1 database queries with single bulk query
  • Removed dead code: empty loops, unused methods, orphaned comments, empty else blocks

Version 1.8.25

April 2026 New Feature
Added
  • Tag filtering in the wizard Products step β€” merchants can now narrow the product pool by tags alongside categories, with AND logic between them
  • Empty states for tags and products β€” helpful guidance with links to WooCommerce admin when the store has no product tags or no products
Fixed
  • Product Selector now uses AND logic when both categories and tags are selected, ensuring products must match both filters
  • Health normalizer consistently filters the ‘all’ sentinel from tag IDs, matching category behavior
  • Undefined variable in wizard intent handler that caused a TypeError on redirect
Improved
  • Removed unused filter_by_tags() and filter_by_categories() dead code from Product Selector
  • DRY category and tag option rendering in wizard template β€” eliminated duplicate get_term() calls
  • Renamed filter_valid_category_ids to filter_valid_term_ids for clarity (shared by categories and tags)

Version 1.8.18

March 2026 New Feature
Added
  • Store-Aware Opportunity Intelligence β€” Upcoming Opportunities now generates suggestions based on your store’s actual campaign history and product data, not just calendar events
  • Campaign Drought detection β€” alerts when your store hasn’t had an active promotion in 21+ days
  • Best-Selling Category detection β€” identifies your top-selling categories by order count that don’t have an active campaign, suggesting you accelerate what’s already working
  • Category Gap detection β€” surfaces product categories that haven’t been promoted in 30+ days
  • Discount Coverage Gap detection β€” flags when less than 10% of your catalog has any active discount
  • Repeat Winner detection β€” recognizes weekly campaign patterns you’ve used 3+ times and suggests running them again
  • Category-based wizard pre-fill β€” clicking a category-based store opportunity opens the wizard with the category pre-selected, discount configured, and all steps completed for quick review
  • Opportunity Chains β€” when multiple detectors fire for the same category, they merge into one stronger recommendation with combined reasoning and boosted score
  • Intelligence-aware suppression β€” store opportunities are automatically hidden when discount load is high or 5+ campaigns are already active
Improved
  • Store opportunities compete for the same 3 display slots as calendar events and weekly suggestions through the existing scoring system (max 1 store insight per page load)
  • Removed orphaned WC Analytics integration class, dead discount API frontend methods, and stale discounts-api.js module code

Version 1.8.17

March 2026 Improvement
Added
  • Campaign Overview Panel now includes operational action buttons (Activate/Pause, Duplicate, Delete) in the footer
  • Panel reopens automatically after an action completes via return_url parameter
Fixed
  • Zero-activity dashboard no longer shows false stock warnings or “Ready to Launch” prompts
  • Catalog Snapshot categories stat correctly shows all categories for full-catalog campaigns
  • Health-driven “Needs Attention” verdict shows health-specific reason instead of contradictory “launch ready” messaging
  • Page header border radius, border, and shadow now use shared card design tokens

Version 1.8.16

March 2026 Improvement
Fixed
  • Dashboard intelligence verdict now agrees with operational signals β€” eliminating contradictions between status and warning reasons
  • Campaign Health “Fair” (70-89) now correctly triggers “Needs Attention” verdict instead of “On Track”
  • “Ready to Launch” verdict now requires health score >= 90 (Healthy), not >= 80
  • Dashboard and Overview campaign counts now match, including expired campaigns
  • Stock risk signals no longer appear when focus campaign is paused or expired
  • Zero-activity dashboard now caps verdict at “On Track” with idle messaging

Version 1.8.15

March 2026 Redesign
Improved
  • Comprehensive admin UI/UX overhaul across all plugin pages β€” Dashboard, Campaigns, Analytics, Settings, Notifications, Tools, and Help
  • Dashboard β€” redesigned Upcoming Opportunities (hero + weekly split), 3-column workspace grid, and Campaign Intelligence deduplication
  • Campaigns page β€” compact KPI strip, inline status filters with Trash support, search in bulk actions toolbar
  • Campaign Overview Panel β€” hero identity card with gradient metric strip, stacked section cards, pro-gated performance section
  • Analytics page β€” Hero Metric + Supporting Grid, Bento Grid layout, sequential AJAX loading
  • Settings and Notifications pages β€” card-grid layout with server-side FOUC prevention
Fixed
  • Color flash on page load β€” removed JS setProperty overrides that replaced CSS custom property references with flat values
  • 502 errors on Analytics β€” sequential AJAX loading replaces parallel requests that overwhelmed PHP-FPM
  • Settings/Notifications field flash (FOUC) β€” server-side hidden flag prevents 1-second visibility before JS hides them
  • Removed orphaned CSS, dead PHP methods, and dead JS across all pages

Version 1.8.14

March 2026 Intelligence Update
Improved
  • Re-architected Campaign Intelligence around one canonical deterministic flow: engine, strict payload, decision contract, support context, and surface rendering
  • Replaced the old decision shape with one canonical merchant contract: state, reason, action, confidence, and internal trace
  • Centralized merchant-facing Intelligence wording in a shared vocabulary system so status, reason, next action, and confidence copy stay consistent across all surfaces
  • Added decision trace metadata for explainability and QA
  • Reworked Intelligence UI so merchant surfaces now consistently lead with current state, why it is happening, what to do next, and how confident the recommendation is
  • Enhanced SendGrid and Amazon SES delivery with text/plain fallbacks plus Reply-To, CC, and BCC support
Fixed
  • Corrected cross-surface interpretation drift so wizard, dashboard, overview, campaigns list, and planner render the same campaign meaning
  • Margin risk now influences the decision state – campaigns with high discount rate correctly reach “Risk” instead of being capped at “Caution”
  • Eliminated fabricated uplift predictions for campaigns with no suggested discount or seasonal context
  • Added minimum sample size gate for economics rate metrics – efficiency, discount rate, and break-even return null below threshold instead of statistically meaningless values
  • Removed on-hold orders from economics attribution queries – only completed and processing orders count as confirmed revenue
  • Stale intelligence data now shows visual staleness indicators on all metric cards
  • Brand-new campaigns with zero evidence now show “Caution” instead of “Good” to honestly reflect the lack of data
  • Corrected timing quality and uplift weight sums in the score calculator
  • Conflict actions now name the specific competing campaign instead of showing generic copy

Version 1.8.13

March 2026 Improvement
Improved
  • Consolidated email provider creation, validation, and connection testing behind one canonical Email Manager path
  • Refactored Tools and maintenance operations behind one shared Tools service
Fixed
  • Corrected free/pro notification gating so premium providers and PRO notification types are enforced consistently
  • Repaired email queue persistence so new emails append correctly and sent/failed history is retained
  • Corrected service-container loading for newly registered services
  • Replaced the old global redirect-notice queue with page-scoped admin flash notices

Version 1.8.12

March 2026 Improvement
Improved
  • Unified Products step advanced filters under one canonical conditions contract shared by UI, validation, and runtime
  • Refactored Campaign Health and dashboard health aggregation into dedicated diagnostics services
  • Added one shared campaign applicability validator so save, review, health, and Intelligence all use the same discount validity rules
Fixed
  • Corrected advanced-filter operator handling, condition execution, and price/shipping semantics
  • Corrected scope-aware validation, discounted-product counts, blocker messaging, and category fallback resolution

Version 1.8.11

March 2026 Improvement
Improved
  • Replaced the old additive confidence heuristic with an evidence-weighted model based on signal completeness, data freshness, and cross-signal consistency
  • Added confidence reasons to the Intelligence reliability payload so confidence bands are explainable
  • Added evidence-backed action explanations wired through the shared Intelligence payload and view model
  • Consolidated plugin debugging onto a single logging backend with one canonical log file
  • Consolidated persistent plugin caching under one cache-manager source of truth with normalized key namespaces
  • Integrated WooCommerce badge caching into the shared cache manager
Fixed
  • Tightened low-reliability confidence behavior for stale, estimated, sparse, or contradictory campaign contexts
  • Repaired browser-to-server debug logging by aligning AJAX action names, nonce handling, and logger routing
  • Corrected grouped object-cache invalidation and eliminated stale mixed cache paths

Version 1.8.1

March 2026 Bug Fix
Fixed
  • Tightened free/pro packaging so free builds exclude Pro implementation files while keeping upgrade/promo UI surfaces
  • Updated WordPress.org readme short-description structure to avoid importer warning

Version 1.8.0

March 2026 Major Feature
Added
  • Campaign Intelligence engine – a full operational decision layer for WooCommerce promotions that answers “What should I do right now?” with risk signals, next-step recommendations, and reliability context
  • Dashboard-first Intelligence UX with 3 default blocks: Risk Now, Next Step, and Performance, plus expandable details for evidence and diagnostics
  • First-class Intelligence metrics for override intensity, campaign revenue contribution, and promotion stability score
  • Adaptive Promotion Guardrails with optional custom boundaries for max discount load, max override intensity, max concurrent campaigns, and minimum stability score
  • Soft-enforcement confirmation gates when actions exceed guardrail boundaries across wizard launch, schedule-driven activation, and bulk activation
  • Override telemetry with temporary stability penalties after confirmed overrides, including dashboard visibility of active penalty state
  • Daily Intelligence snapshots with trust diffs (“Since yesterday…”) for trend-aware risk/performance context
  • Compact Discipline status and 30-day Discipline Report with overrides in window, most breached boundary, average stability, and days within bounds
Improved
  • Updated terminology clarity (Decision Strength, Evidence Strength) and reduced default exposure of governance/internal wording in user-facing views
  • Added recommendation lifecycle visibility in Next Step states (still open, in progress, resolved)
  • Added block-level detail expanders to keep default UI focused and actionable

Version 1.7.65

February 2026 Feature Update
Added
  • Pro: Campaign-level add-on discount application mode for add-on priced products
  • Base-only discounting option for stores that need stricter add-on price control
Fixed
  • Single-product add-on live preview stabilized so configured totals no longer flicker during option changes
  • Final total-row refresh flow hardened to prevent stale/duplicated rows when shoppers repeatedly edit add-on selections
  • Live recalculation now aligns with post-recalculation hooks for cleaner add-on total rendering

Versions 1.7.60 – 1.7.64

February 2026 Compatibility
Fixed
  • WCPA/Custom Product Add-Ons live preview compatibility refined across single-product recalculation cycles
  • Atomic final-total guard added to eliminate transient base-total flashes while options recalculate
  • Archive badge positioning improved for Blocksy-like theme layouts

Version 1.6.2

February 2026 Bug Fix
Fixed
  • Corrected Freemius Pro code stripping for subscription sign-up fee hook registration
  • Use official __premium_only method suffix pattern for WordPress.org compliance

Version 1.6.0

February 2026 Major Feature
Added
  • WooCommerce Subscriptions support – discount campaigns now work on subscription products automatically
  • Recurring subscription prices show strikethrough discounts on product pages, shop pages, and cart
  • Subscription and variable-subscription product types recognized in campaign product conditions
  • Pro: Subscription discount target selector – choose to discount recurring price, sign-up fee, or both
  • Pro: Renewal limit control – limit discounts to the first X renewal payments, then revert to full price
  • Pro: Automatic renewal tracking per subscription with campaign linkage at checkout
  • Pro: Subscription Discount Settings card in wizard discounts step with contextual help
Improved
  • Graceful degradation when WooCommerce Subscriptions is deactivated – no errors, no UI clutter

Version 1.5.70

January 2026 Major Feature
Added
  • WooCommerce block-based cart and checkout support – strikethrough pricing now displays correctly in block cart/checkout pages alongside classic templates
  • Store API extension to expose discount metadata for block-based cart and checkout rendering
  • Client-side currency formatting with full locale support, dark mode, and high contrast accessibility
  • Declared cart_checkout_blocks compatibility for WooCommerce 8.3+ feature detection

Versions 1.5.66 – 1.5.69

January 2026 Maintenance
Changed
  • Visual improvements and UI refinements
  • Small bug fixes and stability improvements

Version 1.5.65

December 2025 Improvement
Added
  • In-plugin Help & Support page with card-based layout linking directly to documentation, support center, and campaign ideas
  • Floating help button on all admin screens (excluding wizard) for one-click access to Help & Support hub
  • Contextual help links in dashboard empty state, Tools page, and wizard sidebar with deep-links to topic-specific documentation
Improved
  • Wizard sidebar footer restyled to match card-based admin design
Fixed
  • Admin notification documentation updated to use correct WSSCD.Shared.NotificationService namespace

Versions 1.5.61 – 1.5.64

December 2025 Bug Fixes
Fixed
  • 1.5.63: Free shipping and recurring schedule no longer incorrectly show as enabled in campaign overview
  • 1.5.62: PHP 8 TypeError in recurring campaigns – DateTime constructor type handling corrected
  • 1.5.61: AJAX handler method signatures aligned with abstract base class to prevent fatal errors
  • 1.5.64: General bug fixes

Version 1.5.6

November 2025 Bug Fixes
Fixed
  • Campaign overview no longer fails with “Failed to load campaign data” after creating a campaign
  • Schedule section now handles empty or invalid timezone and non-DateTime values safely
  • Tools page displays actual server error messages instead of generic “Please try again”
  • Admin nonce registered for users with manage_options OR manage_woocommerce capability

Version 1.5.5

November 2025 Bug Fix
Fixed
  • Free version no longer returns 403 “Campaign stacking policy requires a PRO license” when creating campaigns
  • Campaign data normalized to free-tier defaults before validation

Versions 1.5.3 – 1.5.4

November 2025 Database
Fixed
  • Database migrations now throw on failure so they’re not marked as complete when schema changes fail
  • Schema drift repair – clears failed migration records so they run again on next load
  • Pending migrations run on every plugin load to keep schema up to date
  • Campaign save only persists columns that exist in the table (defensive when migrations pending)
Improved
  • Deploy script supports “local” mode for WordPress.org deployments

Version 1.5.2

October 2025 New Feature
Added
  • Discount badges now display on all product gallery images (main image + thumbnails)
  • Compact badge text for thumbnails (e.g., “-20%”, “BOGO”, “DEAL”) for better visual balance
  • Pro: Dynamic spend threshold progress bar shows real-time progress toward next discount tier
  • Pro: AJAX-powered cart updates – progress bar refreshes automatically when items are added/removed
  • Filter hook wsscd_show_gallery_thumbnail_badges to disable thumbnail badges if needed
Improved
  • Gallery thumbnail badges use smaller positioning offsets for cleaner appearance
  • Progress bar animates smoothly when cart total changes
  • Formatted price display in progress messages uses WooCommerce currency settings

Version 1.5.1

October 2025 UI Redesign
Added
  • Redesigned Campaign Period section with modern horizontal date range layout
  • Inline toggle buttons for “Immediately” vs “Scheduled” start type selection
  • Visual date boxes with accent colors – green for start, primary for end
  • “Indefinite” state styling with dashed border when no end date is set
  • Compact duration bar showing campaign length with contextual hints
Improved
  • Timeline preview shows infinity symbol (∞) for “forever” recurring campaigns
  • Timeline styling updated to match plugin design system with CSS variables
  • Timeline tooltips show full date ranges on hover (e.g., “Feb 1-3, 2026”)
  • Recurrence end date picker disables invalid dates directly in calendar
  • Validation errors persist until user fixes the issue
Fixed
  • Timeline tooltip z-index corrected to display above other elements
  • Removed horizontal scrolling from timeline – uses centered flex layout
  • Time field validation properly checks context (required only when applicable)

Version 1.5.0

September 2025 Major Feature
Added
  • Smart recurrence validation system – prevents invalid recurring schedule configurations
  • Constrained day selection for weekly recurring campaigns – days that would cause overlap are automatically disabled
  • Recurrence end date validation – warns when end date is in the past or before first recurrence would start
  • Monthly pattern edge case detection – informs users about date shifting for campaigns ending on days 29-31
  • Timeline preview shows date ranges for all occurrences (e.g., “15-18 Feb” instead of just “15 Feb”)
  • Dynamic preview count – shows all occurrences for small counts, summarizes larger ones
  • Initial validation on page load for editing existing campaigns with invalid settings
Improved
  • Weekly day selection shows informative message explaining spacing requirements
  • Disabled day chips visually indicate unavailable options with grayed-out appearance
  • All frontend validations mirrored in backend PHP for security
  • Smarter UX – impossible configurations prevented rather than error messages after the fact
Fixed
  • Recurrence mode now properly loads when editing existing recurring campaigns
  • Corrected recurrence logic – interval is gap between instances (end-to-start), any positive interval is valid

Version 1.4.0

August 2025 Major Feature
Added
  • Pro: Continuous Recurring Mode – campaigns toggle active/inactive based on time schedule without creating database instances
  • Two operational modes for recurring campaigns: “Continuous” (time-window based) and “Instances” (materialized copies)
  • Continuous mode ideal for daily happy hours, weekend specials, and weekly promotions
  • Instances mode preserves per-occurrence analytics and individual campaign tracking
  • Recurrence mode displayed in wizard review step configuration summary
Improved
  • Database migration adds recurrence_mode column with backwards compatibility
  • Campaign manager filters continuous recurring campaigns by active time window
  • Edit mode properly loads recurrence_mode from recurring settings table

Version 1.3.0

July 2025 Major Feature
Added
  • User role targeting – restrict discounts to specific WordPress user roles
  • Include/exclude mode for role-based targeting (e.g., “wholesalers only” or “exclude subscribers”)
  • Chip-style role selector UI in discounts step matching existing schedule day picker pattern
  • User roles displayed in campaign overview panel and review step summary
  • Contextual sidebar help for user role targeting with use cases and setup tips
  • Contextual sidebar help for free shipping configuration
  • Shipping truck icon added to icon library
  • Optional badge added to Free Shipping card for clarity
Improved
  • Modern chip/pill design with animated checkmark, gradient background, and smooth hover effects
  • Free shipping UI now uses chip-style pattern matching user roles (mode selector and method checkboxes)
  • Role eligibility filtering runs per-request (post-cache) to support user-specific targeting

Versions 1.2.0 – 1.2.2

June 2025 Improvements
Added
  • Free shipping badge visible in campaigns list table
  • Free shipping status displayed in campaign overview panel with shipping method details
  • Configuration summary card in wizard review step shows free shipping status
Improved
  • Dashboard layout reordered – “Your Campaigns” now appears above “Campaign Planner”
  • Campaign Health widget shows status breakdown (e.g., “2 campaigns analyzed β€’ 1 active, 1 scheduled”)
  • Badge helper includes reusable free_shipping_badge() method for consistent UI
  • Extended Freemius opt-in reminder delay from 7 to 14 days
Fixed
  • Plugin name updated for WordPress.org trademark compliance
  • Removed non-functional “View Results” button from past campaign insights
Security
  • Added input sanitization to admin notice display logic
  • Added context-aware output escaping to email template variable replacement

Versions 1.1.0 – 1.1.9

May 2025 Feature Updates
Added
  • 1.1.0: Calculator Import – Import discount presets from external Profit Calculator
  • 1.1.0: Support for percentage, fixed, tiered, BOGO, and spend threshold preset codes
  • 1.1.0: One-click campaign creation from calculator presets on Campaign List page
  • 1.1.5: Auto-update notice with one-click enable button
Improved
  • 1.1.8: Rewritten plugin description for maximum WordPress.org search discoverability
  • 1.1.8: Expanded FAQ from 17 to 24 keyword-rich entries
  • 1.1.9: Removed non-functional cache warming system (5 dead methods)
  • 1.1.9: Reduced plugin footprint – removed 11 unused classes, 16 unused AJAX endpoints, and 21 unused functions
  • 1.1.6: Added centralized price helper for consistent product pricing
  • 1.1.5: Added user meta cleanup on plugin uninstall
Fixed
  • 1.1.9: Dashboard pause/resume buttons now functional with dedicated AJAX handler
  • 1.1.9: Dashboard campaign list updates after changes (cache invalidation)
  • 1.1.9: Spend threshold discount type displays correctly in dashboard
  • 1.1.9: Connected 6 missing event triggers for settings updates and license events
  • 1.1.7: Critical bug in discount calculation – results now use object methods instead of array access
  • 1.1.7: Discount preview in admin wizard correctly extracts product price
  • 1.1.6: Variable product price handling uses minimum variation price
  • 1.1.4: Translation file (.pot) properly configured for WordPress.org translation system
  • 1.1.3: Badge display setting now properly hides badges when disabled
  • 1.1.2: Calculator import correctly displays prefilled campaign name and discount settings
  • 1.1.1: Calculator import properly clears cached data to prevent stale campaign names

Versions 1.0.1 – 1.0.10

April 2025 Polish
Improved
  • Updated plugin description for WP Admin consistency and better clarity
  • New WordPress.org banners for better visual presentation
  • SEO-optimized short description with high-value keywords
  • Optimized plugin tags for better discoverability
  • Completely rewritten plugin description with Free vs Pro comparison table
  • Added real-world scenario examples to documentation
  • Updated plugin name for better discoverability on WordPress.org
  • Corrected plugin website URL
Fixed
  • Fixed WordPress.org readme compliance issues
  • Simplified plugin name display in WP Admin

Version 1.0.0

March 2025 Initial Release
Added
  • 5-step campaign wizard for creating discount campaigns
  • Product selection: All Products, Specific Products, Random Products
  • Discount types: Percentage and Fixed Amount (Free), Tiered, BOGO, Spend Threshold (Pro)
  • Scheduling with date, time, and timezone support
  • Priority system for overlapping campaigns
  • Campaign health monitoring
  • Bulk campaign management
  • Analytics dashboard (Pro)
  • Email notifications
  • WooCommerce HPOS compatibility
  • WordPress 6.4+ and WooCommerce 8.0+ support