{"id":265799,"date":"2026-01-21T10:49:59","date_gmt":"2026-01-21T10:49:59","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/smart-cycle-discounts\/"},"modified":"2026-09-21T22:44:39","modified_gmt":"2026-09-21T22:44:39","slug":"smart-cycle-discounts","status":"publish","type":"plugin","link":"https:\/\/bcc.wordpress.org\/plugins\/smart-cycle-discounts\/","author":23405775,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.2.42","stable_tag":"2.2.42","tested":"7.1.1","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Smart Cycle Discounts \u2013 AI Dynamic Pricing & Scheduled Sales for WooCommerce","header_author":"Webstepper","header_description":"Revolutionary WooCommerce discount management with intelligent product rotation, multi-campaign organization, and advanced scheduling. Built with modern WordPress & WooCommerce standards.","assets_banners_color":"0b3550","last_updated":"2026-09-21 22:44:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/webstepper.io\/wordpress\/plugins\/smart-cycle-discounts\/","header_author_uri":"https:\/\/webstepper.io","rating":4.9,"author_block_rating":0,"active_installs":10,"downloads":5486,"num_ratings":10,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"webstepper","date":"2026-01-21 11:41:07","revision":3444035},"1.0.1":{"tag":"1.0.1","author":"webstepper","date":"2026-01-21 15:46:17","revision":3444231},"1.0.10":{"tag":"1.0.10","author":"webstepper","date":"2026-01-21 23:59:21","revision":3444476},"1.0.2":{"tag":"1.0.2","author":"webstepper","date":"2026-01-21 17:48:56","revision":3444329},"1.0.4":{"tag":"1.0.4","author":"webstepper","date":"2026-01-21 21:46:52","revision":3444419},"1.0.6":{"tag":"1.0.6","author":"webstepper","date":"2026-01-21 21:59:05","revision":3444425},"1.0.7":{"tag":"1.0.7","author":"webstepper","date":"2026-01-21 22:55:31","revision":3444452},"1.0.8":{"tag":"1.0.8","author":"webstepper","date":"2026-01-21 23:59:21","revision":3444476},"1.1.0":{"tag":"1.1.0","author":"webstepper","date":"2026-01-22 20:00:58","revision":3445139},"1.1.2":{"tag":"1.1.2","author":"webstepper","date":"2026-01-22 20:38:12","revision":3445157},"1.1.3":{"tag":"1.1.3","author":"webstepper","date":"2026-01-23 19:30:37","revision":3445781},"1.1.4":{"tag":"1.1.4","author":"webstepper","date":"2026-01-24 23:56:07","revision":3446328},"1.1.5":{"tag":"1.1.5","author":"webstepper","date":"2026-01-25 15:31:11","revision":3446578},"1.1.6":{"tag":"1.1.6","author":"webstepper","date":"2026-01-25 18:42:12","revision":3446650},"1.1.7":{"tag":"1.1.7","author":"webstepper","date":"2026-01-27 00:42:45","revision":3447435},"1.1.8":{"tag":"1.1.8","author":"webstepper","date":"2026-01-27 15:58:28","revision":3448016},"1.1.9":{"tag":"1.1.9","author":"webstepper","date":"2026-01-28 01:38:46","revision":3448299},"1.2.0":{"tag":"1.2.0","author":"webstepper","date":"2026-01-29 16:58:39","revision":3449836},"1.2.1":{"tag":"1.2.1","author":"webstepper","date":"2026-01-30 01:07:04","revision":3450083},"1.2.2":{"tag":"1.2.2","author":"webstepper","date":"2026-01-30 15:19:33","revision":3450557},"1.3.0":{"tag":"1.3.0","author":"webstepper","date":"2026-02-01 13:31:21","revision":3451388},"1.4.0":{"tag":"1.4.0","author":"webstepper","date":"2026-02-01 16:05:34","revision":3451475},"1.5.0":{"tag":"1.5.0","author":"webstepper","date":"2026-02-01 21:16:07","revision":3451594},"1.5.1":{"tag":"1.5.1","author":"webstepper","date":"2026-02-01 22:57:50","revision":3451630},"1.5.3":{"tag":"1.5.3","author":"webstepper","date":"2026-02-03 17:33:25","revision":3453124},"1.5.4":{"tag":"1.5.4","author":"webstepper","date":"2026-02-03 17:59:45","revision":3453146},"1.5.5":{"tag":"1.5.5","author":"webstepper","date":"2026-02-03 18:19:22","revision":3453156},"1.5.6":{"tag":"1.5.6","author":"webstepper","date":"2026-02-03 19:01:07","revision":3453188},"1.5.61":{"tag":"1.5.61","author":"webstepper","date":"2026-02-03 19:18:50","revision":3453212},"1.5.62":{"tag":"1.5.62","author":"webstepper","date":"2026-02-03 19:30:02","revision":3453225},"1.5.63":{"tag":"1.5.63","author":"webstepper","date":"2026-02-05 00:44:52","revision":3454197},"1.5.64":{"tag":"1.5.64","author":"webstepper","date":"2026-02-05 01:02:34","revision":3454200},"1.5.65":{"tag":"1.5.65","author":"webstepper","date":"2026-02-05 16:47:09","revision":3454816},"1.5.66":{"tag":"1.5.66","author":"webstepper","date":"2026-02-05 20:02:11","revision":3454924},"1.5.67":{"tag":"1.5.67","author":"webstepper","date":"2026-02-05 21:10:50","revision":3454959},"1.5.68":{"tag":"1.5.68","author":"webstepper","date":"2026-02-05 21:10:50","revision":3454959},"1.5.69":{"tag":"1.5.69","author":"webstepper","date":"2026-02-05 22:49:02","revision":3455011},"1.5.70":{"tag":"1.5.70","author":"webstepper","date":"2026-02-07 17:06:03","revision":3456010},"1.6.2":{"tag":"1.6.2","author":"webstepper","date":"2026-02-07 23:25:42","revision":3456166},"1.7.0":{"tag":"1.7.0","author":"webstepper","date":"2026-02-10 21:39:18","revision":3458430},"1.7.1":{"tag":"1.7.1","author":"webstepper","date":"2026-02-11 01:36:30","revision":3458582},"1.7.11":{"tag":"1.7.11","author":"webstepper","date":"2026-02-13 01:15:25","revision":3460434},"1.7.20":{"tag":"1.7.20","author":"webstepper","date":"2026-02-13 17:29:10","revision":3460951},"1.7.21":{"tag":"1.7.21","author":"webstepper","date":"2026-02-14 16:27:43","revision":3461414},"1.7.22":{"tag":"1.7.22","author":"webstepper","date":"2026-02-16 22:15:24","revision":3462941},"1.7.23":{"tag":"1.7.23","author":"webstepper","date":"2026-02-17 14:19:11","revision":3463599},"1.7.25":{"tag":"1.7.25","author":"webstepper","date":"2026-02-17 20:17:14","revision":3463806},"1.7.26":{"tag":"1.7.26","author":"webstepper","date":"2026-02-18 12:57:46","revision":3464344},"1.7.27":{"tag":"1.7.27","author":"webstepper","date":"2026-02-18 13:45:15","revision":3464371},"1.7.29":{"tag":"1.7.29","author":"webstepper","date":"2026-02-18 17:17:41","revision":3464558},"1.7.31":{"tag":"1.7.31","author":"webstepper","date":"2026-02-18 19:52:40","revision":3464611},"1.7.33":{"tag":"1.7.33","author":"webstepper","date":"2026-02-19 01:24:08","revision":3464696},"1.7.34":{"tag":"1.7.34","author":"webstepper","date":"2026-02-19 02:14:12","revision":3464701},"1.7.36":{"tag":"1.7.36","author":"webstepper","date":"2026-02-19 03:12:09","revision":3464710},"1.7.40":{"tag":"1.7.40","author":"webstepper","date":"2026-02-20 01:48:38","revision":3465473},"1.7.41":{"tag":"1.7.41","author":"webstepper","date":"2026-02-20 19:30:01","revision":3466045},"1.7.42":{"tag":"1.7.42","author":"webstepper","date":"2026-02-20 22:35:02","revision":3466123},"1.7.43":{"tag":"1.7.43","author":"webstepper","date":"2026-02-21 02:01:57","revision":3466183},"1.7.44":{"tag":"1.7.44","author":"webstepper","date":"2026-02-21 23:26:36","revision":3466634},"1.7.45":{"tag":"1.7.45","author":"webstepper","date":"2026-02-22 21:46:59","revision":3467135},"1.7.46":{"tag":"1.7.46","author":"webstepper","date":"2026-02-22 22:17:45","revision":3467137},"1.7.64":{"tag":"1.7.64","author":"webstepper","date":"2026-02-23 19:29:00","revision":3467975},"1.7.65":{"tag":"1.7.65","author":"webstepper","date":"2026-02-23 21:00:35","revision":3468016},"1.8.0":{"tag":"1.8.0","author":"webstepper","date":"2026-03-06 00:50:56","revision":3476013},"1.8.1":{"tag":"1.8.1","author":"webstepper","date":"2026-03-06 00:57:22","revision":3476015},"1.8.11":{"tag":"1.8.11","author":"webstepper","date":"2026-03-07 01:20:22","revision":3476798},"1.8.12":{"tag":"1.8.12","author":"webstepper","date":"2026-03-09 15:45:31","revision":3478283},"1.8.13":{"tag":"1.8.13","author":"webstepper","date":"2026-03-09 21:13:44","revision":3478551},"1.8.14":{"tag":"1.8.14","author":"webstepper","date":"2026-03-20 00:18:02","revision":3486881},"1.8.15":{"tag":"1.8.15","author":"webstepper","date":"2026-03-24 22:58:29","revision":3490396},"1.8.17":{"tag":"1.8.17","author":"webstepper","date":"2026-03-25 02:25:28","revision":3490456},"1.8.18":{"tag":"1.8.18","author":"webstepper","date":"2026-03-28 15:22:46","revision":3493427},"1.8.19":{"tag":"1.8.19","author":"webstepper","date":"2026-03-28 21:59:51","revision":3493574},"1.8.20":{"tag":"1.8.20","author":"webstepper","date":"2026-03-29 22:19:36","revision":3494107},"1.8.21":{"tag":"1.8.21","author":"webstepper","date":"2026-04-02 16:22:05","revision":3497668},"1.8.22":{"tag":"1.8.22","author":"webstepper","date":"2026-04-02 19:42:08","revision":3497777},"1.8.23":{"tag":"1.8.23","author":"webstepper","date":"2026-04-04 00:02:55","revision":3498536},"1.8.24":{"tag":"1.8.24","author":"webstepper","date":"2026-04-04 01:50:46","revision":3498563},"1.8.25":{"tag":"1.8.25","author":"webstepper","date":"2026-04-04 14:22:30","revision":3498793},"1.8.26":{"tag":"1.8.26","author":"webstepper","date":"2026-04-04 15:05:56","revision":3498815},"1.8.27":{"tag":"1.8.27","author":"webstepper","date":"2026-04-04 21:24:25","revision":3498918},"1.8.28":{"tag":"1.8.28","author":"webstepper","date":"2026-04-05 00:08:42","revision":3498952},"1.8.29":{"tag":"1.8.29","author":"webstepper","date":"2026-04-06 16:20:15","revision":3499972},"1.8.30":{"tag":"1.8.30","author":"webstepper","date":"2026-04-06 21:43:54","revision":3500191},"2.0.0":{"tag":"2.0.0","author":"webstepper","date":"2026-04-12 13:25:13","revision":3504467},"2.0.1":{"tag":"2.0.1","author":"webstepper","date":"2026-04-14 19:16:01","revision":3506387},"2.0.2":{"tag":"2.0.2","author":"webstepper","date":"2026-04-18 22:46:46","revision":3509813},"2.0.5":{"tag":"2.0.5","author":"webstepper","date":"2026-04-26 02:35:01","revision":3515548},"2.0.6":{"tag":"2.0.6","author":"webstepper","date":"2026-04-29 22:27:22","revision":3519028},"2.1.1":{"tag":"2.1.1","author":"webstepper","date":"2026-05-03 22:14:33","revision":3521802},"2.1.10":{"tag":"2.1.10","author":"webstepper","date":"2026-07-08 20:46:43","revision":3600785},"2.1.11":{"tag":"2.1.11","author":"webstepper","date":"2026-07-08 23:21:18","revision":3600855},"2.1.12":{"tag":"2.1.12","author":"webstepper","date":"2026-07-10 23:50:20","revision":3603485},"2.1.13":{"tag":"2.1.13","author":"webstepper","date":"2026-07-11 14:59:09","revision":3604039},"2.1.14":{"tag":"2.1.14","author":"webstepper","date":"2026-07-16 21:30:21","revision":3610750},"2.1.15":{"tag":"2.1.15","author":"webstepper","date":"2026-07-20 20:56:53","revision":3616211},"2.1.16":{"tag":"2.1.16","author":"webstepper","date":"2026-07-21 10:38:57","revision":3616905},"2.1.17":{"tag":"2.1.17","author":"webstepper","date":"2026-07-26 09:19:10","revision":3623136},"2.1.2":{"tag":"2.1.2","author":"webstepper","date":"2026-06-01 01:00:45","revision":3556034},"2.1.3":{"tag":"2.1.3","author":"webstepper","date":"2026-06-12 17:05:28","revision":3570347},"2.1.4":{"tag":"2.1.4","author":"webstepper","date":"2026-06-17 19:43:13","revision":3576297},"2.1.5":{"tag":"2.1.5","author":"webstepper","date":"2026-06-30 07:53:07","revision":3591066},"2.1.6":{"tag":"2.1.6","author":"webstepper","date":"2026-06-30 23:18:30","revision":3592018},"2.1.7":{"tag":"2.1.7","author":"webstepper","date":"2026-07-06 19:06:38","revision":3598240},"2.1.8":{"tag":"2.1.8","author":"webstepper","date":"2026-07-07 14:41:36","revision":3599212},"2.1.9":{"tag":"2.1.9","author":"webstepper","date":"2026-07-07 18:22:38","revision":3599458},"2.2.0":{"tag":"2.2.0","author":"webstepper","date":"2026-07-28 14:08:29","revision":3626030},"2.2.1":{"tag":"2.2.1","author":"webstepper","date":"2026-07-29 12:18:07","revision":3627228},"2.2.2":{"tag":"2.2.2","author":"webstepper","date":"2026-08-02 19:45:47","revision":3632054},"2.2.21":{"tag":"2.2.21","author":"webstepper","date":"2026-08-02 20:46:10","revision":3632083},"2.2.22":{"tag":"2.2.22","author":"webstepper","date":"2026-08-04 12:16:28","revision":3634148},"2.2.24":{"tag":"2.2.24","author":"webstepper","date":"2026-08-15 03:12:21","revision":3648132},"2.2.25":{"tag":"2.2.25","author":"webstepper","date":"2026-08-20 20:11:42","revision":3657742},"2.2.26":{"tag":"2.2.26","author":"webstepper","date":"2026-08-21 20:59:38","revision":3659641},"2.2.27":{"tag":"2.2.27","author":"webstepper","date":"2026-08-22 20:10:12","revision":3661111},"2.2.28":{"tag":"2.2.28","author":"webstepper","date":"2026-08-22 20:19:52","revision":3661114},"2.2.29":{"tag":"2.2.29","author":"webstepper","date":"2026-08-24 15:07:23","revision":3663743},"2.2.30":{"tag":"2.2.30","author":"webstepper","date":"2026-08-24 19:35:53","revision":3664172},"2.2.31":{"tag":"2.2.31","author":"webstepper","date":"2026-08-24 21:24:03","revision":3664286},"2.2.32":{"tag":"2.2.32","author":"webstepper","date":"2026-08-25 16:32:37","revision":3665703},"2.2.33":{"tag":"2.2.33","author":"webstepper","date":"2026-08-26 00:25:02","revision":3666116},"2.2.34":{"tag":"2.2.34","author":"webstepper","date":"2026-09-03 01:10:44","revision":3678835},"2.2.35":{"tag":"2.2.35","author":"webstepper","date":"2026-09-03 16:50:32","revision":3680090},"2.2.36":{"tag":"2.2.36","author":"webstepper","date":"2026-09-09 14:11:33","revision":3688446},"2.2.37":{"tag":"2.2.37","author":"webstepper","date":"2026-09-09 19:33:22","revision":3688916},"2.2.38":{"tag":"2.2.38","author":"webstepper","date":"2026-09-10 17:22:35","revision":3690258},"2.2.40":{"tag":"2.2.40","author":"webstepper","date":"2026-09-18 01:07:47","revision":3701162},"2.2.41":{"tag":"2.2.41","author":"webstepper","date":"2026-09-20 17:49:37","revision":3704518},"2.2.42":{"tag":"2.2.42","author":"webstepper","date":"2026-09-21 22:44:39","revision":3706396}},"upgrade_notice":{"2.2.42":"<p>Recommended if you run random-product campaigns or campaigns that exclude sale items. Weekly draws no longer shrink over time, and a higher-priority campaign that cannot apply no longer leaves a product undiscounted. Open and save each random campaign once after updating so it draws a full set.<\/p>","2.2.41":"<p>Recommended for anyone who has not connected a Smart Cycle Discounts account. Opening the Account screen produced a critical error instead of a page; it now offers to connect or activate a license.<\/p>","2.2.40":"<p>Recommended for everyone. Adds variation-level discounts and a one-click sale page, makes that page match your theme and clear your page cache when campaigns change, and pages it instead of rendering the whole sale at once.<\/p>","2.2.38":"<p>Recommended for everyone. Fixes the Edit and Back buttons on the wizard&#039;s review step, gives saving settings the confirmation it was missing, and makes the published-campaign dialog dismissible.<\/p>","2.2.37":"<p>Important for any store using discount codes: a code-required campaign was taking its discount twice, so a 25% code charged as 50% off. Also fixes campaign attribution for older orders and stops analytics history growing without limit.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":1,"5":9},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3449853,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3449881,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3461509,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3506387,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3506387,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3706396,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"author\":\"webstepper\",\"title\":\"Smart Cycle Discounts \\u2014 Automatic WooCommerce Discount Campaigns\",\"description\":\"Explore a populated demo store: 8 active and scheduled campaigns spanning every discount type, 30 days of analytics, a live activity feed, and 20 sample products across 6 categories.\"},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=smart-cycle-discounts\",\"preferredVersions\":{\"php\":\"8.0\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"woocommerce\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"smart-cycle-discounts\"},\"options\":{\"activate\":true}},{\"step\":\"installTheme\",\"themeData\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"storefront\"}},{\"step\":\"activateTheme\",\"themeFolderName\":\"storefront\"},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Smart Cycle Discounts Demo\",\"blogdescription\":\"Automatic product discounts for WooCommerce \\u2014 explore campaigns, analytics, and activity\",\"permalink_structure\":\"\\\/%postname%\\\/\",\"timezone_string\":\"UTC\",\"woocommerce_task_list_hidden\":\"yes\",\"woocommerce_task_list_complete\":\"yes\",\"woocommerce_admin_notices\":[],\"woocommerce_default_country\":\"US:CA\",\"woocommerce_currency\":\"USD\",\"wsscd_setup_wizard_completed\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require '\\\/wordpress\\\/wp-load.php'; delete_transient('_wc_activation_redirect'); update_option('woocommerce_onboarding_profile', array('completed' => true)); update_user_meta(1, 'wsscd_auto_update_notice_dismissed', true); update_user_meta(1, 'wsscd_review_notice_dismissed', true); update_user_meta(1, 'wsscd_first_sale_notice_dismissed', true); if ( class_exists('WC_Install') ) { WC_Install::create_pages(); } flush_rewrite_rules(); ?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\n$cats = array('clothing' => 'Clothing', 'electronics' => 'Electronics', 'accessories' => 'Accessories', 'home-garden' => 'Home & Garden', 'books' => 'Books', 'sports' => 'Sports & Outdoors');\\nforeach ($cats as $slug => $name) {\\n\\tif ( ! term_exists($slug, 'product_cat') ) {\\n\\t\\twp_insert_term($name, 'product_cat', array('slug' => $slug));\\n\\t}\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\n$by_slug = function($slug) { $t = get_term_by('slug', $slug, 'product_cat'); return $t ? $t->term_id : 0; };\\n$products = array(\\n\\tarray('Classic Cotton T-Shirt',      '24.99', 'clothing'),\\n\\tarray('Slim Fit Denim Jeans',        '79.99', 'clothing'),\\n\\tarray('Summer Linen Dress',          '59.99', 'clothing'),\\n\\tarray('Wool Pullover Sweater',       '89.99', 'clothing'),\\n\\tarray('Wireless Noise-Canceling Headphones', '149.99', 'electronics'),\\n\\tarray('Smartphone Leather Case',     '24.99', 'electronics'),\\n\\tarray('Fast-Charge USB-C Adapter',   '34.99', 'electronics'),\\n\\tarray('Portable Bluetooth Speaker',  '79.99', 'electronics'),\\n\\tarray('Leather Bifold Wallet',       '49.99', 'accessories'),\\n\\tarray('Polarized Sunglasses',        '89.99', 'accessories'),\\n\\tarray('Sport Smartwatch Band',       '19.99', 'accessories'),\\n\\tarray('Hand-Thrown Ceramic Vase',    '44.99', 'home-garden'),\\n\\tarray('Linen Throw Pillow Set',      '39.99', 'home-garden'),\\n\\tarray('Indoor Plant Pot Set (3pc)',  '49.99', 'home-garden'),\\n\\tarray('Bestselling Cookbook',        '29.99', 'books'),\\n\\tarray('Mystery Novel Boxed Set',     '54.99', 'books'),\\n\\tarray('Insulated Hiking Bottle',     '32.99', 'sports'),\\n\\tarray('Yoga Mat \\u2014 Eco-Friendly',     '44.99', 'sports'),\\n\\tarray('Camping Lantern (LED)',       '28.99', 'sports'),\\n\\tarray('Resistance Band Set',         '24.99', 'sports')\\n);\\nforeach ($products as $p) {\\n\\tif ( wc_get_product_id_by_sku('demo-' . sanitize_title($p[0])) ) { continue; }\\n\\t$product = new WC_Product_Simple();\\n\\t$product->set_name($p[0]);\\n\\t$product->set_regular_price($p[1]);\\n\\t$product->set_sku('demo-' . sanitize_title($p[0]));\\n\\t$product->set_stock_status('instock');\\n\\t$product->set_status('publish');\\n\\t$id = $product->save();\\n\\t$cat_id = $by_slug($p[2]);\\n\\tif ( $cat_id ) { wp_set_object_terms($id, $cat_id, 'product_cat'); }\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nglobal $wpdb;\\n$t = $wpdb->prefix . 'wsscd_campaigns';\\n$by_slug = function($slug) { $term = get_term_by('slug', $slug, 'product_cat'); return $term ? $term->term_id : 0; };\\n$now = current_time('mysql');\\n$campaigns = array(\\n\\tarray('name' => '20% Off All Clothing',             'slug' => 'clothing-percent',  'status' => 'active',    'priority' => 1, 'type' => 'percentage',      'value' => 20.00, 'cat' => 'clothing',     'starts' => -30, 'ends' => 365,  'color' => '#2271b1', 'icon' => 'tag',       'desc' => 'Save 20% on every item in our Clothing category \\u2014 applies automatically at checkout.'),\\n\\tarray('name' => '$5 Off Accessories',               'slug' => 'accessories-fixed', 'status' => 'active',    'priority' => 3, 'type' => 'fixed',           'value' => 5.00,  'cat' => 'accessories',  'starts' => -25, 'ends' => 90,   'color' => '#00a32a', 'icon' => 'money-alt', 'desc' => 'Fixed $5 discount on accessories \\u2014 no minimums, applied per item.'),\\n\\tarray('name' => 'Buy 2, Get 1 Free \\u2014 Books',        'slug' => 'books-bogo',        'status' => 'active',    'priority' => 2, 'type' => 'bogo',            'value' => 100.00,'cat' => 'books',        'starts' => -14, 'ends' => 60,   'color' => '#9b59b6', 'icon' => 'book-alt',  'desc' => 'Buy any two books and get the cheapest one free \\u2014 perfect summer reading promotion.'),\\n\\tarray('name' => 'Tiered Discount: 10\\\/15\\\/20% Off Electronics', 'slug' => 'electronics-tiered', 'status' => 'active', 'priority' => 2, 'type' => 'tiered',          'value' => 20.00, 'cat' => 'electronics',  'starts' => -10, 'ends' => 45,   'color' => '#e67e22', 'icon' => 'screenoptions','desc' => 'Spend $100 \\u2192 10% off, spend $200 \\u2192 15% off, spend $300 \\u2192 20% off. Stacks automatically as your cart grows.'),\\n\\tarray('name' => 'Spend $75 \\u2014 Get Free Sports Gift', 'slug' => 'sports-threshold',  'status' => 'active',    'priority' => 4, 'type' => 'spend_threshold', 'value' => 15.00, 'cat' => 'sports',       'starts' => -7,  'ends' => 30,   'color' => '#16a085', 'icon' => 'awards',    'desc' => 'Spend $75 in the Sports category and we add a free water bottle to your cart.'),\\n\\tarray('name' => 'Summer Flash Sale \\u2014 30% Off Home', 'slug' => 'summer-flash',      'status' => 'scheduled', 'priority' => 1, 'type' => 'percentage',      'value' => 30.00, 'cat' => 'home-garden',  'starts' => 7,   'ends' => 21,   'color' => '#f0b849', 'icon' => 'calendar',  'desc' => 'Coming next week! 30% off everything Home & Garden for two weeks only.'),\\n\\tarray('name' => 'Weekend-Only 15% Storewide',       'slug' => 'weekend-recurring', 'status' => 'active',    'priority' => 5, 'type' => 'percentage',      'value' => 15.00, 'cat' => '',             'starts' => -60, 'ends' => 365,  'color' => '#3498db', 'icon' => 'calendar-alt','desc' => 'Recurring campaign \\u2014 automatically activates every Saturday + Sunday, pauses Mon\\u2013Fri.'),\\n\\tarray('name' => 'New Year Clearance (closed)',      'slug' => 'newyear-archive',   'status' => 'expired',   'priority' => 5, 'type' => 'percentage',      'value' => 40.00, 'cat' => 'clothing',     'starts' => -120,'ends' => -60,  'color' => '#7f8c8d', 'icon' => 'archive',   'desc' => 'Archived campaign from last quarter \\u2014 kept for analytics history.')\\n);\\nforeach ($campaigns as $c) {\\n\\t$cat_ids = $c['cat'] ? array($by_slug($c['cat'])) : array();\\n\\t$starts  = gmdate('Y-m-d H:i:s', time() + $c['starts'] * DAY_IN_SECONDS);\\n\\t$ends    = gmdate('Y-m-d H:i:s', time() + $c['ends']   * DAY_IN_SECONDS);\\n\\t$wpdb->insert($t, array(\\n\\t\\t'uuid'                   => wp_generate_uuid4(),\\n\\t\\t'name'                   => $c['name'],\\n\\t\\t'slug'                   => $c['slug'],\\n\\t\\t'description'            => $c['desc'],\\n\\t\\t'status'                 => $c['status'],\\n\\t\\t'priority'               => $c['priority'],\\n\\t\\t'product_selection_type' => $c['cat'] ? 'category' : 'all_products',\\n\\t\\t'category_ids'           => wp_json_encode($cat_ids),\\n\\t\\t'discount_type'          => $c['type'],\\n\\t\\t'discount_value'         => $c['value'],\\n\\t\\t'discount_rules'         => wp_json_encode(array('discount_type' => $c['type'], 'discount_value' => $c['value'])),\\n\\t\\t'starts_at'              => $starts,\\n\\t\\t'ends_at'                => $ends,\\n\\t\\t'timezone'               => 'UTC',\\n\\t\\t'created_by'             => 1,\\n\\t\\t'created_at'             => $starts,\\n\\t\\t'updated_at'             => $now,\\n\\t\\t'color_theme'            => $c['color'],\\n\\t\\t'icon'                   => $c['icon']\\n\\t));\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nglobal $wpdb;\\n$campaigns_table = $wpdb->prefix . 'wsscd_campaigns';\\n$active_table    = $wpdb->prefix . 'wsscd_active_discounts';\\n$now             = current_time('mysql');\\n\\\/\\\/ Map each campaign to the products it discounts, then write rows so the\\n\\\/\\\/ 'Active Discounts' view + product-page price strikethroughs both show data.\\n$mapping = array(\\n\\t'clothing-percent'   => array('clothing',    20.00, 'percentage'),\\n\\t'accessories-fixed'  => array('accessories', 5.00,  'fixed'),\\n\\t'electronics-tiered' => array('electronics', 10.00, 'tiered'),\\n\\t'books-bogo'         => array('books',       100.00,'bogo')\\n);\\nforeach ($mapping as $campaign_slug => $info) {\\n\\t$campaign = $wpdb->get_row($wpdb->prepare(\\\"SELECT id FROM {$campaigns_table} WHERE slug = %s\\\", $campaign_slug));\\n\\tif ( ! $campaign ) { continue; }\\n\\t$cat_term = get_term_by('slug', $info[0], 'product_cat');\\n\\tif ( ! $cat_term ) { continue; }\\n\\t$products = get_posts(array('post_type' => 'product', 'numberposts' => -1, 'tax_query' => array(array('taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $cat_term->term_id))));\\n\\tforeach ($products as $product_post) {\\n\\t\\t$product = wc_get_product($product_post->ID);\\n\\t\\tif ( ! $product ) { continue; }\\n\\t\\t$original = (float) $product->get_regular_price();\\n\\t\\tif ( 'percentage' === $info[2] ) {\\n\\t\\t\\t$discounted = round($original * (1 - $info[1] \\\/ 100), 2);\\n\\t\\t} elseif ( 'fixed' === $info[2] ) {\\n\\t\\t\\t$discounted = max(0, round($original - $info[1], 2));\\n\\t\\t} else {\\n\\t\\t\\t$discounted = $original;\\n\\t\\t}\\n\\t\\t$amount = round($original - $discounted, 2);\\n\\t\\t$wpdb->insert($active_table, array(\\n\\t\\t\\t'uuid'              => wp_generate_uuid4(),\\n\\t\\t\\t'campaign_id'       => $campaign->id,\\n\\t\\t\\t'product_id'        => $product->get_id(),\\n\\t\\t\\t'original_price'    => $original,\\n\\t\\t\\t'discounted_price'  => $discounted,\\n\\t\\t\\t'discount_amount'   => $amount,\\n\\t\\t\\t'discount_percentage'=> 'percentage' === $info[2] ? $info[1] : ($original > 0 ? round(($amount \\\/ $original) * 100, 2) : 0),\\n\\t\\t\\t'discount_type'     => $info[2],\\n\\t\\t\\t'discount_rules'    => wp_json_encode(array('discount_type' => $info[2], 'discount_value' => $info[1])),\\n\\t\\t\\t'valid_from'        => gmdate('Y-m-d H:i:s', time() - 14 * DAY_IN_SECONDS),\\n\\t\\t\\t'valid_until'       => gmdate('Y-m-d H:i:s', time() + 30 * DAY_IN_SECONDS),\\n\\t\\t\\t'timezone'          => 'UTC',\\n\\t\\t\\t'status'            => 'active',\\n\\t\\t\\t'priority'          => 3,\\n\\t\\t\\t'application_count' => rand(8, 64),\\n\\t\\t\\t'revenue_generated' => round(rand(120, 980) + (rand(0, 99) \\\/ 100), 2),\\n\\t\\t\\t'last_applied_at'   => gmdate('Y-m-d H:i:s', time() - rand(1, 48) * HOUR_IN_SECONDS),\\n\\t\\t\\t'created_at'        => $now,\\n\\t\\t\\t'updated_at'        => $now\\n\\t\\t));\\n\\t}\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nglobal $wpdb;\\n$analytics_table = $wpdb->prefix . 'wsscd_analytics';\\n$campaigns_table = $wpdb->prefix . 'wsscd_campaigns';\\n\\\/\\\/ Seed 30 days of daily analytics for each active campaign so the Analytics\\n\\\/\\\/ page renders real trend charts (revenue, impressions, conversions, AOV).\\n\\\/\\\/ Numbers chosen to look like a real growing-then-stabilising campaign.\\n$active = $wpdb->get_results(\\\"SELECT id, slug FROM {$campaigns_table} WHERE status = 'active'\\\");\\nforeach ($active as $campaign) {\\n\\t\\\/\\\/ Each campaign gets a slightly different baseline so the analytics page\\n\\t\\\/\\\/ shows interesting comparative bars instead of identical rows.\\n\\t$base_impr = rand(80, 220);\\n\\t$base_conv_rate = rand(35, 80) \\\/ 1000.0;  \\\/\\\/ 3.5%\\u20138% conversion\\n\\t$base_aov  = rand(45, 120);\\n\\tfor ($d = 29; $d >= 0; $d--) {\\n\\t\\t$date = gmdate('Y-m-d', time() - $d * DAY_IN_SECONDS);\\n\\t\\t\\\/\\\/ Realistic noise: weekend bump, gradual growth, occasional spike.\\n\\t\\t$dow = (int) gmdate('N', time() - $d * DAY_IN_SECONDS);\\n\\t\\t$weekend_mult = ($dow >= 6) ? 1.4 : 1.0;\\n\\t\\t$growth_mult  = 1.0 + (29 - $d) * 0.015;\\n\\t\\t$noise        = (rand(80, 120) \\\/ 100.0);\\n\\t\\t$impressions = (int) round($base_impr * $weekend_mult * $growth_mult * $noise);\\n\\t\\t$clicks      = (int) round($impressions * (rand(8, 18) \\\/ 100.0));\\n\\t\\t$conversions = (int) round($impressions * $base_conv_rate * $weekend_mult);\\n\\t\\t$revenue     = round($conversions * $base_aov * (rand(80, 120) \\\/ 100.0), 2);\\n\\t\\t$discount    = round($revenue * (rand(15, 25) \\\/ 100.0), 2);\\n\\t\\t$wpdb->insert($analytics_table, array(\\n\\t\\t\\t'campaign_id'         => $campaign->id,\\n\\t\\t\\t'date_recorded'       => $date,\\n\\t\\t\\t'hour_recorded'       => null,\\n\\t\\t\\t'impressions'         => $impressions,\\n\\t\\t\\t'clicks'              => $clicks,\\n\\t\\t\\t'conversions'         => $conversions,\\n\\t\\t\\t'revenue'             => $revenue,\\n\\t\\t\\t'discount_given'      => $discount,\\n\\t\\t\\t'cart_total'          => round($revenue + $discount, 2),\\n\\t\\t\\t'products_shown'      => $impressions,\\n\\t\\t\\t'products_purchased'  => $conversions,\\n\\t\\t\\t'unique_customers'    => max(1, (int) round($conversions * 0.85)),\\n\\t\\t\\t'returning_customers' => max(0, (int) round($conversions * 0.15)),\\n\\t\\t\\t'cart_additions'      => $clicks,\\n\\t\\t\\t'checkout_starts'     => (int) round($clicks * 0.6),\\n\\t\\t\\t'checkout_completions'=> $conversions,\\n\\t\\t\\t'average_order_value' => $conversions > 0 ? round($revenue \\\/ $conversions, 2) : 0,\\n\\t\\t\\t'device_mobile'       => (int) round($impressions * 0.55),\\n\\t\\t\\t'device_desktop'      => (int) round($impressions * 0.35),\\n\\t\\t\\t'device_tablet'       => (int) round($impressions * 0.10),\\n\\t\\t\\t'traffic_organic'     => (int) round($impressions * 0.40),\\n\\t\\t\\t'traffic_direct'      => (int) round($impressions * 0.25),\\n\\t\\t\\t'traffic_social'      => (int) round($impressions * 0.20),\\n\\t\\t\\t'traffic_email'       => (int) round($impressions * 0.10),\\n\\t\\t\\t'traffic_paid'        => (int) round($impressions * 0.05)\\n\\t\\t));\\n\\t}\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nglobal $wpdb;\\n$log_table       = $wpdb->prefix . 'wsscd_activity_log';\\n$campaigns_table = $wpdb->prefix . 'wsscd_campaigns';\\n$first_campaign_id = (int) $wpdb->get_var(\\\"SELECT id FROM {$campaigns_table} WHERE slug = 'clothing-percent' LIMIT 1\\\");\\n$flash_campaign_id = (int) $wpdb->get_var(\\\"SELECT id FROM {$campaigns_table} WHERE slug = 'summer-flash' LIMIT 1\\\");\\n$weekend_id        = (int) $wpdb->get_var(\\\"SELECT id FROM {$campaigns_table} WHERE slug = 'weekend-recurring' LIMIT 1\\\");\\n$tiered_id         = (int) $wpdb->get_var(\\\"SELECT id FROM {$campaigns_table} WHERE slug = 'electronics-tiered' LIMIT 1\\\");\\n$events = array(\\n\\tarray('campaign_activated',    array('campaign_name' => '20% Off All Clothing', 'by' => 'admin'),       $first_campaign_id, 2 * DAY_IN_SECONDS),\\n\\tarray('discount_applied',      array('order_id' => 1058, 'discount_amount' => 16.00, 'subtotal' => 80), $first_campaign_id, 4 * HOUR_IN_SECONDS),\\n\\tarray('discount_applied',      array('order_id' => 1057, 'discount_amount' => 24.00, 'subtotal' => 120),$first_campaign_id, 9 * HOUR_IN_SECONDS),\\n\\tarray('threshold_reached',     array('campaign_name' => 'Spend $75 \\u2014 Get Free Sports Gift', 'cart_total' => 86.50), null, 12 * HOUR_IN_SECONDS),\\n\\tarray('campaign_scheduled',    array('campaign_name' => 'Summer Flash Sale \\u2014 30% Off Home', 'starts_at' => gmdate('Y-m-d H:i:s', time() + 7 * DAY_IN_SECONDS)), $flash_campaign_id, 18 * HOUR_IN_SECONDS),\\n\\tarray('recurring_activated',   array('campaign_name' => 'Weekend-Only 15% Storewide', 'period' => 'Saturday 00:00 \\u2192 Sunday 23:59 UTC'), $weekend_id, 1 * DAY_IN_SECONDS),\\n\\tarray('tier_unlocked',         array('campaign_name' => 'Tiered Electronics', 'tier' => '15% off', 'cart_total' => 215.00), $tiered_id, 1 * DAY_IN_SECONDS + 6 * HOUR_IN_SECONDS),\\n\\tarray('discount_applied',      array('order_id' => 1051, 'discount_amount' => 9.00,  'subtotal' => 60),  $first_campaign_id, 2 * DAY_IN_SECONDS),\\n\\tarray('campaign_created',      array('campaign_name' => 'Weekend-Only 15% Storewide', 'by' => 'admin'),  $weekend_id, 3 * DAY_IN_SECONDS),\\n\\tarray('campaign_created',      array('campaign_name' => '20% Off All Clothing', 'by' => 'admin'),       $first_campaign_id, 30 * DAY_IN_SECONDS)\\n);\\nforeach ($events as $ev) {\\n\\t$wpdb->insert($log_table, array(\\n\\t\\t'event_type'  => $ev[0],\\n\\t\\t'event_data'  => wp_json_encode($ev[1]),\\n\\t\\t'campaign_id' => $ev[2],\\n\\t\\t'user_id'     => 1,\\n\\t\\t'created_at'  => gmdate('Y-m-d H:i:s', time() - $ev[3])\\n\\t));\\n}\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire '\\\/wordpress\\\/wp-load.php';\\nglobal $wpdb;\\n$usage_table     = $wpdb->prefix . 'wsscd_customer_usage';\\n$campaigns_table = $wpdb->prefix . 'wsscd_campaigns';\\n\\\/\\\/ Sample customer-usage rows so the 'Per-customer limits' feature looks real.\\n$campaign_id = (int) $wpdb->get_var(\\\"SELECT id FROM {$campaigns_table} WHERE slug = 'clothing-percent' LIMIT 1\\\");\\nif ( $campaign_id ) {\\n\\t$now = current_time('mysql');\\n\\t$customers = array(\\n\\t\\tarray('alex.morgan@demo.test',  3, 47.50, 285.00, $now),\\n\\t\\tarray('jordan.kim@demo.test',   1, 18.00, 120.00, $now),\\n\\t\\tarray('robin.osei@demo.test',   2, 32.00, 200.00, $now),\\n\\t\\tarray('taylor.park@demo.test',  1, 15.00, 75.00,  $now),\\n\\t\\tarray('sam.delgado@demo.test',  4, 78.00, 420.00, $now)\\n\\t);\\n\\tforeach ($customers as $u) {\\n\\t\\t$wpdb->insert($usage_table, array(\\n\\t\\t\\t'campaign_id'           => $campaign_id,\\n\\t\\t\\t'customer_email'        => $u[0],\\n\\t\\t\\t'usage_count'           => $u[1],\\n\\t\\t\\t'first_used_at'         => gmdate('Y-m-d H:i:s', time() - 20 * DAY_IN_SECONDS),\\n\\t\\t\\t'last_used_at'          => gmdate('Y-m-d H:i:s', time() - rand(1, 5) * DAY_IN_SECONDS),\\n\\t\\t\\t'total_discount_amount' => $u[2],\\n\\t\\t\\t'total_order_value'     => $u[3],\\n\\t\\t\\t'status'                => 'active',\\n\\t\\t\\t'created_at'            => $u[4],\\n\\t\\t\\t'updated_at'            => $u[4]\\n\\t\\t));\\n\\t}\\n}\\n?>\"},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.10","1.0.2","1.0.4","1.0.6","1.0.7","1.0.8","1.1.0","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","1.3.0","1.4.0","1.5.0","1.5.1","1.5.3","1.5.4","1.5.5","1.5.6","1.5.61","1.5.62","1.5.63","1.5.64","1.5.65","1.5.66","1.5.67","1.5.68","1.5.69","1.5.70","1.6.2","1.7.0","1.7.1","1.7.11","1.7.20","1.7.21","1.7.22","1.7.23","1.7.25","1.7.26","1.7.27","1.7.29","1.7.31","1.7.33","1.7.34","1.7.36","1.7.40","1.7.41","1.7.42","1.7.43","1.7.44","1.7.45","1.7.46","1.7.64","1.7.65","1.8.0","1.8.1","1.8.11","1.8.12","1.8.13","1.8.14","1.8.15","1.8.17","1.8.18","1.8.19","1.8.20","1.8.21","1.8.22","1.8.23","1.8.24","1.8.25","1.8.26","1.8.27","1.8.28","1.8.29","1.8.30","2.0.0","2.0.1","2.0.2","2.0.5","2.0.6","2.1.1","2.1.10","2.1.11","2.1.12","2.1.13","2.1.14","2.1.15","2.1.16","2.1.17","2.1.2","2.1.3","2.1.4","2.1.5","2.1.6","2.1.7","2.1.8","2.1.9","2.2.0","2.2.1","2.2.2","2.2.21","2.2.22","2.2.24","2.2.25","2.2.26","2.2.27","2.2.28","2.2.29","2.2.30","2.2.31","2.2.32","2.2.33","2.2.34","2.2.35","2.2.36","2.2.37","2.2.38","2.2.40","2.2.41","2.2.42"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3444028,"resolution":"1","location":"assets","locale":"","width":1697,"height":875},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3444028,"resolution":"10","location":"assets","locale":"","width":1697,"height":877},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3444028,"resolution":"11","location":"assets","locale":"","width":1741,"height":885},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3444028,"resolution":"2","location":"assets","locale":"","width":1716,"height":918},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3444028,"resolution":"3","location":"assets","locale":"","width":1717,"height":871},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3444028,"resolution":"4","location":"assets","locale":"","width":1718,"height":872},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3444028,"resolution":"5","location":"assets","locale":"","width":1718,"height":872},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3444028,"resolution":"6","location":"assets","locale":"","width":1717,"height":872},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3444028,"resolution":"7","location":"assets","locale":"","width":1697,"height":877},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3444028,"resolution":"8","location":"assets","locale":"","width":1698,"height":878},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3444028,"resolution":"9","location":"assets","locale":"","width":1698,"height":877}},"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"}},"plugin_section":[],"plugin_tags":[13477,331,5447,186632,166977],"plugin_category":[45],"plugin_contributors":[254395],"plugin_business_model":[],"class_list":["post-265799","plugin","type-plugin","status-publish","hentry","plugin_tags-bogo","plugin_tags-discount","plugin_tags-sale","plugin_tags-sale-badge","plugin_tags-tiered-pricing","plugin_category-ecommerce","plugin_contributors-webstepper","plugin_committers-webstepper","plugin_support_reps-webstepperio"],"banners":{"banner":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/banner-772x250.png?rev=3506387","banner_2x":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/banner-1544x500.png?rev=3506387","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/icon.svg?rev=3461509","icon":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/icon.svg?rev=3461509","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-1.png?rev=3444028","caption":"Setup wizard - Scans your store, detects conflicting plugins, and guides you to your first campaign"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-2.png?rev=3444028","caption":"Campaign wizard Step 1 - Auto-generated campaign name, description, priority, and contextual help"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-3.png?rev=3444028","caption":"Campaign wizard Step 2 - Product selection with category and tag filtering"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-4.png?rev=3444028","caption":"Campaign wizard Step 3 - Discount configuration with live badge preview and positioning"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-5.png?rev=3444028","caption":"Campaign wizard Step 4 - Schedule with preset durations, date picker, and recurring options"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-6.png?rev=3444028","caption":"Campaign wizard Step 5 - Review with Campaign Intelligence recommendations and summary sidebar"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-7.png?rev=3444028","caption":"Campaign completion - Choose next step: view campaign, preview store, or create another"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-8.png?rev=3444028","caption":"Campaigns list - Table and card grid views with status, health scores, and quick actions"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-9.png?rev=3444028","caption":"Campaign overview panel - Full campaign settings and real-time performance at a glance"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-10.png?rev=3444028","caption":"Main dashboard - Store intelligence, campaign cards sorted by urgency, and planner"},{"src":"https:\/\/ps.w.org\/smart-cycle-discounts\/assets\/screenshot-11.png?rev=3444028","caption":"Analytics dashboard (Pro) - Revenue, conversions, click-through rates, and performance trends"}],"raw_content":"<!--section=description-->\n<p><strong>Automated dynamic pricing and scheduled sales for WooCommerce.<\/strong> Smart Cycle Discounts lets you create a discount campaign in minutes and run it on autopilot \u2014 sale prices apply on schedule, conflicts are caught before they cost you money, and your prices revert cleanly when the sale ends.<\/p>\n\n<p><strong>Cycle AI<\/strong> \u2014 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.<\/p>\n\n<p>No more editing products one by one. No more forgetting to end a sale. No more wondering which discount is overriding which.<\/p>\n\n<p>Pick your discount type (percentage off, BOGO, tiered pricing, and more), choose your products, set your schedule, and the plugin handles the rest \u2014 <strong>from activation to expiration, automatically<\/strong>.<\/p>\n\n<p>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.<\/p>\n\n<h4>Video Tutorial<\/h4>\n\n<p>https:\/\/youtu.be\/dKFhduoevro<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/cycle-ai\/\">Cycle AI<\/a><\/strong> \u2014 describe what you want in plain English, the AI drafts a store-aware campaign. Free: 10 drafts\/month. Pro: 50\/day<\/li>\n<li><strong>Set it and forget it<\/strong> \u2014 campaigns activate and expire on schedule, no manual work<\/li>\n<li><strong>Auto-apply or coupon code delivery<\/strong> \u2014 every campaign can either fire automatically at checkout or require a code customers enter, on every discount type (not just percentage\/fixed)<\/li>\n<li><strong>Percentage off, fixed amount, BOGO<\/strong> \u2014 all free, no upgrade required<\/li>\n<li><strong>Tiered pricing, spend thresholds, bundles<\/strong> \u2014 available in Pro<\/li>\n<li><strong>Recurring promotions<\/strong> \u2014 set up a \"Weekend Sale\" once, it repeats automatically<\/li>\n<li><strong>Smart conflict detection<\/strong> \u2014 the plugin warns you before overlapping discounts cause problems<\/li>\n<li><strong><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/campaign-management\/campaign-intelligence-system\/\">Campaign Intelligence<\/a><\/strong> \u2014 tells you which promotions are working and what to do next<\/li>\n<li><strong><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/campaign-wizard\/campaign-wizard-overview\/\">5-step wizard<\/a><\/strong> \u2014 create a campaign in minutes with guided setup and live preview<\/li>\n<li><strong>Setup wizard<\/strong> \u2014 scans your store on first install, detects conflicts, gets you started fast<\/li>\n<li><strong><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/campaign-management\/campaign-priority-system\/\">Priority system<\/a><\/strong> \u2014 control exactly which discount wins when campaigns overlap<\/li>\n<li><strong>Works with any theme<\/strong> \u2014 uses WooCommerce's native sale price system<\/li>\n<\/ul>\n\n<h4>Perfect For<\/h4>\n\n<ul>\n<li>Stores running <strong>seasonal sales<\/strong> (Black Friday, holiday, summer) that need to start and stop on time<\/li>\n<li>Stores with <strong>multiple promotions<\/strong> that need to avoid conflicts and overlapping discounts<\/li>\n<li>Stores that want to <strong>automate recurring deals<\/strong> (weekly specials, daily flash sales)<\/li>\n<li><strong>B2B and wholesale<\/strong> stores using role-based or tiered quantity pricing<\/li>\n<li>Anyone tired of <strong>manually editing product prices<\/strong> every time a sale starts or ends<\/li>\n<\/ul>\n\n<h4>WooCommerce Discount Types and Dynamic Pricing Features<\/h4>\n\n<p><strong>Free version includes:<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/percentage-discounts\/\">Percentage discounts<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/fixed-amount-discounts\/\">Fixed amount discounts<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/buy-one-get-one-bogo\/\">BOGO (Buy One Get One) deals<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/coupon-code-campaigns\/\">Coupon-code campaigns<\/a> \u2014 require a shared code at checkout for any discount type<\/li>\n<li>URL auto-apply (<code>?wsscd_code=YOURCODE<\/code>) for sharing codes in emails and social posts<\/li>\n<li>Free shipping toggle inside campaign setup<\/li>\n<li>User role targeting (include\/exclude roles)<\/li>\n<li>Location targeting by billing or shipping country<\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/scheduling\/recurring-campaigns\/\">Recurring campaign scheduling<\/a> \u2014 certain weekdays, days of the month, or daily time windows<\/li>\n<\/ul>\n\n<p><strong>Pro version adds:<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/tiered-volume-pricing\/\">Tiered quantity discounts<\/a> (volume pricing)<\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/spend-threshold-discounts\/\">Spend threshold discounts<\/a> (cart-based conditions)<\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/bundle-discounts\/\">Bundle deals<\/a> (percentage, fixed, flat bundle pricing)<\/li>\n<li>Bulk unique-code generation (up to 50,000 single-use codes per campaign, CSV export)<\/li>\n<li>Single-use enforcement (lock a code to one redemption per code or per customer)<\/li>\n<li>Advanced discount-rule controls for deeper eligibility and margin protection<\/li>\n<li>Advanced subscription discount controls (when WooCommerce Subscriptions is active)<\/li>\n<li>Full <a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/analytics-reporting\/analytics-dashboard-overview\/\">analytics dashboard<\/a> and advanced exports<\/li>\n<\/ul>\n\n<h4>Advanced WooCommerce Promotion Engine<\/h4>\n\n<p>Smart Cycle Discounts is built as a <strong>campaign system<\/strong>, not a one-off rule editor.<\/p>\n\n<ul>\n<li>Campaign lifecycle management (draft \u2192 scheduled \u2192 active \u2192 expired)<\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/product-selection\/\">Smart product targeting<\/a> (all products, specific products, random products, categories, advanced filters)<\/li>\n<li>Timezone-aware scheduling automation<\/li>\n<li>Priority resolution when campaigns overlap<\/li>\n<li>Optimized caching and operations for larger WooCommerce catalogs<\/li>\n<\/ul>\n\n<h4>WooCommerce Promotion Conflict Detection<\/h4>\n\n<p>Before launch, Campaign Health and Campaign Intelligence evaluate operational risks including:<\/p>\n\n<ul>\n<li>Promotion conflicts and overlapping discounts<\/li>\n<li>Priority ties across concurrent campaigns<\/li>\n<li>Stock exposure and product readiness<\/li>\n<li>Schedule and timing consistency<\/li>\n<li>Discount integrity and risk indicators<\/li>\n<\/ul>\n\n<p>This shifts teams from reactive troubleshooting to <strong>proactive promotion control<\/strong>.<\/p>\n\n<h4>WooCommerce Campaign Analytics and Intelligence<\/h4>\n\n<p>Smart Cycle Discounts includes campaign-level operational insight so you can evaluate:<\/p>\n\n<ul>\n<li>Which campaigns are driving meaningful revenue<\/li>\n<li>Which discounted products perform best<\/li>\n<li>Which promotions should be scaled, paused, or redesigned<\/li>\n<\/ul>\n\n<p>The analytics dashboard helps stores <strong>optimize promotions instead of guessing which discounts work best<\/strong>.<\/p>\n\n<p>Advanced analytics depth and exports are available in Pro, while base Campaign Intelligence guidance is included in the free version.<\/p>\n\n<h4>Popular WooCommerce Promotion Use Cases<\/h4>\n\n<p>Smart Cycle Discounts can be used to run:<\/p>\n\n<ul>\n<li>WooCommerce BOGO campaigns<\/li>\n<li>WooCommerce bulk discount and tiered pricing campaigns<\/li>\n<li>WooCommerce scheduled sales and recurring promotions<\/li>\n<li>WooCommerce bundle discount campaigns and product packages<\/li>\n<li>WooCommerce flash sales and seasonal campaigns<\/li>\n<li>WooCommerce customer-segment discounts (roles and locations)<\/li>\n<li>WooCommerce coupon code campaigns (private codes for email blasts, influencer codes, loyalty rewards)<\/li>\n<li>WooCommerce promotion cycles with planned campaign scheduling<\/li>\n<\/ul>\n\n<h4>Why Store Owners Switch to Smart Cycle Discounts<\/h4>\n\n<p>Most discount plugins let you create rules. Smart Cycle Discounts lets you <strong>run promotions<\/strong>.<\/p>\n\n<p><strong>Common problems with other discount plugins:<\/strong><\/p>\n\n<ul>\n<li>Discounts calculated on-the-fly slow your store to a crawl<\/li>\n<li>\"Sale\" filter plugins can't find your discounted products<\/li>\n<li>Two discounts overlap and customers get double savings you didn't intend<\/li>\n<li>The free version is empty \u2014 every useful feature is locked behind Pro<\/li>\n<li>Uninstalling leaves leftover sale tags and data in your database<\/li>\n<\/ul>\n\n<p><strong>How Smart Cycle Discounts is different:<\/strong><\/p>\n\n<ul>\n<li><strong>Sale badges and strikethrough on your storefront<\/strong> \u2014 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 \u2014 active-campaign data is cached and product terms batch-loaded to keep pages fast.<\/li>\n<li><strong>Built-in conflict detection<\/strong> \u2014 Campaign Intelligence catches overlapping discounts, priority ties, and pricing risks before your customers do. You'll know about problems before they cost you money.<\/li>\n<li><strong>Genuinely useful free version<\/strong> \u2014 percentage off, fixed amount, BOGO, scheduling, recurring campaigns, role targeting, and location targeting are all included free. No bait-and-switch.<\/li>\n<li><strong>Clean uninstall<\/strong> \u2014 deactivating or removing the plugin restores your original prices and removes all plugin data. No leftover sale tags or orphaned database entries.<\/li>\n<li><strong>Performance-first architecture<\/strong> \u2014 active campaigns are cached, product terms are batch-loaded, and admin assets only load on plugin pages. Your store stays fast.<\/li>\n<\/ul>\n\n<h4>Documentation &amp; Resources<\/h4>\n\n<p><strong>Getting started<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/getting-started\/installation-guide\/\">Installation guide<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/getting-started\/creating-your-first-campaign\/\">Create your first campaign<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/getting-started\/free-pro-features\/\">Free vs Pro features<\/a><\/li>\n<\/ul>\n\n<p><strong>Guides<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/\">Discount types reference<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/scheduling\/\">Scheduling &amp; recurring campaigns<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/cycle-ai\/\">Cycle AI<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/use-cases\/\">Use case walkthroughs<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/developer-documentation\/\">Developer documentation<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/troubleshooting\/\">Troubleshooting<\/a><\/li>\n<\/ul>\n\n<p><strong>More<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/\">Full documentation hub<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/wordpress\/plugins\/smart-cycle-discounts\/\">Plugin page<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/woocommerce-discount-calculator\/\">WooCommerce discount calculator<\/a><\/li>\n<li><a href=\"https:\/\/webstepper.io\/wordpress\/plugins\/smart-cycle-discounts\/changelog\/\">Changelog<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/smart-cycle-discounts\/\">Support forum<\/a><\/li>\n<\/ul>\n\n<h4>More from Webstepper<\/h4>\n\n<p><strong><a href=\"https:\/\/wordpress.org\/plugins\/trustlens\/\">TrustLens \u2014 Fraud Prevention &amp; Chargeback Defense for WooCommerce<\/a><\/strong> \u2014 Smart Cycle Discounts grows your revenue; TrustLens protects it. It scores every customer 0\u2013100 and catches return abuse, coupon fraud, fraud rings, and card-testing attacks before they hit your margin \u2014 all 8 detection modules free, and you stay in control: block, allowlist, or just watch.<\/p>\n\n<h4>Get Started<\/h4>\n\n<ol>\n<li>Install and activate the plugin<\/li>\n<li>The setup wizard scans your store and checks for conflicts<\/li>\n<li>Create your first campaign \u2014 describe it to Cycle AI or use the 5-step wizard<\/li>\n<li>Your discounts go live automatically \u2014 no product editing needed<\/li>\n<\/ol>\n\n<h4>Need Help?<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/\">Documentation<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.org\/support\/plugin\/smart-cycle-discounts\/\">Support Forum<\/a><\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>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.<\/p>\n\n<p><strong>What the service does.<\/strong> When you use Cycle AI, the plugin sends your typed prompt and a summary of your store catalog to Webstepper's hosted endpoint at <code>cycle-ai-proxy.usa-mv96.workers.dev<\/code>. That endpoint verifies your plan tier with Freemius, enforces a per-plan usage quota, then forwards the request to OpenAI (<code>api.openai.com<\/code>). 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.<\/p>\n\n<p><strong>What data is sent.<\/strong><\/p>\n\n<ul>\n<li>Your typed prompt and the conversation history for the current draft.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<p><strong>What data is NOT sent.<\/strong> The plugin does not transmit customer names, customer email addresses, order data, transaction history, or any personally identifiable information about your shoppers.<\/p>\n\n<p><strong>When data is sent.<\/strong> 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.<\/p>\n\n<p><strong>Consent.<\/strong> 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.<\/p>\n\n<p><strong>Providers and policies.<\/strong><\/p>\n\n<ul>\n<li>Webstepper (hosted AI service, rate limiting, tier validation): <a href=\"https:\/\/webstepper.io\/privacy-policy\/\">Privacy Policy<\/a> \u2014 <a href=\"https:\/\/webstepper.io\/terms-of-service\/\">Terms of Service<\/a><\/li>\n<li>OpenAI (the underlying language model): <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">Privacy Policy<\/a> \u2014 <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">Terms of Use<\/a><\/li>\n<\/ul>\n\n<p>If you do not use Cycle AI, no external service calls are made by this plugin.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20schedule%20woocommerce%20sales%20automatically%3F\"><h3>How do I schedule WooCommerce sales automatically?<\/h3><\/dt>\n<dd><p>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 <a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/scheduling\/automatic-activation\/\">automatic activation<\/a> for the details.<\/p><\/dd>\n<dt id=\"what%20woocommerce%20discount%20types%20are%20supported%3F\"><h3>What WooCommerce discount types are supported?<\/h3><\/dt>\n<dd><p>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 <a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/\">discount types reference<\/a> for a full breakdown.<\/p><\/dd>\n<dt id=\"is%20this%20a%20woocommerce%20dynamic%20pricing%20plugin%3F\"><h3>Is this a WooCommerce dynamic pricing plugin?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20set%20up%20bogo%20deals%20in%20woocommerce%20with%20this%20plugin%3F\"><h3>Can I set up BOGO deals in WooCommerce with this plugin?<\/h3><\/dt>\n<dd><p>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 <a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/buy-one-get-one-bogo\/\">BOGO guide<\/a> for setup examples.<\/p><\/dd>\n<dt id=\"how%20do%20i%20create%20bulk%20discounts%20for%20woocommerce%3F\"><h3>How do I create bulk discounts for WooCommerce?<\/h3><\/dt>\n<dd><p>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 <a href=\"https:\/\/webstepper.io\/docs\/smart-cycle-discounts\/discount-types\/tiered-volume-pricing\/\">tiered volume pricing<\/a>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20automate%20black%20friday%20and%20cyber%20monday%20sales%3F\"><h3>How do I automate Black Friday and Cyber Monday sales?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20alongside%20another%20discount%20plugin%3F\"><h3>Can I use this alongside another discount plugin?<\/h3><\/dt>\n<dd><p>We recommend against running two discount plugins simultaneously \u2014 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.<\/p><\/dd>\n<dt id=\"is%20smart%20cycle%20discounts%20compatible%20with%20my%20theme%3F\"><h3>Is Smart Cycle Discounts compatible with my theme?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20campaigns%20in%20advance%3F\"><h3>Can I schedule campaigns in advance?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20many%20campaigns%20can%20i%20create%3F\"><h3>How many campaigns can I create?<\/h3><\/dt>\n<dd><p>There are no campaign limits - you can create and run <strong>unlimited campaigns<\/strong> in both the free and Pro versions. Run as many simultaneous promotions as your store needs.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20the%20discount%20types%3F\"><h3>What's the difference between the discount types?<\/h3><\/dt>\n<dd><p><strong>Free Version:<\/strong>\n- <strong>Percentage<\/strong>: Reduce price by a percentage (e.g., 25% off = $100 product becomes $75)\n- <strong>Fixed Amount<\/strong>: Reduce price by fixed amount (e.g., $10 off = $100 product becomes $90)\n- <strong>BOGO<\/strong>: Buy One Get One offers with flexible configurations (e.g., Buy 2 Get 1 Free)<\/p>\n\n<p><strong>Pro Version:<\/strong>\n- <strong>Tiered<\/strong>: Quantity-based dynamic pricing (e.g., Buy 5 get 10% off, Buy 10 get 20% off)\n- <strong>Spend Threshold<\/strong>: Discount based on cart total (e.g., Spend $100 get 15% off)\n- <strong>Bundle<\/strong>: Product bundle deals (e.g., Buy shampoo + conditioner + mask for 20% off)<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>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.<\/p>\n\n<p>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.<\/p><\/dd>\n<dt id=\"will%20my%20discounted%20products%20show%20a%20sale%20badge%3F\"><h3>Will my discounted products show a sale badge?<\/h3><\/dt>\n<dd><p>Yes \u2014 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 <code>_sale_price<\/code> field \u2014 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.<\/p><\/dd>\n<dt id=\"can%20i%20run%20multiple%20discount%20campaigns%20at%20the%20same%20time%3F\"><h3>Can I run multiple discount campaigns at the same time?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20%22all%20products%22%2C%20%22specific%20products%22%2C%20and%20%22random%20products%22%3F\"><h3>What's the difference between \"All Products\", \"Specific Products\", and \"Random Products\"?<\/h3><\/dt>\n<dd><ul>\n<li><strong>All Products<\/strong> - Applies discount to your entire product catalog. Best for store-wide sales.<\/li>\n<li><strong>Specific Products<\/strong> - You manually select which products to discount using the AJAX-powered product search. Best for targeted promotions.<\/li>\n<li><strong>Random Products<\/strong> - Plugin automatically selects X random products from your catalog each day. Best for \"deal of the day\" promotions that drive repeat visits.<\/li>\n<\/ul><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with WooCommerce HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20subscriptions%3F\"><h3>Does it work with WooCommerce Subscriptions?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20block-based%20cart%20and%20checkout%3F\"><h3>Does it work with WooCommerce block-based cart and checkout?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20duplicate%20an%20existing%20campaign%3F\"><h3>Can I duplicate an existing campaign?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"how%20does%20the%20priority%20system%20work%3F\"><h3>How does the priority system work?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20export%20campaign%20data%3F\"><h3>Can I export campaign data?<\/h3><\/dt>\n<dd><p>Campaign analytics and export features are available in the <strong>Pro version<\/strong>. Pro users can export campaign performance data in CSV or JSON format, and schedule automated reports.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20campaign%20ends%3F\"><h3>What happens when a campaign ends?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"is%20there%20a%20way%20to%20test%20campaigns%20before%20activating%20them%3F\"><h3>Is there a way to test campaigns before activating them?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>Draft<\/strong> 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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20variable%20products%3F\"><h3>Does it work with WooCommerce variable products?<\/h3><\/dt>\n<dd><p>Yes. Smart Cycle Discounts fully supports WooCommerce variable products. By default, applying a discount to a variable product discounts all of its variations, and the sale price displays correctly on both the main product page and individual variation selections.<\/p>\n\n<p>With a PRO license you can also narrow a campaign to individual variations: pick a variable product under <strong>Specific Products<\/strong>, then choose which variations should be discounted. Only those variations change price, and the rest of the product stays at its regular price.<\/p><\/dd>\n<dt id=\"can%20i%20build%20a%20page%20that%20lists%20only%20the%20discounted%20products%3F\"><h3>Can I build a page that lists only the discounted products?<\/h3><\/dt>\n<dd><p>Yes, and you do not have to build it by hand: go to <strong>Tools -&gt; Sale Page<\/strong> and click Create Page. The plugin makes a draft page with the shortcode already in it, and you publish it when you are ready.<\/p>\n\n<p>To place it yourself, put <code>[wsscd_sale_products]<\/code> on any page or post. It lists every product your active campaigns are currently discounting, using your theme's own product grid, and accepts <code>columns<\/code>, <code>limit<\/code>, <code>orderby<\/code>, <code>order<\/code>, <code>category<\/code>, <code>campaign<\/code> and <code>paginate<\/code> attributes. The page is paginated by default; pass <code>paginate=\"no\"<\/code> to render the whole sale at once.<\/p>\n\n<p>With a PRO license, add <code>show_variations=\"yes\"<\/code> and each discounted variation is listed as its own item instead of its parent product - useful for a clearance page where only one size or configuration is on sale. Each card links to that exact variation and its button adds that variation straight to the cart.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20products%20that%20are%20already%20on%20sale%3F\"><h3>Can I exclude products that are already on sale?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20offer%20free%20shipping%20with%20discount%20campaigns%3F\"><h3>Can I offer free shipping with discount campaigns?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20create%20wholesale%20or%20member-only%20discounts%3F\"><h3>Can I create wholesale or member-only discounts?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20alongside%20woocommerce%20coupons%3F\"><h3>Does it work alongside WooCommerce coupons?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20two%20campaigns%20affect%20the%20same%20product%3F\"><h3>What happens if two campaigns affect the same product?<\/h3><\/dt>\n<dd><p>The campaign with the higher priority wins \u2014 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.<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20woocommerce%27s%20built-in%20sale%20price%20feature%3F\"><h3>How is this different from WooCommerce's built-in sale price feature?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20create%20recurring%20weekly%20or%20monthly%20promotions%3F\"><h3>Can I create recurring weekly or monthly promotions?<\/h3><\/dt>\n<dd><p>Yes. Recurring campaigns are available in the free version. Choose \"On a schedule\" in the wizard and pick when the discount runs: certain weekdays (like every Monday &amp; Tuesday), days of the month (including \"last day\"), or every day within a time window \u2014 daily happy hours and overnight windows included. Run it forever or until a date, and the preview shows you the exact next dates it will fire. Set up a \"Weekend Special\" once and it repeats every weekend automatically.<\/p><\/dd>\n<dt id=\"is%20there%20a%20limit%20on%20how%20many%20products%20i%20can%20discount%3F\"><h3>Is there a limit on how many products I can discount?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20set%20minimum%20order%20requirements%20for%20discounts%3F\"><h3>Can I set minimum order requirements for discounts?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20uninstall%20the%20plugin%3F\"><h3>What happens if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Your store goes back to normal. Deactivating the plugin automatically restores your original product prices \u2014 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.<\/p><\/dd>\n<dt id=\"how%20do%20i%20control%20discount%20stacking%20with%20coupons%3F\"><h3>How do I control discount stacking with coupons?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.2.42<\/h4>\n\n<ul>\n<li>Improvement: The campaign explains a short draw \u2014 when fewer products qualify than you asked for, the campaign shows how many were selected and why, for example \"Only 7 of 15 random products could be selected\u2026 8 are already on sale\".<\/li>\n<li>Improvement: Clearer activity notice \u2014 \"No discount activity detected\" read like the discount was not showing. It counts orders, and now says \"No orders have used this discount\".<\/li>\n<li>Fix: Random campaigns keep their full product count \u2014 a campaign set to skip items already on sale counted its own discount as a sale. At every rotation it ruled out the products it had just discounted, so a 15-product draw came back with 7, and a pool narrowed by a stock filter could end at 0. Only prices you set in WooCommerce count as \"on sale\" now.<\/li>\n<li>Fix: A higher-priority campaign that cannot apply no longer blocks the next one \u2014 when the top campaign's own rules ruled it out for a product (sale items excluded, country not targeted, usage limit reached), the product was left at full price even though a lower-priority campaign covered it. The next campaign in line now applies, and the sale badge always names the campaign that actually prices the product.<\/li>\n<li>Fix: Conflict notes count the right thing, in the right direction \u2014 a winning campaign with one product shared by three others read \"3 shared products are overridden\". It now reads \"Overrides lower-priority campaigns on 1 shared product\", and counts products, not campaigns.<\/li>\n<li>Fix: Two random campaigns on the same products no longer share a draw \u2014 they could be handed each other's cached selection.<\/li>\n<li>Fix: Changing the tag, category or sale-items setting of a running random campaign now takes effect \u2014 it previously kept serving the old selection until the next rotation.<\/li>\n<li>Fix: \"Exclude out of stock\" filters behave in the Products step \u2014 the product list ignored exclude filters, and the checker misread \"exclude \/ is not\" as a contradiction.<\/li>\n<li>Cleanup: Removed the \"Campaign Stacking\" option \u2014 each product always receives one campaign's discount, chosen by priority, so the checkbox never changed anything. Existing campaigns are unaffected.<\/li>\n<li>Cleanup: Smaller debug logs \u2014 discount entries no longer copy the whole product into the log.<\/li>\n<\/ul>\n\n<h4>2.2.41<\/h4>\n\n<ul>\n<li>Fix: The Account screen no longer ends in a critical error \u2014 on a site that skipped the account connection step, opening Smart Cycle Discounts \u2192 Account showed \"There has been a critical error on this website\" instead of a page. That screen can only describe an account that exists, and it was being added to the menu whether one existed or not, so with nothing connected it had nothing to read. It now shows a Connect account or activate license button instead, and stays out of the menu entirely until there is something to show. If you were caught by this, your license can also be activated from the Plugins page, using the Activate License link under Smart Cycle Discounts.<\/li>\n<li>Cleanup: A licensing screen that cannot render now says so \u2014 these screens come from the licensing framework and assume an account state we do not always control. Any future assumption they make that is not met now produces a short message on the page rather than taking the whole admin screen down.<\/li>\n<\/ul>\n\n<h4>2.2.40<\/h4>\n\n<ul>\n<li>New: Discount a single variation instead of the whole product (PRO) \u2014 pick a variable product under Specific Products and a second field appears listing its variations. Choose one and only that variation changes price; every other size, colour or configuration stays at its regular price. Until now a campaign applied to a variable product always discounted all of its variations, with no way to narrow it.<\/li>\n<li>New: One-click sale page \u2014 Tools now has a Sale Page card that creates a draft page already carrying the shortcode, with Edit and View links once it exists. The shortcode that lists your discounted products has been in the plugin since 2.1.16 but appeared nowhere in the admin, so the only way to discover it was to read the plugin's source.<\/li>\n<li>New: The sale page can list variations as separate items (PRO) \u2014 with show_variations=\"yes\" a discounted 180x200 mattress appears as its own card, with its own price and a button that adds exactly that variation to the cart, rather than appearing as the parent product with every size still to choose from.<\/li>\n<li>New: The sale page pages itself \u2014 it previously rendered every discounted product on one page, which on a large clearance sale meant hundreds of items in a single request. Add paginate=\"no\" for the old behaviour.<\/li>\n<li>New: Campaign changes clear the page cache \u2014 a campaign going live, ending or changing status now asks WP Rocket, W3 Total Cache, WP Super Cache, WP Fastest Cache, SiteGround Optimizer, LiteSpeed, Cache Enabler, Breeze, Nginx Helper and Hummingbird to drop their cached pages. Prices used to keep showing the pre-campaign figures until the cache expired on its own. Host-level caches can listen for the new wsscd_purge_page_cache hook.<\/li>\n<li>Fix: The sale page matches your theme \u2014 its cards are now built through WooCommerce's own product-loop hooks, so the sale flash, the rating, the theme's own card layout and this plugin's promotional badges all appear exactly as they do on your shop page. The variation cards previously used their own markup and showed none of them.<\/li>\n<li>Fix: A variation-only campaign shows a badge on the shop page \u2014 when a campaign discounted just one variation, the parent product matched no campaign, so its card in the catalogue carried no badge at all.<\/li>\n<li>Fix: A sale page filtered by category no longer drops variations \u2014 variations carry no categories of their own, so filtering by one discarded every variation-scoped campaign. They are now matched through their parent's categories.<\/li>\n<li>Fix: Sorting on the sale page \u2014 orderby now works for price, title and date when variations are listed individually.<\/li>\n<\/ul>\n\n<h4>2.2.38<\/h4>\n\n<ul>\n<li>Fix: The review step can be left again \u2014 the Edit buttons on the summary, the step links in the progress bar and the Back button all reported \"Navigation failed. Please try again.\" and stayed put. The wizard tries to save the step you are leaving, and the review step has no form to save, so the save could not happen and the move was refused. Only Publish was unaffected, which is why a wizard you cannot navigate backwards out of still looked healthy.<\/li>\n<li>Fix: Saving settings now tells you it saved \u2014 the page displayed a message box that nothing ever wrote to, so changing log verbosity, retention or any other option gave no confirmation at all. The values were being stored correctly the whole time; there was simply no sign of it.<\/li>\n<li>Fix: The published-campaign dialog can be closed \u2014 after publishing, the dialog offered three buttons and every one of them navigated away. There was no close control, and the Escape key answered only when something had gone wrong. It now has a close button, and Escape works once the save has finished.<\/li>\n<li>Fix: That dialog is no longer see-through at the top \u2014 the top third of the card was almost fully transparent, so the celebration and the headline sat over the dimmed page behind them and read as a rendering fault.<\/li>\n<li>Fix: Campaign names are readable in the list \u2014 the name column was the narrowest in the table, narrower than the actions beside it, so names broke mid-word and each row stood nearly three times taller than it needed to. The name column now takes the space the layout always intended for it, and the list shows far more campaigns at a glance.<\/li>\n<li>Fix: Section descriptions on the settings pages read as descriptions \u2014 each one was rendered as a filled alert box with an accent bar, floating a line below its heading, so a page of ordinary explanatory text looked like a page of warnings.<\/li>\n<li>Cleanup: Internal tidying \u2014 a save mechanism the WordPress Settings API had already replaced, a message box with no writer, and a stylesheet rule nothing reached, all removed; plus a new development check that catches the class of markup fault behind two of the fixes above.<\/li>\n<\/ul>\n\n<h4>2.2.37<\/h4>\n\n<ul>\n<li>New: Choose how long analytics are kept \u2014 Settings \u2192 General now has an analytics retention period. It had been fixed at 90 days by a value nothing in the plugin could change. Set it to 0 to keep everything.<\/li>\n<li>Fix: A discount code was taking its discount twice \u2014 a campaign set to 25% off billed the customer 50% off. A $400 cart came to $200 instead of $300. The price shown on the cart line was already reduced, and the code then reported the same saving again as its own discount, so WooCommerce took it off a second time. Every code-required campaign was affected, at every discount type and every percentage. Campaigns that apply automatically were never affected.<\/li>\n<li>Fix: Older orders are credited to the campaign that discounted them \u2014 when an order carried no per-item campaign details, the plugin looked the campaign up by product instead. That lookup returned \"no campaign\" every single time, without ever running, so those sales never reached the campaign's conversion or revenue figures. Reports understated exactly the orders that needed the fallback.<\/li>\n<li>Fix: Restoring a campaign from the trash brings its schedule back \u2014 a restored campaign still started and ended on time, because a safety check catches that, but its \"ending soon\" email and its scheduled product rotation never ran again. Sending a campaign to the trash cleared them and nothing put them back.<\/li>\n<li>Fix: Analytics history no longer grows without limit \u2014 of the three tables the plugin appends to, only one was ever trimmed. Product-level analytics, by far the largest, and the activity log were kept forever on every store.<\/li>\n<li>Fix: Two scheduled jobs that could not do anything were retired \u2014 one pruned a table that no version of the plugin has ever created; the other wrote to a column nothing reads and repeated a cleanup that had already run minutes earlier. Both ran daily on every site. Sites upgrading will have the leftover jobs cancelled automatically.<\/li>\n<li>Fix: Saving the General settings no longer discards settings that tab does not show \u2014 each settings tab replaced its whole section on save, so any value without a field on that tab was deleted and fell back to its default.<\/li>\n<li>Fix: Category product counts refresh when campaigns change \u2014 the counts shown beside categories in the product picker were cached in a way that campaign updates could not clear, so they could stay up to an hour out of date.<\/li>\n<li>Cleanup: Dead code and dead wiring removed \u2014 an unused repository, a filter nothing ever triggered, cron schedules left over from an earlier scheduling system, and a one-off upgrade step that had no way to finish and so re-ran hourly for good. New automated checks now fail the build if a scheduled job loses its handler, if a hook gains a listener nothing fires, or if a settings field points at a method that does not exist \u2014 the three shapes of silent breakage behind several of the fixes above.<\/li>\n<\/ul>\n\n<p>For the complete changelog of earlier versions, visit <a href=\"https:\/\/webstepper.io\/wordpress\/plugins\/smart-cycle-discounts\/changelog\/\">the full changelog<\/a>.<\/p>","raw_excerpt":"Run BOGO, bulk, tiered, coupon &amp; B2B discount campaigns on a schedule, with sale badges and usage limits. Describe a deal, Cycle AI builds it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/265799","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=265799"}],"author":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webstepper"}],"wp:attachment":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=265799"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=265799"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=265799"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=265799"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=265799"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=265799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}