=== Smart Cycle Discounts – Scheduled, Recurring & AI-Built Pricing Campaigns for WooCommerce ===
Contributors: webstepper
Tags: dynamic pricing, bulk discount, tiered pricing, bogo, scheduled sales
Requires at least: 6.4
Tested up to: 7.0
WC requires at least: 8.0
WC tested up to: 9.5
Stable tag: 2.1.17
Requires PHP: 7.4
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

BOGO, bulk, tiered, coupon, B2B & free-shipping discounts with sale badges and usage limits. Or describe a deal and let Cycle AI build it.

== Description ==

**Automated dynamic pricing and scheduled sales for WooCommerce.** Smart Cycle Discounts lets you create a discount campaign in minutes and run it on autopilot — sale prices apply on schedule, conflicts are caught before they cost you money, and your prices revert cleanly when the sale ends.

**Cycle AI** — describe the sale you want in plain English and the AI drafts a complete campaign in seconds. It reads your real catalog, picks the right products and discount type, and drops everything into the wizard for your review. Keep chatting to refine ("make it 25% instead," "limit to 200 uses") and launch when you're ready.

No more editing products one by one. No more forgetting to end a sale. No more wondering which discount is overriding which.

Pick your discount type (percentage off, BOGO, tiered pricing, and more), choose your products, set your schedule, and the plugin handles the rest — **from activation to expiration, automatically**.

A built-in setup wizard scans your store on first install, detects conflicting plugins, and walks you through creating your first campaign. Most merchants are up and running in under 3 minutes.

= Video Tutorial =

https://youtu.be/dKFhduoevro

= Key Features =

