WooCommerce Tips

How to Exclude Products (and Already-Discounted Items) From a WooCommerce Sale

How to Exclude Products (and Already-Discounted Items) From a WooCommerce Sale


WooCommerce Tips · Smart Cycle Discounts

Some Products Should Stay at Full Price. Here’s How to Make That Stick.

Running a category-wide or storewide discount doesn’t mean every product has to be included. This guide covers how to exclude specific SKUs from a Smart Cycle Discounts campaign, how SCD handles products that already carry a native WooCommerce sale price, and the practical reasoning behind each exclusion type.

Every promotion eventually runs into an exception. You want to put the whole electronics category on sale, except for the two products you just restocked at cost. You’re running a 20% storewide flash sale, but your gift cards shouldn’t be discounted — that’s against your payment processor’s terms. You have a handful of items already on clearance at a lower margin, and a second discount on top would mean selling at a loss.

Exclusions aren’t an edge case. They’re a standard part of running any real promotion on a catalog that contains products with different margin structures, different commitments, and different purposes. This guide explains exactly how Smart Cycle Discounts implements product exclusions, what happens when a product in your campaign scope already carries a native WooCommerce sale price, and what’s available in the free version versus Pro — all verified from the plugin code.

Why exclusions matter: the business case

A blanket discount applied across a category or the whole store is efficient to set up, but efficiency works against you when every item in scope has a different margin. The products most likely to sell anyway don’t need a discount incentive — they’re already moving. Giving them 20% off costs you margin on sales you were going to make regardless.

The case for protecting specific products from a campaign discount usually falls into a few distinct reasons:

  • Margin protection on thin-margin SKUs. If a product is already priced close to cost, a storewide percentage discount can push the effective margin below zero. This is a real risk for clearance items or loss leaders that are priced exactly as intended.
  • Supplier or MAP restrictions. Some suppliers set minimum advertised price (MAP) requirements. Running those products through a discount campaign would violate the agreement, even if WooCommerce would technically allow it.
  • Gift cards. Most payment processors explicitly prohibit selling discounted gift cards. Running a 20% off storewide campaign without excluding your gift card products is a terms-of-service violation, not a marketing strategy.
  • New arrivals at full launch price. You’ve just launched a product at its intended price point. Including it in a sitewide sale the same week erodes the perceived value before it’s been established.
  • Bestsellers that don’t need help. A campaign discount on a product that sells reliably at full price moves margin from you to the customer without improving conversion. That margin is better protected for products that actually need the incentive to move.
  • Already-discounted items. Products that already have a WooCommerce sale price set manually are in a particular category. Applying a campaign discount on top of an existing discount can compound in ways that aren’t immediately obvious, and the result may not be what you intended.

How product exclusions work in Smart Cycle Discounts

Smart Cycle Discounts applies product exclusions at the query level. When you specify products to exclude from a campaign, their IDs are passed as a post__not_in constraint to the WP_Query that builds the campaign’s product scope. This means excluded products are removed before the result set is built — they’re not evaluated, filtered afterward, or held in reserve. They simply don’t enter the campaign pool at all.

This architecture matters for a practical reason: the discount is never calculated for excluded products, and the runtime price filters never fire for them during an active campaign. An excluded product serves its regular price through WooCommerce’s standard price chain, exactly as if no campaign existed.


Exclusions are per-campaign, not global

Excluding a product from one campaign does not remove it from any other campaign. If you have two campaigns targeting the same category, you need to add the exclusion to each one independently. There is no store-level “always exempt this product” setting in Smart Cycle Discounts — exclusions are scoped to the individual campaign configuration.

The exclusion list accepts specific product IDs. You select the products you want to protect using the same product search interface used elsewhere in the campaign wizard, and those IDs are stored with the campaign configuration. The campaign’s product count preview updates to reflect the exclusions as you add them, so you can see how many products remain in scope before saving.

One thing Campaign Intelligence will catch for you: if your exclusions empty the entire product pool — for example, because you’re excluding the only product in a targeted category — it will flag this as a health warning before you activate. A campaign with an empty product scope runs but discounts nothing, which is usually a sign something’s been misconfigured.

What to exclude and why: common cases

Gift cards

