WooCommerce Tips

Cart-Level vs Per-Item Discounts in WooCommerce: Which Should You Use?

Cart-Level vs Per-Item Discounts in WooCommerce: Which Should You Use?


WooCommerce Tips · Smart Cycle Discounts

Two Ways to Apply a Discount. One Subtle Difference That Changes Everything.

Cart-level or per-item — the choice is easy to overlook and harder to undo after launch. Here’s what each mode actually does, how it appears to your customer, and how to choose the right one before you go live.

When you set up a WooCommerce discount campaign, you usually think about the what: 20% off, $10 off, BOGO. You think about the who: all customers, logged-in users, specific roles. You think about the when: today through Sunday, every Friday.

What most store owners overlook — until something behaves unexpectedly — is the how. Specifically, where the discount lands: on each matching product individually, or as a single deduction against the cart total. That choice changes what the customer sees, how taxes calculate, how refunds work, and which discount types can even use it.

Smart Cycle Discounts surfaces this as an explicit campaign setting called “Apply To,” with two options: Per Item and Cart Total. Most discount plugins don’t give you the choice at all — they pick one and hard-wire it. Understanding the tradeoff is worth a few minutes of your time before you hit launch.

The core difference, without the jargon

Here’s the simplest way to think about it:

  • Per-item mode reduces each qualifying product’s price individually. A customer buying three products on a 20%-off campaign sees three individually reduced line items in their cart. The discount is visible at the product level.
  • Cart-total mode applies the discount as a single deduction against the cart’s subtotal. Individual product prices don’t change. The saving shows up as a separate line in the cart totals.

The total saving might work out to be mathematically identical in a given scenario. But the experience — for the customer and for WooCommerce’s internal calculations — is quite different.


The “Apply To” setting is in the campaign wizard

In Smart Cycle Discounts, the Apply To field is part of the discount configuration step in the campaign wizard. It’s a simple select: “Per Item” or “Cart Total.” The default is Per Item. Both options are available in the free version for the discount types that support them — but note that not all discount types support both (more on this below).

Per-item mode: what it does and what the shopper sees

In per-item mode, the discount is applied to each matching line item independently. A customer adding Product A and Product B to their cart sees both products listed at their reduced prices. If Product A normally sells for $40 and Product B for $60, and both are in a 25%-off campaign, the cart shows $30 and $45 respectively.

What this looks like to the shopper:

  • Each discounted product shows a reduced price at the line-item level in the cart.
  • On shop, category, and product pages, the theme’s “Sale!” badge and strikethrough pricing appear automatically (because SCD works through WooCommerce’s price filters, the sale badge is driven by the filtered price at render time).
  • There is no separate “discount” line in the cart totals — the saving is already baked into the line prices the customer sees.

For the store, per-item mode is the more transparent of the two. Every product’s contribution to the discount is visible without needing to do any arithmetic. It is also the natural fit for most product-level promotions: a flash sale, a category markdown, a percentage-off event.

Per-item mode is the default in Smart Cycle Discounts, and it works with percentage-off and fixed-amount discount types out of the box on the free version.

Cart-total mode: what it does and what the shopper sees

In cart-total mode, the discount is calculated against the cart’s subtotal and applied as a single deduction. Individual product prices remain at their regular values on the cart line items. The saving appears as a separate entry in the cart totals area — similar to how a WooCommerce coupon discount appears.

What this looks like to the shopper:

  • Products are listed in the cart at their regular prices.
  • A discount line in the cart totals shows the saving amount.
  • The order total reflects the net price after the deduction.
  • On shop and product pages, products in the cart-total campaign do not show reduced prices or sale badges — because the per-product price filter is not being modified in this mode.

Cart-total mode is the natural fit for promotions that are inherently order-level rather than product-level: spend thresholds (“get $15 off when you spend over $100”), tiered order-level discounts (“buy 5 items, get $10 off your order”), and similar structures where the discount is a reward for the whole cart rather than a markdown on specific products.


