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 (Pro).
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 explains the model; if your totals changed after updating to v1.9.0, see What changed in v1.9.0.
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 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
You can change the price of any individual line item directly in the cart:
- Click the Price field on the line item
- Enter the new price
- 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 for more on editing cart 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 to break a line item into separate lines.
Order-Level Discounts
To apply a flat discount to the entire order (rather than individual items), add a negative fee:
- Click Add Fee below the cart items
- Enter a name (e.g., "Staff discount")
- 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
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) | 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 |
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.
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
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_salefilter. - Removing a coupon leaves the line at its POS-discounted price.
For technical details on how POS price overrides are stored and the available filters, see the POS Discount Reference.
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 above.
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 = 0when 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
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:
- click Use Template on a fresh copy of the bundled template; or
- update your existing template with the fields in the Receipt Data Reference.
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 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 when savings must also be tracked as WooCommerce discounts in reports.
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.