WooCommerce Tips

Target WooCommerce Discounts by Rules, Not by Hand

Target WooCommerce Discounts by Rules, Not by Hand


WooCommerce Tips · Smart Cycle Discounts

Your Catalog Changes. Your Campaign Scope Should Too.

Rule-based product targeting lets a discount campaign define its own scope using conditions — price, stock status, rating, SKU pattern, and more — so the right products are always included, even as your catalog evolves.

There’s a small but telling moment that happens to most store owners a few months into running WooCommerce discount campaigns. You built a “clearance” campaign by hand-picking 30 products. Then you added five new clearance items last week. Then you forgot to update the campaign. Now those five products are sitting unsold because they were never added to the scope.

Or the reverse: you built a campaign targeting your highest-rated products and the list was accurate when you created it. Then three products with one-star reviews stayed in scope because the rating had dropped since you last updated the list manually.

This is the core problem with static product lists in discount campaigns: the catalog keeps moving, and the campaign scope doesn’t move with it. Rule-based product targeting — available in the Pro version of Smart Cycle Discounts — solves this by letting you define what products belong in a campaign using conditions rather than a fixed list of IDs.

Why rule-based targeting beats hand-picking products

When you hand-pick products for a campaign, you’re taking a snapshot. The snapshot is accurate for that moment, and then the catalog drifts away from it. Products go out of stock. You add new arrivals. Prices change. The campaign keeps its original list regardless.

Rule-based targeting works the other way. Instead of “these 30 specific product IDs,” you define criteria like “all products with a stock quantity below 20 and a regular price above $50.” When the campaign runs, it evaluates those conditions against your current catalog and builds its scope dynamically. A product that drops into that low-stock threshold gets included automatically. A product that you’ve restocked past that threshold falls out of scope automatically. No manual update needed.

For certain campaign types, this difference is enormous:

  • Clearance campaigns: Instead of curating a list, target products where stock quantity is between 1 and 10 (or below a custom low-stock amount you’ve set). New slow-movers get captured automatically.
  • New arrivals flash sale: Target products with a creation date within the last 30 days. Every new product you add during the campaign window is automatically included without touching the campaign configuration.
  • Quality-signal discounts: Target products with a review count above a threshold (suggesting social proof) or an average rating above a floor. High-performing products get the campaign’s visibility boost without manual curation.
  • SKU-pattern promotions: Your warehouse uses SKU prefixes to identify product lines. Target everything where the SKU starts with “OUT-” to put a whole line on sale without building a product list or restructuring categories.

There is one real tradeoff. A static list is predictable: you know exactly which products are in scope before the campaign runs. With rule-based targeting, the scope is resolved at runtime against the current catalog state. For most stores, that’s a feature. For promotions where the exact product list matters — a contractual commitment to run a specific sale, for example — you should preview the condition-matched set before activating and consider whether a static list is more appropriate for that specific campaign.

How conditions work in Smart Cycle Discounts

In the campaign wizard’s Product Selection step, the advanced filter interface lets you add one or more conditions. Each condition has three parts: a field (what property to evaluate), an operator (how to compare it), and a value (what to compare against). Some operators accept a second value — “between $20 and $80” takes both bounds, for example.

Conditions can also be set to either include or exclude mode. Include means the product must match this condition to be part of the campaign. Exclude means the product must not match this condition. Both modes are available on every condition type.

When the campaign runs, it evaluates each condition against every product in the base pool (filtered first by your selected categories and tags, if any), and returns only the products that satisfy the full condition set according to the logic you’ve chosen (AND or OR).


Pro-only feature

Advanced product filter conditions are gated to the Pro version of Smart Cycle Discounts. In the free version, product selection uses categories, tags, specific product IDs, and the all/random/specific selection modes. Conditions require Pro.

Every condition type, explained

The following conditions are available in the campaign wizard’s advanced filter interface. All were verified directly from the plugin’s condition contract class (WSSCD_Conditions_Contract).

Price & Inventory