No sale badges in cart-total mode

Products in a cart-total campaign will not display “Sale!” badges or strikethrough prices on the shop, category, or product pages. The per-product price is not being modified — only the cart total is — so WooCommerce has no reduced price to derive a badge from. If pre-sale visual signaling matters to your campaign, per-item mode is the right choice.

Practical implications: taxes, sale badges, refunds

Tax calculation

This is where the two modes diverge most meaningfully for stores that charge tax.

In per-item mode, WooCommerce taxes are calculated on the reduced per-product prices. If an item normally costs $100 with 10% tax, the tax amount is $10. After a 20% discount brings the price to $80, tax is calculated on $80, yielding $8. Taxes decrease proportionally with the discount.

In cart-total mode, the individual product prices remain unchanged for the purpose of line-item tax calculation. WooCommerce may calculate tax on the full product prices before the cart-level deduction is applied, depending on how your tax configuration works and how the discount integrates with WooCommerce’s tax engine. The exact behavior can vary with tax-inclusive vs tax-exclusive pricing setups and your jurisdiction’s rules.

If your store operates in a jurisdiction with strict rules about how discounts interact with taxable amounts, verify your actual cart behavior with a test order before running a cart-total campaign. Tax rules are jurisdiction-specific and change; do not rely on any plugin’s behavior as legal compliance guidance.

Sale badges on shop and product pages

As noted above: per-item mode produces sale badges and strikethrough pricing on shop, category, and product pages because SCD modifies the per-product price through WooCommerce’s price filters at render time. Cart-total mode does not, because individual product prices are not changed.

To understand precisely why the sale badge appears with per-item discounts, read the deeper explanation in how WooCommerce sale prices work internally — the key is that WooCommerce derives its “is on sale” state from the filtered sale price at render time, not from stored database values.

Refund handling

In per-item mode, refunds work against the discounted price the customer paid for each item. A partial refund for one product is calculated on that product’s reduced price. This is typically the most straightforward outcome for both the store and the customer.

In cart-total mode, the cart-level deduction is a separate amount that is not attributed to any specific product. WooCommerce’s refund interface may require you to handle the discount line separately when issuing partial refunds. Depending on your payment gateway and your refund policy, this can add complexity to the refund workflow.

The native “On Sale” shortcode and sale filters

Neither per-item nor cart-total mode causes discounted products to appear in WooCommerce’s native “On Sale” product shortcode or block, or in tools like FacetWP sale filters that read stored sale data from the database. SCD is a runtime discount system — it does not write sale prices to the database on campaign activation. This is a characteristic shared by all coupon-based and rule-based runtime discount plugins, not a limitation specific to SCD or to either apply-to mode.

How Smart Cycle Discounts implements both modes

These details are verified from the plugin code.

The Apply To registry

Smart Cycle Discounts stores each campaign’s apply_to choice as a canonical string: per_item or cart_total. The registry also accepts several aliases — item, product, and line_item normalize to per_item; order_total, cart, and order normalize to cart_total — which matters for Cycle AI drafts and any programmatic campaign creation. The default when no value is specified is per_item.

Per-item implementation

When apply_to is per_item, the discount is applied to each matching product’s price individually through WooCommerce’s woocommerce_before_calculate_totals hook at cart time. For shop and product page display, SCD hooks into woocommerce_product_get_price, woocommerce_product_get_sale_price, and woocommerce_get_price_html to serve the reduced price at render time. No price is written to the database. When the campaign ends, the filters stop firing and the original price is restored automatically.

On the cart page, SCD runs at priority 999 on woocommerce_before_calculate_totals so that add-on or custom option plugins (Acowebs, WooCommerce Product Addons, etc.) can adjust line prices first. SCD then applies the discount to the resulting configured price, ensuring the discount is calculated on what the customer actually owes for that line item, not just the base product price.

Cart-total implementation

