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