Field Type What it evaluates
Price Numeric The product’s active price (_price meta field). This is the price WooCommerce uses for display — the sale price when one is active, otherwise the regular price.
Sale Price Numeric The product’s stored WooCommerce sale price (_sale_price). Useful for targeting products that have an existing manual markdown.
Stock Quantity Numeric (integer) The number of units in stock (_stock). Products with stock management disabled will return a null/zero value for this field.
Stock Status Select WooCommerce stock status: instock, outofstock, or onbackorder. Particularly useful for excluding out-of-stock products from a campaign.
Low Stock Amount Numeric (integer) The per-product low stock threshold (_low_stock_amount) set in WooCommerce product settings. This is the threshold value itself, not whether the product is currently below it.

Product Attributes

Field Type What it evaluates
Weight Numeric Product weight in your store’s configured weight unit.
Length Numeric Product length in your store’s configured dimension unit.
Width Numeric Product width.
Height Numeric Product height.
SKU Text The product’s SKU string. Supports contains, starts with, ends with, and exact-match operators — making SKU-prefix targeting possible without restructuring your catalog.

Product Status

Field Type What it evaluates
Featured Product Boolean Whether the product is marked as Featured in WooCommerce.
On Sale Boolean Whether WooCommerce considers the product currently on sale — i.e., it has a stored sale price that is lower than its regular price. This reflects the native WooCommerce is_on_sale() result.
Virtual Product Boolean Whether the product is marked as virtual (no shipping).
Downloadable Boolean Whether the product is downloadable.
Product Type Select WooCommerce product type: simple, variable, grouped, external, subscription, or variable-subscription. The subscription types appear only when WooCommerce Subscriptions is active.

Shipping & Tax

Field Type What it evaluates
Tax Status Select The product’s tax status: taxable, shipping, or none.
Tax Class Text The product’s tax class string. Useful when your store has multiple tax rates and you want to target products in a specific tax treatment.
Shipping Class Text The product’s assigned WooCommerce shipping class slug. Useful for targeting products with specific shipping requirements (e.g., heavy items, fragile goods).

Reviews & Ratings

Field Type What it evaluates
Average Rating Numeric The product’s WooCommerce average review rating (0–5 scale). The value is the floating-point average calculated by WooCommerce from approved reviews.
Review Count Numeric (integer) The total number of approved reviews. Useful for finding products with meaningful social proof, or conversely, products with few reviews that might benefit from a visibility-driving promotion.

Sales Data

Field Type What it evaluates
Total Sales Numeric (integer) WooCommerce’s running total sales count (total_sales post meta). This is the cumulative units sold, not revenue.
Date Created Date The date the product was published in WordPress (post_date). Compared at day precision — hours are not considered. Enables targeting new arrivals without a dedicated tag or category.
Date Modified Date The last modified date of the product post (post_modified). Less commonly used for campaign targeting, but useful for some catalog maintenance workflows.

Operators: comparing values

The available operators depend on the type of field being evaluated. All operators are verified from the plugin’s operator definitions.

For numeric fields (Price, Stock Quantity, Weight, Average Rating, Total Sales, etc.)

  • Equals / Not equals
  • Greater than / Greater than or equal
  • Less than / Less than or equal
  • Between (two values) / Not between (two values)

For text fields (SKU, Tax Class, Shipping Class)

  • Equals / Not equals (exact match, case-insensitive)
  • Contains / Does not contain (substring match)
  • Starts with / Ends with

For boolean fields (Featured, On Sale, Virtual, Downloadable)

  • Is (equals true or false)
  • Is not (not equals)

For select fields (Stock Status, Product Type, Tax Status)

  • Is (equals one specific value)
  • Is not (not equals)

For date fields (Date Created, Date Modified)

  • On (equals specific date)
  • Not on
  • After / On or after
  • Before / On or before
  • Between dates / Not between dates


Float comparison tolerance