When apply_to is cart_total, the discount operates at the cart level rather than at the line-item price level. The discount is calculated against the cart’s subtotal and surfaces as a separate deduction in the cart totals, not as a change to any individual product’s price. Because individual product prices are not modified, per-product price filters are bypassed for the campaign’s qualifying products in this mode.

Cart-total mode is the natural companion to discount types that are inherently cart-scoped. The spend threshold discount type (Pro) reads the cart subtotal to determine which tier applies, then deducts the qualifying amount from the cart total. The tiered pricing type also supports cart-total mode: when apply_to is cart_total, the tiered strategy calculates the total discount against the line subtotal (unit price × quantity), then spreads the per-item equivalent across the quantity, rather than adjusting each unit’s price independently.

Which discount types are compatible with each mode

Not all discount types support both apply-to modes. BOGO and Buy X Get Y are explicitly incompatible with cart-total mode — the code marks them as such because both types require line-item context to calculate the free or discounted item. Using cart-total with BOGO or BX/GY is blocked at the campaign validation level.

Percentage-off and fixed-amount discounts support both modes. Tiered pricing (Pro) supports both modes, with different calculation behavior depending on which is selected. Spend threshold (Pro) works best with cart-total, and the plugin includes a validation advisory when it is configured with per-item — spend thresholds are cart-level qualifiers by nature, and per-item application can produce unexpected results.

Discount type Per Item Cart Total Free or Pro
Percentage off Supported Supported Free
Fixed amount off Supported Supported Free
BOGO Supported Incompatible Free
Buy X Get Y Supported Incompatible Pro
Tiered pricing Per-unit pricing Order-level deduction Pro
Spend threshold Not recommended Natural fit Pro
Bundle Per-product pricing See docs Pro

When to use each: a practical guide

Use per-item when:

  • You want products to show sale badges and strikethrough prices on shop and product pages before the customer adds anything to the cart.
  • Your promotion is product-centric: “20% off everything in the Summer collection,” “$5 off each unit of Product X.”
  • You want refunds to be straightforward — the customer paid a specific per-unit amount and a refund reflects that amount.
  • You are using percentage, fixed, or BOGO discount types.
  • You are using tiered volume pricing and want each unit’s price to reflect the tier (for example, the first two units at full price, units three and beyond at 15% off). This is what most stores mean by “tiered pricing.” If you want to understand the full behavior of this mode, the guide to WooCommerce tiered pricing for different quantities covers it in depth.

Use cart-total when:

  • Your promotion is cart-centric: “Spend $75, get $10 off your order,” “Buy five items and save $15.”
  • You are using a spend threshold discount (Pro) — this type reads the cart subtotal and is designed to work with cart-total application. The spend threshold guide goes deeper on how the cart-total and order-total distinction applies there.
  • You are using tiered pricing in “order discount” mode: the customer buys a qualifying quantity and gets a flat or percentage deduction off the line subtotal, rather than a per-unit price reduction.
  • You want the discount to appear as a named line in cart totals rather than as reduced per-product prices — some promotional structures communicate more clearly this way.
  • Sale badges on the shop page are not important for this particular promotion.

A note on bundle campaigns

Bundle discounts (Pro) work differently from both modes described here — the discount fires only when all required products are present in the cart simultaneously. The apply-to mode affects how the saving is distributed across those items. The bundle campaign setup guide covers the three pricing modes in detail.

Mistakes worth avoiding

Using cart-total and expecting sale badges

This is the most common source of confusion. A store owner sets up a percentage-off campaign in cart-total mode and then wonders why the “Sale!” badge isn’t appearing on product listings. It won’t — cart-total mode does not modify per-product prices, so there is no reduced price for WooCommerce to derive a sale badge from. If badges matter to your campaign, use per-item mode.

Using per-item with spend threshold

Spend thresholds are inherently cart-level qualifiers. The threshold amount is compared against the cart subtotal, and the discount reward is logically an order-level benefit. Configuring a spend threshold with per-item apply-to is technically permitted but the plugin includes a validation advisory because the result is rarely what the store intended. Use cart-total with spend threshold campaigns.

