In Umbraco Commerce, multiple discounts can be applied to the same order line.
Example scenario:
A product-specific discount (e.g., 50% on one product)
A category-wide discount (e.g., 25% on all products)
Additional account-level discounts (e.g., 10–30% depending on user group)
Currently, if several discounts apply to the same product, they stack, even when this is not desirable.
This results in a final price that is lower than intended.
I need a way to ensure:
A product only receives the highest applicable discount
Lower discounts should not apply if a higher discount is already applied to that order line
Other products in the cart should still receive their respective discounts
You need to order your discounts in the back office in order of preference. Then on each discount you need to toggle the option to block further discounts. This ensures only the most specific discount applies and no others.
Priority 1:
I have five specific products that each have a 50% discount.
Priority 2:
I also have a discount that gives 25% off every product (using a folder that contains all products).
The issue:
If I enable “Block further discounts from being applied” on the 50% discount, then the 25% discount is not applied to other products that only qualify for the 25% discount.
In other words, blocking the additional discounts on the 50% products also prevents the 25% discount from being applied to unrelated products in the cart.
I want the 50% discount to block further discounts only for those specific products, but still allow the 25% discount to apply to the rest of the cart.
What happens if you flip it and don’t use the “block further discounts” and instead on the 15% toggle the “block if previous discounts apply” toggle instead?
Same scenario here — only one of the discounts will apply.
I think the core issue is that my first rule targets specific order lines, while the second rule targets an entire category.
Would it maybe be an idea for the future to have an “Exclude” rule?
I do the calculations AFTER the discounts has been applied. I made a PriceAdjuster instead.
So if i have
50% Discount
25% Discount
10% Discount
My adjuster does this:
Finds order lines with multiple discounts
Calculates each discount’s percentage
Keeps only the highest discount
Adds counter-adjustments to cancel lower ones
So essentially it just cancels out the lower ones.