Gift cards should almost always be excluded from percentage-off and fixed-amount campaigns. Selling a $50 gift card for $40 is effectively money-losing — the customer gets $50 of purchasing power for $40. More importantly, discounting gift cards is typically prohibited by WooCommerce’s compatible payment processors and can violate your merchant agreement. If your store sells gift cards, add them to the exclusion list on any campaign that targets your full catalog or a broad category.

Products under supplier MAP agreements

If a supplier requires you to advertise at or above a minimum price, a campaign discount will violate that agreement even if you don’t explicitly advertise the discount separately. The lower price appears on your shop and category pages as soon as the campaign is active. Exclude these products individually, or reconsider whether the campaign scope is appropriate for that category.

Clearance items already priced at minimum margin

Items that have already been reduced to their floor price — end-of-line stock you’re clearing at cost, for example — should not receive additional campaign discounts. A 20% off flash sale applied to a product that’s already at minimum viable price means selling below cost. Unless that’s intentional (some clearance strategies accept short-term losses to free up inventory capital), exclude these explicitly.

New arrivals at launch pricing

Launching a product at a carefully chosen price and then including it in a storewide sale two weeks later undermines the perceived value of the launch. If you want new arrivals to sell at their full intended price before any promotional activity, exclude them individually, or use the product tag approach: tag new arrivals with something like “new-arrival,” exclude that tag from the campaign scope, and remove the tag after the exclusion window has passed. As described in the guide on category-scoped campaigns, combining categories with tag filters gives you a precise scope without building a manual product list.

Bestsellers with reliable full-price demand

This one requires more judgment. Discounting a bestseller in a sitewide sale costs you margin on sales that were going to happen at full price. The counterargument is that discounting bestsellers improves basket size when customers discover adjacent products. Whether the margin cost is worth the basket-size benefit depends on your average order value and product mix. If you’re not sure, run the sale without the bestsellers first and compare conversion rates. You can always widen the scope on the next cycle.

Products already on a WooCommerce sale price

This section covers the most nuanced case: what happens when a product in your campaign scope already has a native WooCommerce sale price set in its product settings.

In WooCommerce, a product can have a regular price and a sale price set directly in its product data. When a sale price is active and lower than the regular price, WooCommerce marks the product as being “on sale” and shows the strikethrough pricing on the storefront. This is a stored database value — it persists across sessions and doesn’t depend on any plugin.

Smart Cycle Discounts operates differently. It applies discounts at display time through WooCommerce’s price filters, and it always calculates its discount from the product’s regular price — not from the existing sale price. So if a product has a regular price of $100 and a WooCommerce sale price of $80, and your SCD campaign applies 10% off, SCD’s discounted price will be $90 (10% off the $100 regular price). Since $90 is higher than the existing $80 sale price, WooCommerce will display the $80 price — the native sale price wins.


SCD discounts from regular price — not the existing sale price

Smart Cycle Discounts always calculates its discount from a product’s stored regular price. It does not stack on top of an existing WooCommerce sale price. If a campaign’s calculated discount produces a price higher than the product’s native sale price, the native sale price remains the displayed price. The campaign discount only takes effect when it results in a price lower than any existing sale price.

This behavior is a direct consequence of the architecture: SCD writes its discounted price as the product’s sale price via WooCommerce’s woocommerce_product_get_sale_price filter, but only if its calculated value is lower than what’s already there. The code comment in the discount query service is explicit: “always from regular price; never stack on WC sale price.

What this means in practice:

  • A product with a large existing sale discount (say, already 40% off) will generally not be further discounted by a campaign offering 10% or 20% off regular price, because the campaign price won’t beat the stored sale price.
  • A product with a small existing sale discount (say, already 5% off) could have the campaign discount take effect if the campaign offers a deeper reduction from regular price than the stored sale provides.
  • In both cases, you’re not stacking discounts in the usual sense — SCD always starts from the same baseline (regular price) and the lower of the two prices is what customers see.

Blocking campaign discounts on natively-on-sale items (Pro)

The behavior above is the default. If you want to go a step further and explicitly prevent SCD from applying any campaign discount to products that already have a WooCommerce sale price active — regardless of which price is lower — Smart Cycle Discounts provides an apply_to_sale_items setting in the campaign’s discount configuration. When set to false, the discount rules enforcer checks each product’s is_on_sale() status at runtime and blocks the campaign discount entirely if the product is currently on sale.