- **[Cycle AI](https://webstepper.io/docs/smart-cycle-discounts/cycle-ai/)** — describe what you want in plain English, the AI drafts a store-aware campaign. Free: 10 drafts/month. Pro: 50/day
- **Set it and forget it** — campaigns activate and expire on schedule, no manual work
- **Auto-apply or coupon code delivery** — every campaign can either fire automatically at checkout or require a code customers enter, on every discount type (not just percentage/fixed)
- **Percentage off, fixed amount, BOGO** — all free, no upgrade required
- **Tiered pricing, spend thresholds, bundles** — available in Pro
- **Recurring promotions** — set up a "Weekend Sale" once, it repeats automatically
- **Smart conflict detection** — the plugin warns you before overlapping discounts cause problems
- **[Campaign Intelligence](https://webstepper.io/docs/smart-cycle-discounts/campaign-management/campaign-intelligence-system/)** — tells you which promotions are working and what to do next
- **[5-step wizard](https://webstepper.io/docs/smart-cycle-discounts/campaign-wizard/campaign-wizard-overview/)** — create a campaign in minutes with guided setup and live preview
- **Setup wizard** — scans your store on first install, detects conflicts, gets you started fast
- **[Priority system](https://webstepper.io/docs/smart-cycle-discounts/campaign-management/campaign-priority-system/)** — control exactly which discount wins when campaigns overlap
- **Works with any theme** — uses WooCommerce's native sale price system

= Perfect For =

- Stores running **seasonal sales** (Black Friday, holiday, summer) that need to start and stop on time
- Stores with **multiple promotions** that need to avoid conflicts and overlapping discounts
- Stores that want to **automate recurring deals** (weekly specials, daily flash sales)
- **B2B and wholesale** stores using role-based or tiered quantity pricing
- Anyone tired of **manually editing product prices** every time a sale starts or ends

= WooCommerce Discount Types and Dynamic Pricing Features =

**Free version includes:**

- [Percentage discounts](https://webstepper.io/docs/smart-cycle-discounts/discount-types/percentage-discounts/)
- [Fixed amount discounts](https://webstepper.io/docs/smart-cycle-discounts/discount-types/fixed-amount-discounts/)
- [BOGO (Buy One Get One) deals](https://webstepper.io/docs/smart-cycle-discounts/discount-types/buy-one-get-one-bogo/)
- [Coupon-code campaigns](https://webstepper.io/docs/smart-cycle-discounts/discount-types/coupon-code-campaigns/) — require a shared code at checkout for any discount type
- URL auto-apply (`?wsscd_code=YOURCODE`) for sharing codes in emails and social posts
- Free shipping toggle inside campaign setup
- User role targeting (include/exclude roles)
- Location targeting by billing or shipping country
- [Recurring campaign scheduling](https://webstepper.io/docs/smart-cycle-discounts/scheduling/recurring-campaigns/) (continuous or instances)

**Pro version adds:**

- [Tiered quantity discounts](https://webstepper.io/docs/smart-cycle-discounts/discount-types/tiered-volume-pricing/) (volume pricing)
- [Spend threshold discounts](https://webstepper.io/docs/smart-cycle-discounts/discount-types/spend-threshold-discounts/) (cart-based conditions)
- [Bundle deals](https://webstepper.io/docs/smart-cycle-discounts/discount-types/bundle-discounts/) (percentage, fixed, flat bundle pricing)
- Bulk unique-code generation (up to 50,000 single-use codes per campaign, CSV export)
- Single-use enforcement (lock a code to one redemption per code or per customer)
- Advanced discount-rule controls for deeper eligibility and margin protection
- Advanced subscription discount controls (when WooCommerce Subscriptions is active)
- Full [analytics dashboard](https://webstepper.io/docs/smart-cycle-discounts/analytics-reporting/analytics-dashboard-overview/) and advanced exports

= Advanced WooCommerce Promotion Engine =

Smart Cycle Discounts is built as a **campaign system**, not a one-off rule editor.

- Campaign lifecycle management (draft → scheduled → active → expired)
- [Smart product targeting](https://webstepper.io/docs/smart-cycle-discounts/product-selection/) (all products, specific products, random products, categories, advanced filters)
- Timezone-aware scheduling automation
- Priority resolution when campaigns overlap
- Optimized caching and operations for larger WooCommerce catalogs

= WooCommerce Promotion Conflict Detection =

Before launch, Campaign Health and Campaign Intelligence evaluate operational risks including:

- Promotion conflicts and overlapping discounts
- Priority ties across concurrent campaigns
- Stock exposure and product readiness
- Schedule and timing consistency
- Discount integrity and risk indicators

This shifts teams from reactive troubleshooting to **proactive promotion control**.

= WooCommerce Campaign Analytics and Intelligence =

Smart Cycle Discounts includes campaign-level operational insight so you can evaluate:

- Which campaigns are driving meaningful revenue
- Which discounted products perform best
- Which promotions should be scaled, paused, or redesigned

The analytics dashboard helps stores **optimize promotions instead of guessing which discounts work best**.

Advanced analytics depth and exports are available in Pro, while base Campaign Intelligence guidance is included in the free version.

= Popular WooCommerce Promotion Use Cases =

Smart Cycle Discounts can be used to run:

- WooCommerce BOGO campaigns
- WooCommerce bulk discount and tiered pricing campaigns
- WooCommerce scheduled sales and recurring promotions
- WooCommerce bundle discount campaigns and product packages
- WooCommerce flash sales and seasonal campaigns
- WooCommerce customer-segment discounts (roles and locations)
- WooCommerce coupon code campaigns (private codes for email blasts, influencer codes, loyalty rewards)
- WooCommerce promotion cycles with planned campaign scheduling

= Why Store Owners Switch to Smart Cycle Discounts =

Most discount plugins let you create rules. Smart Cycle Discounts lets you **run promotions**.

**Common problems with other discount plugins:**

- Discounts calculated on-the-fly slow your store to a crawl
- "Sale" filter plugins can't find your discounted products
- Two discounts overlap and customers get double savings you didn't intend
- The free version is empty — every useful feature is locked behind Pro
- Uninstalling leaves leftover sale tags and data in your database

**How Smart Cycle Discounts is different:**

- **Sale badges and strikethrough on your storefront** — discounts render through WooCommerce's price filters, so your theme's "Sale!" badge and crossed-out pricing appear automatically on shop, category, product, and search pages. No frontend JavaScript, and no bulk price rewrites on activation — active-campaign data is cached and product terms batch-loaded to keep pages fast.
- **Built-in conflict detection** — Campaign Intelligence catches overlapping discounts, priority ties, and pricing risks before your customers do. You'll know about problems before they cost you money.
- **Genuinely useful free version** — percentage off, fixed amount, BOGO, scheduling, recurring campaigns, role targeting, and location targeting are all included free. No bait-and-switch.
- **Clean uninstall** — deactivating or removing the plugin restores your original prices and removes all plugin data. No leftover sale tags or orphaned database entries.
- **Performance-first architecture** — active campaigns are cached, product terms are batch-loaded, and admin assets only load on plugin pages. Your store stays fast.

= Documentation & Resources =

**Getting started**

- [Installation guide](https://webstepper.io/docs/smart-cycle-discounts/getting-started/installation-guide/)
- [Create your first campaign](https://webstepper.io/docs/smart-cycle-discounts/getting-started/creating-your-first-campaign/)
- [Free vs Pro features](https://webstepper.io/docs/smart-cycle-discounts/getting-started/free-pro-features/)

**Guides**

- [Discount types reference](https://webstepper.io/docs/smart-cycle-discounts/discount-types/)
- [Scheduling & recurring campaigns](https://webstepper.io/docs/smart-cycle-discounts/scheduling/)
- [Cycle AI](https://webstepper.io/docs/smart-cycle-discounts/cycle-ai/)
- [Use case walkthroughs](https://webstepper.io/docs/smart-cycle-discounts/use-cases/)
- [Developer documentation](https://webstepper.io/docs/smart-cycle-discounts/developer-documentation/)
- [Troubleshooting](https://webstepper.io/docs/smart-cycle-discounts/troubleshooting/)

**More**

- [Full documentation hub](https://webstepper.io/docs/smart-cycle-discounts/)
- [Plugin page](https://webstepper.io/wordpress/plugins/smart-cycle-discounts/)
- [WooCommerce discount calculator](https://webstepper.io/woocommerce-discount-calculator/)
- [Changelog](https://webstepper.io/wordpress/plugins/smart-cycle-discounts/changelog/)
- [Support forum](https://wordpress.org/support/plugin/smart-cycle-discounts/)

= More from Webstepper =

**[TrustLens — Fraud Prevention & Chargeback Defense for WooCommerce](https://wordpress.org/plugins/trustlens/)** — Smart Cycle Discounts grows your revenue; TrustLens protects it. It scores every customer 0–100 and catches return abuse, coupon fraud, fraud rings, and card-testing attacks before they hit your margin — all 8 detection modules free, and you stay in control: block, allowlist, or just watch.

= Get Started =

1. Install and activate the plugin
2. The setup wizard scans your store and checks for conflicts
3. Create your first campaign — describe it to Cycle AI or use the 5-step wizard
4. Your discounts go live automatically — no product editing needed

= Need Help? =

* [Documentation](https://webstepper.io/docs/smart-cycle-discounts/)
* [Support Forum](https://wordpress.org/support/plugin/smart-cycle-discounts/)

== Frequently Asked Questions ==

= How do I schedule WooCommerce sales automatically? =

Install Smart Cycle Discounts, create a campaign using the 5-step wizard, and set your start and end dates in the Schedule step. The plugin automatically activates your sale prices at the scheduled time and removes them when the campaign ends. No manual work required - your WooCommerce sale prices update themselves on schedule. See [automatic activation](https://webstepper.io/docs/smart-cycle-discounts/scheduling/automatic-activation/) for the details.

= What WooCommerce discount types are supported? =

The free version supports percentage discounts, fixed amount discounts, and BOGO deals (Buy One Get One) on any WooCommerce product. The Pro version adds tiered quantity discounts (volume-based dynamic pricing), spend threshold discounts (minimum cart value offers), and bundle discounts (buy a set of products together for a deal). All discount types work with the automated scheduling system. See the [discount types reference](https://webstepper.io/docs/smart-cycle-discounts/discount-types/) for a full breakdown.

= Is this a WooCommerce dynamic pricing plugin? =

Yes. Smart Cycle Discounts supports dynamic pricing through multiple discount types. The free version includes percentage discounts, fixed amount discounts, and BOGO deals. The Pro version adds tiered quantity pricing (buy more, save more), spend threshold discounts, and bundle deals - all the dynamic pricing options you need for a WooCommerce store.

= Can I set up BOGO deals in WooCommerce with this plugin? =

Yes. BOGO (Buy One Get One) deals are included free. You can create Buy 1 Get 1 Free, Buy 2 Get 1 at 50% off, or any custom buy/get combination with your chosen discount percentage. BOGO campaigns run on the same automated schedule as all other discount types. See the [BOGO guide](https://webstepper.io/docs/smart-cycle-discounts/discount-types/buy-one-get-one-bogo/) for setup examples.

= How do I create bulk discounts for WooCommerce? =

Use the Tiered Quantity Discounts feature (Pro). Set quantity breaks like: Buy 5+ get 10% off, Buy 10+ get 20% off, Buy 25+ get 30% off. The discount applies automatically at checkout based on the quantity in the cart. Perfect for wholesale, B2B, and volume-based WooCommerce pricing. Learn more about [tiered volume pricing](https://webstepper.io/docs/smart-cycle-discounts/discount-types/tiered-volume-pricing/).

= How do I automate Black Friday and Cyber Monday sales? =

Create a campaign with your desired discount, select your products, and schedule it for your Black Friday dates (e.g., November 29 12:00 AM to December 2 11:59 PM). You can set this up weeks in advance using Draft mode. The campaign activates and deactivates automatically - no midnight price editing required.

= Can I use this alongside another discount plugin? =

We recommend against running two discount plugins simultaneously — they both modify WooCommerce pricing and can conflict, leading to incorrect prices or double discounts. When you install Smart Cycle Discounts, the setup wizard automatically detects 19 known discount plugins and warns you if any are active. It can deactivate conflicting plugins for you directly from the wizard, so you don't have to hunt through your plugins list.

= Is Smart Cycle Discounts compatible with my theme? =

Yes. Smart Cycle Discounts is a backend plugin that works with any properly coded WordPress theme. It integrates with WooCommerce's native sale price system, so your theme's existing sale price styling applies automatically. No theme modifications needed.

= Can I schedule campaigns in advance? =

Yes. Use the Schedule step in the wizard to set specific start and end dates/times. Campaigns activate and deactivate automatically based on your schedule. You can create campaigns weeks or months in advance using Draft status, then set them to Scheduled when ready.

= How many campaigns can I create? =

There are no campaign limits - you can create and run **unlimited campaigns** in both the free and Pro versions. Run as many simultaneous promotions as your store needs.

= What's the difference between the discount types? =

**Free Version:**
- **Percentage**: Reduce price by a percentage (e.g., 25% off = $100 product becomes $75)
- **Fixed Amount**: Reduce price by fixed amount (e.g., $10 off = $100 product becomes $90)
- **BOGO**: Buy One Get One offers with flexible configurations (e.g., Buy 2 Get 1 Free)

**Pro Version:**
- **Tiered**: Quantity-based dynamic pricing (e.g., Buy 5 get 10% off, Buy 10 get 20% off)
- **Spend Threshold**: Discount based on cart total (e.g., Spend $100 get 15% off)
- **Bundle**: Product bundle deals (e.g., Buy shampoo + conditioner + mask for 20% off)

= Will this slow down my site? =

No. Smart Cycle Discounts does its heavy lifting in the background rather than on the frontend: it caches active-campaign data, batch-loads product terms in a single query, and loads its scripts only on admin plugin pages. Discounts apply through WooCommerce's own price filters server-side, so there's no frontend JavaScript adding page weight.

On a shop page with 20+ products, the active-campaign lookup is resolved once and reused across products, so the plugin keeps its per-page overhead low.

= Will my discounted products show a sale badge? =

Yes — on your storefront. Because discounts apply through WooCommerce's price filters, your theme's "Sale!" badge and strikethrough pricing appear automatically on shop, category, product, and search pages. One thing to know: campaign discounts are applied at display time, not written to each product's stored `_sale_price` field — so they won't populate WooCommerce's built-in "On Sale" shortcode/block or third-party sale filters (FacetWP, etc.) that read stored sale data.

= Can I run multiple discount campaigns at the same time? =

Yes. You can run unlimited campaigns simultaneously. Use the Priority field (1-5, where 5 is highest priority) to control which campaign takes precedence when multiple campaigns affect the same product. This prevents discount stacking and gives you full control.

= What's the difference between "All Products", "Specific Products", and "Random Products"? =

* **All Products** - Applies discount to your entire product catalog. Best for store-wide sales.
* **Specific Products** - You manually select which products to discount using the AJAX-powered product search. Best for targeted promotions.
* **Random Products** - Plugin automatically selects X random products from your catalog each day. Best for "deal of the day" promotions that drive repeat visits.

= Does it work with WooCommerce HPOS (High-Performance Order Storage)? =

Yes. Smart Cycle Discounts is fully compatible with WooCommerce HPOS and has been tested with custom order tables. It works with both the legacy post-based storage and the new High-Performance Order Storage system.

= Does it work with WooCommerce Subscriptions? =

Yes. Subscription products are fully supported. On the free tier, discount campaigns apply to the recurring subscription price automatically - no special setup needed. Your subscription product pages show strikethrough pricing just like regular products (e.g., ~~$29/month~~ $23.20/month). The Pro version adds advanced subscription controls: choose whether to discount the recurring price, the sign-up fee, or both. You can also limit discounts to the first X renewal payments - for example, "20% off for the first 3 months, then full price." If WooCommerce Subscriptions is not installed, the subscription settings simply don't appear in the wizard.

= Does it work with WooCommerce block-based cart and checkout? =

Yes. Smart Cycle Discounts fully supports WooCommerce block cart and checkout pages (WooCommerce 8.3+). Discounted prices display correctly with strikethrough formatting in both classic templates and the new block-based cart/checkout. The plugin automatically detects which template you're using and applies the appropriate discount display logic. No configuration needed - it just works.

= Can I duplicate an existing campaign? =

Yes. On the Campaigns list page, hover over any campaign and click the "Duplicate" action. This creates a copy of the campaign with all settings intact, which you can then modify as needed. Great for creating seasonal promotions based on previous campaigns.

= How does the priority system work? =

When multiple campaigns affect the same product, the campaign with the highest priority (5 = highest, 1 = lowest) takes precedence. This lets you run multiple campaigns without conflicts - for example, a high-priority flash sale can override a lower-priority seasonal discount.

= Can I export campaign data? =

Campaign analytics and export features are available in the **Pro version**. Pro users can export campaign performance data in CSV or JSON format, and schedule automated reports.

= What happens when a campaign ends? =

When a campaign reaches its end date/time, it automatically deactivates and removes the sale prices from affected products. The campaign remains in your list as "Expired" and can be duplicated or reactivated with new dates. Your original product prices are restored automatically.

= Is there a way to test campaigns before activating them? =

Yes. Use the **Draft** status to create and configure campaigns without activating them. You can review the campaign settings, check the health score, and preview which products will be affected. When ready, change the status to Active or Scheduled.

= Does it work with WooCommerce variable products? =

Yes. Smart Cycle Discounts fully supports WooCommerce variable products. When you apply a discount to a variable product, all variations receive the discount automatically. The sale price displays correctly on both the main product page and individual variation selections.

= Can I exclude products that are already on sale? =

Yes. The plugin respects existing sale prices. If a product already has a manual sale price set in WooCommerce, you can configure your campaign to skip those products or override them based on your preference.

= Can I offer free shipping with discount campaigns? =

Yes. Enable free shipping for any campaign with a single toggle in the Discounts step. When enabled, customers receive free shipping on qualifying orders. You can apply free shipping to all shipping methods or select specific methods like flat rate or local pickup. This is included in the free version.

= Can I create wholesale or member-only discounts? =

Yes. Use the User Role Targeting feature to restrict discounts to specific WordPress user roles. Choose "Include" mode to give discounts only to selected roles (e.g., "Wholesale Customer" or "Premium Member"), or "Exclude" mode to give discounts to everyone except certain roles. This makes it easy to create B2B pricing, membership discounts, or role-based promotions - all from the same WooCommerce store.

= Does it work alongside WooCommerce coupons? =

Yes. Campaign discounts and WooCommerce coupons work independently. Campaign discounts apply to product prices (shown as sale prices), while coupons apply at checkout. Customers can use both together unless you configure specific restrictions.

= What happens if two campaigns affect the same product? =

The campaign with the higher priority wins — no double discounts, no surprises. Each campaign has a priority setting from 1 (lowest) to 5 (highest). When multiple active campaigns include the same product, only the highest-priority discount applies. Campaign Intelligence also warns you before launch if a new campaign overlaps with an existing one, so you can adjust priorities or schedules before any customer sees an unintended price.

= How is this different from WooCommerce's built-in sale price feature? =

WooCommerce's built-in sale prices are set per product - you need to edit each product individually. Smart Cycle Discounts lets you manage discounts at the campaign level: select hundreds of products at once, set a schedule, and the plugin handles everything automatically. You also get features like priority management, health monitoring, random product rotation, and campaign intelligence that WooCommerce doesn't offer natively.

= Can I create recurring weekly or monthly promotions? =

Yes. Recurring campaigns are available in the free version with two modes. **Continuous mode** toggles your campaign active/inactive based on time windows - perfect for daily happy hours or weekend specials without creating hundreds of database entries. **Instances mode** creates separate campaign copies for each occurrence with individual analytics. Set up a "Weekend Flash Sale" once and schedule it to repeat every weekend, or create monthly promotions that run automatically.

= Is there a limit on how many products I can discount? =

No. You can apply discounts to your entire product catalog or select specific products. The plugin is optimized with efficient database queries and caching to handle stores with thousands of products without performance issues.

= Can I set minimum order requirements for discounts? =

Yes (Pro). Application rules let you fine-tune when discounts apply. Set minimum quantity requirements (e.g., "discount only applies when buying 3+ items"), minimum order value thresholds, and choose whether to exclude products already on sale. These rules give you precise control over discount eligibility.

= What happens if I uninstall the plugin? =

Your store goes back to normal. Deactivating the plugin automatically restores your original product prices — no leftover sale tags, no phantom discounts. If you fully delete the plugin, all campaign data, settings, and database tables are removed cleanly. You can also choose to keep your data (in Settings) if you plan to reinstall later.

= How do I control discount stacking with coupons? =

Pro users can configure combination policies for each campaign. Choose whether your campaign discount can be combined with WooCommerce coupon codes or if it should be mutually exclusive. This prevents over-discounting and protects your margins when running multiple promotions.

== External Services ==

This plugin's Cycle AI feature (optional, opt-in) relies on a hosted AI service operated by Webstepper to generate campaign drafts from natural-language descriptions.

**What the service does.** When you use Cycle AI, the plugin sends your typed prompt and a summary of your store catalog to Webstepper's hosted endpoint at `cycle-ai-proxy.usa-mv96.workers.dev`. That endpoint verifies your plan tier with Freemius, enforces a per-plan usage quota, then forwards the request to OpenAI (`api.openai.com`). OpenAI generates the campaign draft, which is returned to your site and rendered in the Cycle AI chat panel for your review. The draft is never published as a live campaign until you explicitly approve and save it through the wizard.

**What data is sent.**

* Your typed prompt and the conversation history for the current draft.
* A summary of your store catalog: product names, IDs, category names, tag names, and category product counts. Used so the AI can reference real products and categories when drafting campaigns.
* Your Freemius install ID, anonymous install UID, and (if you have a Pro license) your license secret key. Used to validate your plan tier and enforce quotas.

**What data is NOT sent.** The plugin does not transmit customer names, customer email addresses, order data, transaction history, or any personally identifiable information about your shoppers.

**When data is sent.** Only when you explicitly click a button that invokes Cycle AI (typing a prompt and pressing Send, or refining an existing draft). The plugin does not make any background calls to the service.

**Consent.** Before the first Cycle AI call, the plugin shows a consent modal listing exactly what data will be sent and linking to Webstepper's privacy policy and terms of service. No data is transmitted until you accept. You can revoke consent at any time by disabling the feature.

**Providers and policies.**

* Webstepper (hosted AI service, rate limiting, tier validation): [Privacy Policy](https://webstepper.io/privacy-policy/) — [Terms of Service](https://webstepper.io/terms-of-service/)
* OpenAI (the underlying language model): [Privacy Policy](https://openai.com/policies/privacy-policy) — [Terms of Use](https://openai.com/policies/terms-of-use)

If you do not use Cycle AI, no external service calls are made by this plugin.

== Screenshots ==

1. Setup wizard - Scans your store, detects conflicting plugins, and guides you to your first campaign
2. Campaign wizard Step 1 - Auto-generated campaign name, description, priority, and contextual help
3. Campaign wizard Step 2 - Product selection with category and tag filtering
4. Campaign wizard Step 3 - Discount configuration with live badge preview and positioning
5. Campaign wizard Step 4 - Schedule with preset durations, date picker, and recurring options
6. Campaign wizard Step 5 - Review with Campaign Intelligence recommendations and summary sidebar
7. Campaign completion - Choose next step: view campaign, preview store, or create another
8. Campaigns list - Table and card grid views with status, health scores, and quick actions
9. Campaign overview panel - Full campaign settings and real-time performance at a glance
10. Main dashboard - Store intelligence, campaign cards sorted by urgency, and planner
11. Analytics dashboard (Pro) - Revenue, conversions, click-through rates, and performance trends

== Changelog ==

= 2.1.17 =
* Fix: Cart discounts now apply to guest shoppers, not only logged-in customers. A campaign's discount was skipped in the cart whenever the plugin couldn't yet identify the shopper by email — which is every guest before checkout — even for campaigns with no per-customer usage limit, so guests saw full price. Per-customer usage limits are still enforced (guests are identified at checkout). Affects both Free and Pro.

= 2.1.16 =
* New: A [wsscd_sale_products] shortcode to display the products your active campaigns are currently discounting — ideal for a "Today's Deals" or category sale page. Because Smart Cycle Discounts applies discounts live rather than writing a native WooCommerce sale price, the built-in "on sale" shortcodes and widgets don't list these products; this shortcode gives you a supported way to show them. It covers Specific, Random, Smart Selection, and category/tag-scoped campaigns, and developers can build custom layouts with the new wsscd_get_discounted_product_ids() helper and wsscd_discounted_product_ids filter.

= 2.1.15 =
* Fix: Featured Products campaigns are now dynamic. "Featured Products" — and the other Smart Selection criteria (Best Sellers, Low Stock, New Arrivals) — now always discount the products that currently match, so newly featured products are included automatically and products you un-feature drop out. Previously the product list was frozen when the campaign was created and only refreshed if you re-saved the campaign.
* Fix: Creating a "Featured Products" campaign on a large catalog no longer triggers a fatal "allowed memory size exhausted" error (most visible with debugging tools such as Query Monitor active). Featured products are now looked up directly instead of loading the entire catalog into memory.
* Fix: Sales analytics now correctly attribute revenue and conversions to Smart Selection campaigns.
* Fix: The recurring-campaign calendar preview now shows the correct dates for your store. Previously the preview could display each date shifted back by a day — for example a Monday campaign appearing as Sunday–Monday — for admins whose browser timezone is behind UTC. This was a display-only issue in the setup wizard and did not affect when discounts actually ran.
* Fix: Resolved a "translation loading was triggered too early" notice on WordPress 6.7 and later.

= 2.1.14 =
* Fix: Smart Selection campaigns (Featured Products, Best Sellers, Low Stock, New Arrivals) now discount exactly the products matching your chosen criterion — previously the criterion was silently ignored and the campaign could put every product in scope on sale. Featured Products also now uses WooCommerce's real featured flag, and opening such a campaign no longer shows a "Failed to load campaign details" error.
* Fix: Tag filters now actually limit which products get discounted. The wizard and preview always honored your tags, but the live discount ignored them — a campaign scoped to a tag could discount every product in the selected categories.
* Fix: Campaigns whose advanced filters currently match no products now discount nothing, as expected — previously an "All Products" campaign with filters matching nothing put the entire catalog on sale.
* Fix: Specific Products campaigns can no longer lose your hand-picked list: stale advanced-filter rows left over from switching selection types could permanently narrow the list at launch, wipe it during a paused edit, and leave the campaign impossible to resume. Advanced filters now apply only to All Products and Random Products, matching what the wizard offers.
* Fix: The campaign overview panel, dashboard coverage, and campaign-conflict checks now always reflect the products actually being discounted — including when a campaign currently matches nothing — instead of previewing a product set that isn't on sale.
* Fix: The "Featured Product" advanced filter (Pro) now detects featured products correctly on modern WooCommerce.
* Cleanup: Removed roughly 500 lines of unused internal code and consolidated duplicated product-matching logic so storefront, analytics, and admin previews share one source of truth.

= 2.1.13 =
* Fix: "Random Products" and "Smart Selection" campaigns could put your entire catalog on sale instead of only the intended products when their product list hadn't been generated yet. These campaigns now apply to nothing until their products are ready, so the wrong items are never discounted.
* Fix: "Random Products" and "Smart Selection" campaigns that were activated as soon as they were created could end up with no discounted products at all — an internal save conflict silently discarded the generated product list. The list now saves reliably, and the same fix resolves a "version conflict" error that could appear when saving campaign edits.
* Fix: The campaign overview panel now shows the actual products your random or smart campaign is discounting — previously it displayed a freshly picked random sample that didn't match the products really on sale.
* Fix: The overview panel's price preview no longer applies the campaign discount on top of an already-discounted price.
* Fix: Resolved a PHP warning on the campaign wizard's Review step.
* Cleanup: Removed a large amount of unused internal code (constants, properties, utility methods, an unused WP-CLI health check, and redundant service dependencies) to keep the plugin lean and maintainable.

= 2.1.12 =
* Fix: On stores running a persistent object cache (such as Redis or Memcached), discounts limited to specific user roles — for example staff-only or wholesale-only campaigns — could appear to shoppers who don't qualify, on shop and product pages. The shown price and sale badge now always match the shopper's eligibility. This was display-only — your cart and checkout price were always correct.
* Fix: Role-restricted campaigns now expire on schedule and are correctly included in campaign conflict checks and dashboard counts.
* Cleanup: Updated the bundled Freemius SDK and removed unused internal code.

= 2.1.11 =
* Fix: On products with paid add-ons (such as WooCommerce Custom Product Add-ons), the product-page Total could show a stale or doubled discounted price after you changed an add-on option a second time. The Total now updates cleanly to the correct discounted amount on every change. This was display-only — your cart and checkout totals were always correct.

= 2.1.10 =
* Fix: The product-page price preview for add-on products now works with more campaign types — tiered, BOGO, and spend-threshold — and with complex variable products, so the shown price reflects the active discount as options are selected.
* Improvement: The campaign overview panel stays fast on stores with large catalogs (it previews a sample of the products and adds a "View All Products" shortcut to the full list), and its status badge is now color-coded by state (active, scheduled, paused, draft, expired).
* Fix: Timezone accuracy — scheduled-start countdowns, "next run" times, recurrence end dates, and the dashboard's day labels now show the correct day and time for your store's timezone.
* Cleanup: Refactored the wizard review step so its calculations run in the controller instead of the template, and removed unused code.
* New: Reply to Cycle AI with a short follow-up — like picking one of its numbered suggestions ("5") — and it now understands your choice in context instead of starting a brand-new campaign.
* Fix: Cycle AI shows your remaining draft count the moment you open it, and its low-stock awareness now reflects your real inventory.
* Fix: Analytics "Top Campaigns" now includes finished (expired) and paused campaigns, so past performance is no longer hidden.
* Fix: Customer retention and repeat-purchase analytics now count guest checkouts, not just logged-in customers — accurate for stores that allow guest checkout.
* Fix: Campaigns created by Cycle AI now show their sale badge on the storefront — and the matching offer panel for BOGO, tiered, and spend-threshold deals — just like campaigns built in the wizard.

For the complete changelog of earlier versions, visit [the full changelog](https://webstepper.io/wordpress/plugins/smart-cycle-discounts/changelog/).

== Upgrade Notice ==

= 2.1.17 =
Fixes cart discounts that applied only to logged-in customers — guest shoppers now receive the discount in the cart too. Recommended for any store that allows guest checkout.

= 2.1.16 =
Adds a [wsscd_sale_products] shortcode (plus a developer helper and filter) to display the products your active campaigns are currently discounting — for example a deals or category sale page. No action needed; existing campaigns are unaffected.

= 2.1.15 =
Featured Products and other Smart Selection campaigns are now dynamic — they always discount the products that currently qualify — and creating one on a large catalog no longer risks a memory error. Existing Smart Selection campaigns update automatically.

= 2.1.14 =
Important accuracy fixes for product targeting. Smart Selection campaigns (Featured, Best Sellers, Low Stock, New Arrivals) and tag filters now limit discounts to exactly the intended products — previously they could silently discount your whole catalog. If you created Smart Selection or tag-filtered campaigns on an earlier version, open and re-save them once so their product list is rebuilt correctly.

= 2.1.13 =
Fixes "Random Products" / "Smart Selection" campaigns that could discount your whole catalog — or nothing at all — because their product list wasn't generated or saved correctly, and makes the overview panel show the products actually on sale. Recommended if you use randomized or smart product selection.

= 2.1.12 =
Fixes role-restricted discounts (for example staff- or wholesale-only) that could show to ineligible shoppers on shop and product pages when a persistent object cache (Redis/Memcached) is active. Display-only — checkout was unaffected. Recommended if you use user-role targeting with object caching.

= 2.1.11 =
Fixes the product-page Total on products with paid add-ons, which could show a stale or doubled discounted price after changing an option more than once. Display-only; checkout was unaffected.

= 2.1.10 =
Product-page price preview now supports more campaign types and complex variable products, the campaign overview panel stays fast on large catalogs, and scheduling and dashboard dates now respect your store's timezone. Analytics are more accurate too — Top Campaigns includes past campaigns and reporting now counts guest checkouts.
