# Cart Discounts

WCPOS provides several ways for a cashier to discount an order on the fly: quick percentage buttons, direct line-item price edits, and order-level discount fees. For pre-configured promotions with usage rules, see [Coupons](/coupons/.md) (Pro).

Looking for the Discount total?

A price lowered at the till is recorded as the item's sale price, not as a WooCommerce discount — the native **Discount** total is reserved for coupons. [Why price changes and coupons are tracked differently](#why-tracked-differently) explains the model; if your totals changed after updating to v1.9.0, see [What changed in v1.9.0](#what-changed-in-v190).

## Quick Discounts[​](#quick-discounts "Direct link to Quick Discounts")

Quick discount buttons let you apply a percentage discount to the entire order with a single tap.

To configure them, open the cart [Display Settings](/pos/cart/.md#display-settings) and enter a comma-separated list of percentages in the **Quick Discounts** field. For example, `5,10,15,20` creates four shortcut buttons.

When you tap a quick discount button, the percentage is applied across all line items in the cart.

## Line-Item Discounts[​](#line-item-discounts "Direct link to Line-Item Discounts")

You can change the price of any individual line item directly in the cart:

1. Click the **Price** field on the line item
2. Enter the new price
3. Press **Enter** to confirm

This is useful for price matching, staff discounts, or one-off adjustments. The line item's total updates automatically based on quantity × new price.

See [Line Items](/pos/cart/line-items.md) for more on editing cart items.

Splitting Items

If a customer wants different discounts on portions of the same product (e.g., 3 at full price and 2 discounted), enable the **Split** option in cart [Display Settings](/pos/cart/.md#display-settings) to break a line item into separate lines.

## Order-Level Discounts[​](#order-level-discounts "Direct link to Order-Level Discounts")

To apply a flat discount to the entire order (rather than individual items), add a **negative fee**:

1. Click **Add Fee** below the cart items
2. Enter a name (e.g., "Staff discount")
3. Enter the discount amount as a negative number (e.g., `-5.00`)

The fee appears as a separate line item and reduces the order total. You can edit the fee's tax status using the three-dot menu if needed.

## POS Discounts vs WooCommerce Coupons[​](#pos-discounts-vs-woocommerce-coupons "Direct link to POS Discounts vs WooCommerce Coupons")

The discounts on this page are ad-hoc adjustments cashiers apply at the till; WooCommerce **coupons** are pre-configured promotions with rules and tracking. Here's how they compare at a glance:

|                      | POS Discounts                                                                       | WooCommerce Coupons (Pro)                                                       |
| -------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| **How applied**      | Quick discount, line price edit, or negative fee                                    | Enter a coupon code in the cart                                                 |
| **Where configured** | On the fly by the cashier                                                           | Pre-configured in **WP Admin → Marketing → Coupons**                            |
| **Tracking**         | Recorded as the line price, like a sale price (see [why](#why-tracked-differently)) | Tracked as a coupon discount in WooCommerce reports                             |
| **Restrictions**     | None — the cashier sets any price                                                   | Usage limits, product/category restrictions, minimum spend, expiry, email rules |
| **Best for**         | Ad-hoc adjustments, price matching                                                  | Structured promotions, trackable discounts                                      |

Which should I use?

For one-off price adjustments, the discounts on this page are simpler. If you need to track discount usage in WooCommerce reports or enforce rules like usage limits, use [Coupons](/coupons/.md).

## Why price changes and coupons are tracked differently[​](#why-tracked-differently "Direct link to Why price changes and coupons are tracked differently")

WooCommerce has exactly one built-in concept of a discount: the **coupon**. A coupon belongs to the order — it's recorded in its own field, counted in the **Discount** column of reports, and carries its own rules such as usage limits and expiry dates.

A **sale price** is not a discount to WooCommerce. It's simply the product's price right now: when an on-sale item is sold, the order records the price paid and nothing else. The regular price never appears on the order, and reports count the sale as ordinary revenue — WooCommerce itself keeps no record that the customer saved anything.

Quick discounts and line-item price edits follow the sale-price model: the item is sold "on sale" at the price the cashier sets. That one rule explains the rest of this page — the WooCommerce **Discount** total stays at zero, coupons calculate against the lowered price, and "exclude sale items" coupons skip till-lowered items. (An order-level negative fee is different again: it's recorded as a fee line, not a price change.)

Receipts are the one place customers expect to see what they saved, so WCPOS records the regular price alongside the new price on each line. That lets a receipt show sale savings and coupon discounts as separate figures without counting either twice — and without changing WooCommerce's order totals or reports.

## How POS Price Changes Interact with Coupons[​](#how-pos-price-changes-interact-with-coupons "Direct link to How POS Price Changes Interact with Coupons")

When a cashier sets a custom price on a line item (e.g., reducing $18 to $16), and a coupon is then applied, the coupon calculates against the **POS-discounted price** ($16), not the original ($18). This prevents customers being over-discounted by stacking a cashier discount and a coupon against the original price.

* POS-discounted items are treated as "on sale" by WooCommerce. If a coupon has **Exclude sale items** enabled, it will skip POS-discounted items — the same way it skips regular sale items. Developers can override this with the `woocommerce_pos_item_is_on_sale` filter.
* Removing a coupon leaves the line at its POS-discounted price.

Developer Reference

For technical details on how POS price overrides are stored and the available filters, see the [POS Discount Reference](/reference/pos-discounts.md).

## What changed in v1.9.0[​](#what-changed-in-v190 "Direct link to What changed in v1.9.0")

If you upgraded from v1.8 and the **Discount** total on receipts and reports now shows **0**, this is why: earlier versions recorded a till price change as a WooCommerce discount, which broke coupon math — a coupon applied on top calculated against the original price, over-discounting the order and undercharging the customer. From v1.9.0, the price set at the till **is** the line price, exactly as WooCommerce records a product on sale, and only coupons count as discounts. See [Why price changes and coupons are tracked differently](#why-tracked-differently) above.

### What this means for you[​](#what-this-means-for-you "Direct link to What this means for you")

* **Receipts** can show the recorded regular price, regular-to-selling-price savings, and a combined **Total saved** value for those savings plus coupons. Price savings remain separate from the WooCommerce **Discount** field.
* **Reports** show `discount_total = 0` when only POS line-item price changes were used. Only coupon discounts are counted.
* **Coupons** now calculate correctly when stacked on POS-discounted items.
* **The recorded regular and selling prices are stored** in POS line-item metadata (`_woocommerce_pos_data`), so the receipt can derive the saving without changing WooCommerce's discount totals.

### Showing the original price and savings on receipts[​](#showing-the-original-price-and-saving-on-receipts "Direct link to Showing the original price and savings on receipts")

The current bundled price-bearing templates show the recorded regular price and saving when a product is on sale or its price is changed at the till. They also show **Total saved** when WCPOS can calculate a complete order-level figure. This total combines regular-price savings with coupon discounts without counting either one twice.

Templates copied from the gallery are editable snapshots and are not overwritten by WCPOS updates. If you created your receipt before this change, either:

1. click **Use Template** on a fresh copy of the bundled template; or
2. update your existing template with the fields in the [Receipt Data Reference](/receipts/receipt-data.md#displaying-regular-price-and-savings).

The main receipt fields are:

| Field                                | Meaning                                                                            |
| ------------------------------------ | ---------------------------------------------------------------------------------- |
| `lines[].regular_price_display`      | Recorded regular unit price                                                        |
| `lines[].selling_price_display`      | Selling unit price before coupons                                                  |
| `lines[].unit_savings_display`       | Saving per item                                                                    |
| `lines[].line_regular_total_display` | Regular-price total for the line                                                   |
| `lines[].line_savings_display`       | Total saving for the line                                                          |
| `totals.sale_savings_total_display`  | Total regular-to-selling-price savings from catalogue sales and till price changes |
| `totals.discount_total_display`      | WooCommerce discount total; normally coupons on current orders                     |
| `totals.total_saved_display`         | Combined regular-price savings and WooCommerce discounts                           |
| `totals.total_saved_complete`        | Whether the combined total is complete and safe to display                         |

Custom templates should guard the **Total saved** row so it disappears when historical price data is incomplete or nothing was saved — see the [Receipt Data Reference](/receipts/receipt-data.md#totals) for the exact pattern.

WooCommerce reports are unchanged: native discount totals still contain coupons rather than current sale-price or till-price savings. Use `totals.total_saved` for receipts and continue to use [Coupons](/coupons/.md) when savings must also be tracked as WooCommerce discounts in reports.

## Known Limitations[​](#known-limitations "Direct link to Known Limitations")

* **No automatic discount rules** — the POS doesn't support "buy 2, get 1 free" style automatic discounts. Use WooCommerce coupons for structured promotions.
* **Quick discounts are percentage-only** — there's no built-in quick button for fixed-amount discounts. Use a negative fee or edit individual prices instead.