This feature requires the Pro version. Setting apply_to_sale_items to false is validated as a Pro-only configuration in the plugin’s feature gate. In the free version, the default behavior applies: SCD calculates from regular price, and the lower price wins.


Free version fallback for sale-item exclusion

If you’re on the free version and want to keep campaign discounts away from items already on a WooCommerce sale price, the practical approach is to exclude those products by ID in the campaign’s exclusion list. It requires more manual maintenance — you’ll need to update the list as your native sale prices change — but it achieves the same result without needing Pro. Alternatively, the on_sale filter in SCD’s product selection step can narrow the campaign’s pool to exclude products that WooCommerce considers currently on sale, though this is a product-selection filter rather than a runtime enforcement check.

What’s free and what requires Pro

Feature Free Pro
Exclude specific products by ID from a campaign Yes Yes
Filter campaign scope by product category and tag Yes Yes
Campaign Intelligence health warnings (empty scope, etc.) Yes Yes
SCD always discounts from regular price (not stacked on existing sale price) Yes Yes
Block campaign discount on items already on a native WC sale price (apply_to_sale_items = false) No — Pro only Yes
Advanced product filter conditions (meta-based, attribute-based) No — Pro only Yes

Setting up exclusions in the campaign wizard

Start in Step 2: Product Selection

Open the campaign wizard and move to Step 2 (Product Selection). Choose your selection mode — typically “All Products” for a category-scoped campaign. Select the categories or tags that define the base pool you want to discount. The product count preview reflects what’s in scope before exclusions are applied.

Add products to the exclusion list

Below the category and tag pickers, you’ll find the exclusion field. Use the product search to find each product you want to protect and add it to the list. Search works by product name and SKU. The product count preview updates as you add exclusions, so you can confirm the final scope before moving on. Excluded products are stored as a list of product IDs alongside the campaign configuration.

Check Campaign Intelligence for scope warnings

In Step 5 (Review & Launch), Campaign Intelligence runs a health check on the campaign. If your exclusions have reduced the product pool to zero — for example, by excluding the only product in a selected category — it will flag this as a warning. Address any warnings before activating. A campaign with an empty scope will not discount anything.

(Pro) Configure sale-item behaviour in Step 3: Discount Configuration

If you have a Pro license, Step 3 includes the option to exclude items already on a WooCommerce sale price from the campaign. Disabling “Apply to sale items” means the discount rules enforcer will check each product at runtime — if WooCommerce considers it currently on sale (has a stored sale price lower than its regular price), the campaign discount is skipped for that product, regardless of what the campaign’s calculated price would be. This is the cleanest way to prevent any interaction with existing sale pricing.

Practical examples

Storewide 15% off, excluding gift cards and pre-order products

You’re running a seasonal sale across your entire catalog. Your store sells gift cards (three SKUs) and has two products currently available as pre-orders at a fixed launch price. You don’t want either discounted: gift cards for terms-of-service reasons, pre-orders because the price has been publicly communicated to customers who placed orders.

In the campaign wizard: set product selection to “All Products,” leave all categories selected, and add the five product IDs (three gift cards + two pre-orders) to the exclusion list. Everything else in the catalog receives the 15% discount. The excluded five products serve their configured prices exactly as usual.

Category-wide sale, excluding a product with a supplier MAP requirement

Your “Outdoor Power Tools” category is going 20% off for a weekend campaign. One product in that category — a specific chainsaw model — has a MAP agreement with the manufacturer. You can’t advertise it below $299, and the 20% off from its $349 regular price would put it at $279.

Add the chainsaw’s product ID to the exclusion list. The rest of the outdoor power tools category gets the 20% reduction. The chainsaw displays at its regular price. The campaign scope is intentional and the MAP agreement is respected. For more on how category-targeted campaigns resolve their product pool, the SCD product selection documentation covers the full mechanics.

Flash sale on bestsellers, skipping items already marked down

You want to run a 30% off flash sale on your top 20 bestsellers. Five of those products already have a WooCommerce sale price set from a previous manual markdown. You want the flash sale price to apply to the other 15, but you don’t want to touch the five already-marked-down items.