Assuming both modes produce the same tax outcome

For stores in tax-inclusive jurisdictions or with complex tax configurations, per-item and cart-total mode can produce different tax amounts on the same order. Test with a real order before launching if your store is tax-sensitive. Do not rely on either mode as inherently “tax-correct” for your jurisdiction without verification.

Not considering partial refunds before launch

If you sell high-value items and frequently issue partial refunds, think through your refund workflow before choosing cart-total mode. The discount in cart-total mode is not attributed to any specific product, which means a line-item refund on WooCommerce’s refund screen may not automatically account for the proportional discount. Test the refund flow on a sandbox order first.

Key takeaways


What to remember

  • Per-item reduces each qualifying product’s price individually. Sale badges appear. Taxes are calculated on the discounted per-product price. Refunds are straightforward.
  • Cart-total applies a single deduction to the cart subtotal. Product prices are unchanged. No sale badges. The saving appears as a separate line in cart totals — similar to a coupon.
  • The default in Smart Cycle Discounts is per-item. Both options are available in the free version for compatible discount types.
  • BOGO and Buy X Get Y cannot use cart-total mode. Spend threshold should always use cart-total mode. Tiered pricing works with both, but the behavior is different in each.
  • Neither mode causes discounted products to appear in WooCommerce’s native “On Sale” block or in sale filters that read stored database values — this is a property of all runtime discount systems, not specific to either mode.
  • If tax accuracy or partial-refund simplicity is a priority, test your chosen mode with a real order before going live.

Common questions

Can I change the apply-to mode on an active campaign?

Yes — you can edit an existing campaign and save a new apply-to value. The change takes effect immediately on the next cart recalculation. Be aware that switching from per-item to cart-total (or vice versa) mid-campaign will change what customers see in the cart from that point forward, and could produce confusion if any customer noticed the previous behavior.

Does the apply-to setting affect coupon-code campaigns?

Yes. Smart Cycle Discounts supports coupon-code delivery on any discount type, and the apply-to setting applies to coupon-code campaigns the same way it does to auto-apply campaigns. A coupon-code campaign with per-item mode reduces individual product prices when the code is applied. A coupon-code campaign with cart-total mode adds a cart-level deduction, similar in appearance to a standard WooCommerce coupon.

Which mode works better with block cart and block checkout?

Both modes work with WooCommerce block cart and block checkout. Smart Cycle Discounts uses a Store API extension to expose discount data to blocks, and the woocommerce_before_calculate_totals hook that drives cart-time pricing fires in both classic and block cart contexts. If you encounter unexpected behavior, check that your SCD version is current and that no other plugin is interfering with cart recalculation.

Does cart-total mode interact with WooCommerce coupons?

A cart-total campaign discount and a WooCommerce coupon can both be active on the same order. Whether they stack or conflict depends on your campaign’s stacking configuration. The allow_coupons and stack_with_others settings control this and are available in Pro. In the free version, both a campaign discount and a coupon can apply to the same cart by default, subject to your campaign’s priority and stacking rules.

Is the apply-to setting a Pro feature?

No. The Apply To field itself is available in the free version. Both “Per Item” and “Cart Total” options can be selected on any campaign. However, the discount types that work best with cart-total mode — spend thresholds and tiered order discounts — are Pro-only discount types. For free-version discount types (percentage, fixed, BOGO), you can use either apply-to mode.

Smart Cycle Discounts

Campaign-based discount automation for WooCommerce. Percentage off, fixed amount, BOGO, tiered pricing, spend thresholds, and bundle deals — with scheduling, conflict detection, and Campaign Intelligence built in. The free version includes percentage, fixed, and BOGO with scheduling and role targeting. Pro adds spend thresholds, tiered pricing, and bundle discounts.

Webstepper

Webstepper

WooCommerce Plugin Developer

Builders of Smart Cycle Discounts and TrustLens. We write about WooCommerce pricing strategy, discount mechanics, and store security from the inside — based on what we see in the code and what store owners actually run into.