Numeric equality checks use a 0.01 tolerance to handle floating-point price values correctly. If you set “Price equals 29.99,” a product priced at 29.994 will match. This is intentional: it prevents spurious mismatches from floating-point storage.

AND vs OR: combining conditions

When you add more than one condition, you need to decide how they’re combined. Smart Cycle Discounts provides two modes, set as a single toggle for the entire condition set:

  • ALL (AND logic): A product must match every condition to be included. This narrows the scope — the more conditions you add, the fewer products qualify.
  • ANY (OR logic): A product needs to match at least one condition to be included. This broadens the scope — each additional condition is another path into the campaign.

The choice between AND and OR isn’t just technical — it shapes the intent of the campaign. AND logic is for precise intersection: “in stock AND priced below $50 AND not already on sale.” OR logic is for union: “either a featured product OR has more than 50 reviews.”


AND and OR apply to the entire condition set

The AND/OR toggle is a single setting that applies uniformly to all conditions in a campaign. You can’t mix AND and OR logic within the same condition set — you can’t express “(A AND B) OR C” directly. If you need compound logic like that, consider splitting into two campaigns and using the priority system to control which one applies when both match.

Include and exclude mode per condition

Each individual condition has its own mode: include or exclude. These are distinct from the AND/OR logic above and work at the condition level, not the set level.

An include condition narrows the pool to products that match. An exclude condition removes products that match from the pool. This lets you express things like “all products priced between $20 and $100, except those with an average rating below 3.” The first condition is include (price between 20 and 100), the second is exclude (average rating less than 3).

Because exclude conditions can expand the matching set (by removing products from exclusion), the engine handles the AND/OR logic carefully: OR logic with any exclude-mode condition disables the database-level pre-query filtering and falls back to in-memory product-by-product evaluation. This is correct behavior, not a limitation — it prevents a product that would be excluded from being included by an OR branch that runs at the database level.

Real examples

All in-stock products priced between $25 and $150

You want to run a seasonal sale on a mid-range price band. You don’t want to discount products at the very bottom of your catalog (thin margin) or at the top (premium positioning), and you don’t want to run the sale on out-of-stock items.

Three conditions, AND logic:

  1. Stock Status — Is — instock (include)
  2. Price — Greater than or equal — 25 (include)
  3. Price — Less than or equal — 150 (include)

The campaign evaluates your full catalog at runtime, picks only products that are in stock with a price between $25 and $150, and discounts exactly that set. As inventory goes out of stock, those products drop out. If you restock, they come back in. The campaign scope reflects your live catalog.

Featured products OR products with 4+ stars

You want to run a “best of store” promotion that highlights your highest-quality items. Rather than curate a list, you define quality as either having the Featured flag or an average rating above 4.0.

Two conditions, OR logic:

  1. Featured Product — Is — true (include)
  2. Average Rating — Greater than — 4.0 (include)

Any product that meets either criterion enters the campaign. Your editorial “featured” selections and your customer-rated standouts both qualify, without overlap problems — a product that is both featured and highly rated simply matches both branches of the OR and is still included once.

SKU-prefix targeting: the “OUT” line on clearance

Your warehouse uses a SKU prefix convention: all outdoor products start with “OUT-”. You want to put that product line on clearance. You don’t have a dedicated WooCommerce category for it — it’s mixed into broader categories.

One condition:

  1. SKU — Starts with — OUT- (include)

Every product in your catalog with a SKU beginning with “OUT-” is in scope. When you add new outdoor products with the same naming convention, they’re automatically included in the next campaign run. No category restructuring, no manual list updates.

Clearance: low stock, exclude bestsellers

You want to put slow-moving inventory on clearance. Your stock quantity threshold is 15 units or fewer. But you also want to protect a handful of products that are high-performing even at low stock — specifically, anything with more than 500 total sales. Those are products that are selling well and just haven’t been restocked yet; they don’t need a discount incentive.

Two conditions, AND logic:

  1. Stock Quantity — Less than or equal — 15 (include)
  2. Total Sales — Greater than — 500 (exclude)