There are two approaches depending on your license tier:

  • Free version: Use “Specific Products” as the selection mode and manually select the 15 products you want included. The five already-marked-down items simply aren’t in the product list, so the campaign never touches them. This requires building the list manually, but it’s reliable and requires no ongoing maintenance for this particular campaign.
  • Pro version: Set the campaign to your full category or top-20 list, and disable “Apply to sale items.” At runtime, SCD will check each product’s is_on_sale() status before applying the discount. The five products with active WooCommerce sale prices will be skipped automatically; the others receive the 30% campaign discount.


Key takeaways

  • Product exclusions work at the query level in SCD. Excluded product IDs are filtered out with post__not_in before the campaign scope is built — excluded products never receive a discount calculation.
  • Exclusions are per-campaign. Protecting a product in one campaign does not protect it in others. Each campaign carries its own exclusion list.
  • SCD always discounts from regular price, not from an existing WooCommerce sale price. There is no double-stacking in the usual sense — the plugin uses get_regular_price() as its baseline, and the lower of the SCD price or the native sale price is what customers see.
  • The “apply to sale items” block is Pro-only. In the free version, SCD still won’t stack on top of a deeper native sale price (because it discounts from regular price), but explicitly blocking any campaign activity on natively-on-sale items requires a Pro license.
  • Gift cards, MAP products, and pre-orders are the most common and highest-stakes exclusion cases. Build the habit of reviewing these before any broad campaign.
  • Campaign Intelligence warns you if exclusions empty the product pool. Pay attention to that warning before activating.

Common questions

Can I exclude an entire subcategory instead of individual products?

Not directly. The exclusion list in Smart Cycle Discounts accepts individual product IDs, not category IDs. If you want to exclude all products in a subcategory, the practical approach is to restructure the campaign scope: instead of targeting the broad parent category and then excluding a subcategory, target only the specific child categories you want included. For a large subcategory with many products, this is usually less work than building a product-ID exclusion list.

If a product is on a WooCommerce sale and my SCD campaign offers a deeper discount, which price do customers see?

The lower price. SCD calculates its discount from the product’s regular price. If the campaign’s calculated price is lower than the product’s stored WooCommerce sale price, SCD’s price takes effect. If the campaign’s calculated price is higher than the existing sale price, the native sale price remains. The customer always sees the lower of the two values.

Does the exclusion list have a size limit?

The exclusion list is technically unbounded, but using it to exclude hundreds of individual products from a category campaign is usually a sign that the campaign scope itself needs rethinking. If you find yourself building a very long exclusion list, consider whether inverting the approach — selecting only the specific products you want included rather than excluding the ones you don’t — would be cleaner. The “Specific Products” selection mode is designed for exactly this.

Will an excluded product show a sale badge from other campaigns?

Only if there is another active campaign that includes it and applies a discount. Excluding a product from one campaign has no effect on other active campaigns. If the product is in scope for a second campaign that’s running simultaneously, that campaign’s discount applies normally.

Do I need Pro just to exclude products from a campaign?

No. Product exclusions by ID are available in the free version of Smart Cycle Discounts. What requires Pro is the “apply to sale items” enforcement setting — the runtime check that prevents campaign discounts from being applied to products that WooCommerce currently considers on sale (via stored sale price). Standard product exclusions by ID are free.

How does excluding a product interact with campaign priority?

Exclusion and priority are separate mechanisms. Campaign priority determines which discount wins when multiple campaigns compete for the same product. Exclusions remove a product from a campaign’s scope entirely — priority doesn’t apply because the product is never evaluated by that campaign. A product excluded from the high-priority campaign but included in a lower-priority campaign will receive the lower-priority campaign’s discount. Priority only matters between campaigns that both include the product. For a full explanation of how SCD handles competing campaigns, the post on how campaign priority works in WooCommerce covers the mechanics in depth.

Precise campaign scope, without the manual product-by-product work

Smart Cycle Discounts lets you run category-wide or storewide campaigns with an exclusion list that keeps specific products at full price — gift cards, MAP-restricted items, new arrivals, whatever you need to protect. Product exclusions, category targeting, and campaign scheduling are all included in the free version. The Pro version adds runtime sale-item enforcement and advanced product filter conditions.

See Smart Cycle Discounts