The result: low-stock products that aren’t strong performers. The campaign finds its own candidates every time it evaluates, which means new slow-movers drop in and restocked items drop out automatically.

New arrivals promotion: products created in the last 30 days

You want to run a “new arrival” flash sale. Rather than tagging every new product manually, you use the date condition.

One condition:

  1. Date Created — On or after — [date 30 days ago] (include)

Every product published within the last 30 days is in scope. The limitation here is that the date value is set when you save the campaign, not dynamically updated each day — so if you want a rolling 30-day window, you’d need to update the date value periodically, or run a campaign with a short duration window that captures the current batch of new products. For a one-off launch campaign scoped to products published “since our last big catalogue update,” a fixed date works perfectly.

Pairing conditions with category targeting

Conditions don’t replace category targeting — they refine it. The campaign wizard’s product selection step lets you specify both:

  • A base pool defined by category and tag filters
  • Conditions that further narrow (or exclude from) that pool

Conditions are applied after the category and tag filters resolve the initial product set. This means you can express things like “everything in the Electronics category with a price between $100 and $500 and a rating of 3.5 or higher.” The category filter gives you the Electronics pool first; the conditions trim it down to the specific quality and price band you want.

For more on how category-scoped campaigns resolve their product pools, the guide on putting an entire product category on sale covers the base mechanics. And if you need to protect certain products from a campaign entirely — regardless of conditions — the post on excluding products from a WooCommerce discount explains the exclusion list and how it interacts with your campaign scope.

Free vs Pro

Capability Free Pro
Target all products in selected categories and tags Yes Yes
Hand-pick specific products by name/ID Yes Yes
Random product rotation (deal-of-the-day style) Yes Yes
Exclude specific product IDs from campaign scope Yes Yes
Advanced product filter conditions (price, stock, rating, SKU, date, type, etc.) No — Pro only Yes
AND / OR condition logic No — Pro only Yes
Per-condition include / exclude mode No — Pro only Yes

To be precise about the free version: the condition engine itself exists in the codebase, but the feature gate blocks conditions from being saved or applied at runtime for free users. If conditions are submitted on the free plan, the save handler clears them before writing to the database, and the runtime product resolver skips condition application.

The practical implication is that category targeting, tag filtering, specific product selection, and the product exclusion list give the free version meaningful precision — those four tools together cover the majority of common campaign scoping needs. Conditions become valuable for the cases where static targeting runs out: rolling criteria, SKU-pattern matching, multi-property intersections, and self-updating campaign scopes.


Key takeaways

  • Rule-based targeting keeps campaign scope current. Instead of a fixed product list that drifts, conditions are evaluated against the live catalog every time the campaign runs. Products that enter or leave the criteria are automatically included or excluded.
  • 20+ condition fields across six groups are available in the Pro version — price, stock quantity, stock status, rating, review count, total sales, SKU, product type, creation date, dimensions, tax class, shipping class, featured status, and more. All verified from the plugin code.
  • Operators are type-aware. Numeric fields get range operators (between, less than, etc.). Text fields get substring operators (contains, starts with, ends with). Boolean fields get is/is not. Date fields get calendar-precision comparisons.
  • AND logic narrows; OR logic broadens. The AND/OR setting applies to the entire condition set. You cannot mix logic within the same condition set.
  • Per-condition include/exclude mode lets you write conditions like “match these products but not these.” Include adds to scope; exclude removes from scope.
  • Conditions layer on top of category and tag filters. The category and tag selections build the initial product pool; conditions further refine it.
  • Advanced product filter conditions are Pro-only. The free version supports category, tag, specific product, and exclusion-by-ID targeting.

Campaign scope that keeps up with your catalog

Smart Cycle Discounts lets you define discount campaigns by rules — price ranges, stock levels, ratings, SKU patterns, product types, and more — so the scope stays accurate as your catalog changes. Category targeting, exclusion lists, and scheduling are available free. Condition-based filtering is included in Pro.

See Smart Cycle Discounts