A note from 2026: This article was published in 2017 and focuses on SAP hybris 6.x. The platform is now SAP Commerce Cloud, and many promotion engine, Backoffice, and cloud deployment details have changed across later releases; validate all OOTB behavior against your current SAP Commerce version.

In this article, I review common promotion mechanics and their default implementation in SAP hybris. You may be surprised to learn that some things do not work as expected. I explain the edge cases and typical flaws in the default implementation, and also offer advice on how to build it properly.

This list is not complete; I did not consider trivial promotion types and their combinations.

Quantity and price discounts

Buy 1 Get 1 Free (BOGOF)

There are two ways to implement this mechanic, depending on how you understand the idea of BOGOF: as an offline retailer or as an online retailer. In the offline world, it is too late to add a free product to your shopping cart automatically at checkout. In the online world, it may be expected behavior.

Option #1. The product should be added automatically

To implement this in hybris, there is an action called “Free gift”. So the promotion configuration will be: if there is a qualifying product (ProductA), add a free gift (ProductB).

Example. Buy one apple, add one orange free.

Cart contains Expectations How hybris works OOTB
1 apple ($) 1 apple ($) +
1 orange free
[as expected]
2 apples ($) 2 apples ($) +
2 oranges free
Warning icon
2 apples ($) +
1 orange free
2 apples +
1 orange ($)
2 apples ($) +
2 oranges free
Warning icon
2 apples ($) +
1 orange ($) +
1 orange free
2 apples +
2 oranges ($)
2 apples ($) +
2 oranges free
Warning icon
2 apples ($) +
2 oranges ($) +
1 orange free
2 apples +
3 oranges ($)
2 apples ($) +
1 orange ($) +
2 oranges free
Warning icon
2 apples ($) +
3 oranges ($) +
1 orange free

As you can see from the table, the hybris OOTB BOGOF promotion has the following flaws:

Option #2. The product is placed in the cart manually by the customer

This template is already implemented in hybris. The configuration is as follows: there are two containers, A and B, both with qualifying product conditions for Product A and Product B (supposed to be free), and there is an action that makes Product B free if Product A is in the cart.

Example. Buy one apple, get one orange free.

Cart contains Expectations How hybris works OOTB
1 apple ($) 1 apple ($) +
1 orange free
Warning icon
1 apple ($). Orange is not added automatically
2 apples ($) 2 apples ($) +
2 oranges free
Warning icon
2 apples ($). Oranges are not added automatically
2 apples +
1 orange ($)
2 apples ($) +
2 oranges free
Warning icon
2 apples ($) +
1 orange free. The second orange is not added automatically
2 apples +
2 oranges ($)
2 apples ($) +
2 oranges free
[as expected]
2 apples +
3 oranges ($)
2 apples ($) +
1 orange ($) +
2 oranges free
[as expected]

Thanks to Cristian Caprar for useful additions to this section:

This way, for any amount of P1 in the cart, the same amount of P2 is free (but the user needs to add P2 to the cart, it is not added automatically by the system).

To make the rule work as follows: “put P1 in the cart, P2 gets added automatically in the same quantity as a free gift”, besides custom code, there can be a workaround in case the amount is limited (let’s say up to 5 items):

  • Create the promotion rule as 5 different promotions, one for each quantity of P1 (5xP1 -> 5xP2, etc.), give priorities from 5 down to 1 quantity, and then make them not stackable.

This can quickly become too much configuration if quantities are not limited, of course, but avoids custom code.

You may expect that a parameter called “number of rule executions” in the hybris promotion rule configuration means how many promotions can be applied to the shopping cart. It does not. It is only about rule executions, which means nothing, because one rule execution can seize all products in the cart if they meet the conditions. To limit the number of free products or applied discounts, you need to create a custom action and condition in hybris.

Rule executions unfortunately do not help at all, as the system does not know to also consume from the qualifying product P1 each time the rule is executed. For example, if the rule as you make it says P1 = 1 (not >=) for P2 = 1 free gift, and in the cart there are 2 P1, it would be nice if the system executed it once, consuming one qualifying item P1, then fired again (say rule executions is any number > 1) and saw it could consume one more qualifying P1, then stopped as there are no more qualifying P1 left to consume.

Buy 1 from category X get 1 from category X free

Promotion template: Product perfect partner percentage discount

Example. Buy any fruit, get one milk product free (not a specific product; any product from the Milk Products category, as the customer wants). Apple is a fruit. Yogurt is a milk product.

Cart contains Expectations How hybris works OOTB
1 apple ($) 1 apple ($) +
a message
you can buy any milk
product for free
Only if the potential promotion is configured for this case
1 apple ($) + 1 yogurt ($) 1 apple ($) + 1 yogurt free [as expected]
2 apples ($) + 1 yogurt ($) 2 apples ($) +
1 yogurt free
[as expected]
2 apples ($) + 2 yogurts ($) 2 apples ($) +
2 yogurts free
[as expected]

Example.

Cart contains Expectations How hybris works OOTB
1 cucumber ($) 1 cucumber ($) +
a message
you can buy any milk
product for free
[as expected]
1 apple ($) +
1 cucumber ($)
1 apple ($) +
1 cucumber ($) +
a message:
you can buy two milk
products
for free
[not exactly, but near enough]
1 apple ($) +
1 cucumber ($) +
1 yogurt ($)
1 apple ($) +
1 cucumber ($) +
1 yogurt free +
a message
you can buy one milk
product
for free
[as expected]
1 apple ($) +
1 cucumber ($) +
2 yogurts ($)
1 apple ($) +
1 cucumber ($) +
2 yogurts free
Warning icon
1 apple ($) +
1 cucumber ($) +
1 yogurt free +
1 yogurt ($)
1 apple ($) +
1 cucumber ($) +
3 yogurts ($)
1 apple ($) +
1 cucumber ($) +
1 yogurt ($) +
2 yogurts free
Warning icon
1 apple ($) +
1 cucumber ($) +
1 yogurt free +
2 yogurts ($)

As you can see from the table, the existing products are not replaced with gifts with the same SKUs. It is not a bug, but this peculiarity should not come as a surprise.

Buy 2 from category X get 1 from category Y free

Promotion template: Product perfect partner percentage discount

Example. Buy two fruits, get one milk product free.

Cart contains Expectations How hybris works OOTB
2 apples ($) 2 apples ($) +
a message
you can buy one milk
product
for free
[not exactly, but near enough]
3 apples ($) 3 apples ($) +
a message:
you can buy one milk
product for free
[not exactly, but near enough]
4 apples ($) 4 apples ($) +
a message
* you can buy two milk
products
for free
*
[not exactly, but near enough]
4 apples ($) +
1 yogurt ($)
4 apples ($) +
1 yogurt free +
a message
“you can buy one milk
product for free”
[as expected]
4 apples ($) +
2 yogurts ($)
4 apples ($) +
2 yogurts free
[as expected]
2 apples ($) +
2 peaches ($) +
2 yogurts ($)
2 apples ($) +
2 peaches ($) +
2 yogurts free
[as expected]
2 apples ($) +
2 peaches ($) +
1 yogurt ($) +
2 bottles of milk ($)
2 apples ($) +
2 peaches ($) +
1 yogurt free +
2 bottles of milk free +
1 bottle of milk ($)

Buy 2 of X and 1 of Y and get 1 free Z

Promotion template: Product perfect partner percentage discount

Example. Buy 2 apples and 1 cucumber and get 1 yogurt free.

Cart contains Expectations How hybris works OOTB
1 apple ($) 1 apple ($) +
a message
buy 1 apple and 1
cucumber and get 1 free
milk product
[not exactly, but near enough]
2 apples ($) 2 apples ($) +
a message
buy 1 cucumber and get 1
free milk product
[not exactly, but near enough]
2 apples ($) +
1 cucumber ($)
2 apples ($) +
1 cucumber ($) +
1 yogurt free
[as expected]
2 apples ($) +
1 cucumber ($) +
1 yogurt ($)
2 apples ($) +
1 cucumber ($) +
1 yogurt free
Warning icon
2 apples ($) +
1 cucumber ($) +
1 yogurt free +
1 yogurt ($)
2 apples ($) +
1 cucumber ($) +
2 yogurts ($)
2 apples ($) +
1 cucumber ($) +
1 yogurt ($) +
1 yogurt free
Warning icon
2 apples ($) +
1 cucumber ($) +
1 yogurt free +
2 yogurts ($)
4 apples ($) +
2 cucumbers ($)
4 apples ($) +
2 cucumbers ($) +
2 yogurts free
Warning icon
4 apples ($) +
2 cucumbers ($) +
1 yogurt free
4 apples ($) +
2 cucumbers ($) +
2 yogurts ($)
4 apples ($) +
2 cucumbers ($) +
1 yogurt free +
1 yogurt ($)
Warning icon
4 apples ($) +
2 cucumbers ($) +
2 yogurts ($)
1 yogurt free

In hybris, this type of promotion is implemented as:

However, as my experience shows, this configuration does not work well in hybris; it is buggy and unpredictable.

Buy 3 Items from Category X for Y$

Example. Buy 3 different/same shirts for $100.

Cart contains Expectations How hybris works OOTB
1 shirt ($) 1 shirt ($) +
a message
add 2 shirts to buy
all three for $100
[not exactly, but near enough]
1 Shirt A ($) +
1 Shirt B ($)
2 shirts ($) +
a message
add 1 shirt to buy
all three for $100
Warning icon


No OOTB support
2 Shirts A ($) 2 shirts ($) +
a message
add 1 shirt to buy
all three for $100
Warning icon


No OOTB support
1 Shirt A ($) +
2 Shirt B ($)
If the total price < $100,
each shirt gets a calculated
discount to make $100 in
total
Warning icon


No OOTB support
3 shirts A ($) If the total price < $100,
the price of the cart item “3
shirts A” is now $100
Warning icon


No OOTB support
4 shirts A ($) If the total price of 3 shirts
A < $100, the price of the
cart item “4 shirts” is now
$100 + retail price of one
shirt A.
+ message “add 2 shirts to
buy all three for $100″
Warning icon


No OOTB support
2 shirts A ($) +
2 shirts B ($)
Price of Shirt A is $35
Price of Shirt B is $45
There are two options for
how to combine shirts in
the group of 3 shirts:
1. Group(A+A+B) and B
2. Group(A+B+B) and A
First, the groups below
$100 are not in play.
Among the remaining
groups, the cheapest option
wins.
1. $35+$35+$45=$115 <- this
2. $35+$45+$45=$125
For the first option, the total
price is $145 ($100+$45).
Shopping cart after the
promotions are applied:
2 shirts of A – $70
2 shirts of B – $75 (-16%)
Warning icon


No OOTB support

The main challenge with this promotion type is grouping items and implementing a strategy for which group is best for the seller/customer. The simplest approach is to pick the first group, but it may create customer dissatisfaction. The cheapest group is a more comprehensive strategy, but it is also the most complex one in terms of implementation.

“3 same-SKU shirts => fixed price”

SAP hybris does not support it OOTB. The expected behavior for the rule “any three t-shirts cost $30”:

Cart contains Expectations How hybris works OOTB
3 shirts ($15×3=$45) 3 shirts ($30) $30
4 shirts ($15×4=$60) 3 shirts ($30) +
1 shirt ($15) +
a message
(“add 2 more shirts…)
Warning icon


No OOTB support
5 shirts ($15×5=$75) 3 shirts ($30) +
2 shirts ($15×2=$30) +
a message
(“add 2 more shirts…)
Warning icon


No OOTB support
6 shirts ($15×6=$90) 6 shirts ($30×2=$60)
Warning icon

No OOTB support
7 shirts ($15×7=$105) 6 shirts ($60) +
1 shirt ($15)
Warning icon


No OOTB support

“3 different shirts => fixed price”

Warning icon
SAP hybris does not support it OOTB.

There is an OOTB promotion “Bundle product fixed price” that looks like one for this promotion type. However, it does not work as expected.

The formula of OOTB Bundle product fixed price is:

It works if conditions are on categories, but it does not work if conditions are about the same category. In our example, “Shirts” is a category that needs to be used in all three conditions (Qualified categories = “Shirts”). Hybris cannot work with such a configuration: your rule will work incorrectly with this setup.

Buy 2 get 3rd free (Buy 3 for the price of 2)

Example. Buy 3 apples for the price of 2.

Cart contains Expectations How hybris works OOTB
1 apple ($) 1 apple ($) +
a message
buy it free if you add 2
more apples
Only if the potential promotion is configured for this case
2 apples ($) 2 apples ($) +
1 apple free
[as expected]
3 apples ($) 2 apples ($) +
1 apple free
Warning icon
3 apples ($) +
1 apple free
4 apples ($) 3 apples ($) +
1 apple free
4
Warning icon
apples ($) +
1 apple free
5 apples ($) 4 apples ($) +
2 apples free
5
Warning icon
apples ($) +
1 apple free
6 apples ($) 4 apples ($) +
2 apples free
6
Warning icon
apples ($) +
1 apple free

The way hybris works is straightforward and clear, but a bit unfair from the customer’s perspective. If you receive one apple free for any two purchased apples, in a hybris e-shop, as a customer, you can split an order of 6 apples into 3 separate orders and receive 3 free apples instead of one free apple for the whole order, as hybris works OOTB. The table above shows this case, but implementing it the right way is challenging.

Buy any from Category X and any from Category Y and get the cheapest free

Example. Buy 1 fruit and 1 vegetable and get the cheapest free.

Cart contains Expectations How hybris works OOTB
1 apple ($5) +
1 cucumber ($2)
1 apple ($5) +
1 cucumber free
Warning icon
hybris OOTB cannot find the cheapest from the pair.
1 apple ($5) +
1 cucumber ($7) +
1 cucumber ($3)
1 apple ($5) +
1 cucumber ($7) +
1 cucumber free
— ” —
1 apple ($2) +
1 cucumber ($7) +
1 cucumber ($3)
1 apple free +
1 cucumber ($7) +
1 cucumber ($3)
— ” —
1 apple ($2) +
1 apple ($5) +
1 cucumber ($7) +
1 cucumber ($3)
There are two combinations:
* (A$2 + C$7) & (A$5+C$3)
* (A$5 + C$7) & (A$2+C$3)
for the first, $7+$5=$12
for the second, $5+$5=$10
depending on the strategy,
first or second wins
— ” —

The last example shows that there is more than one way to group products in the cart. The simplest approach is to group products without analyzing which grouping is better for the seller or customer. Just pick the first one. However, your customers may think differently. The good news is that it is a rare situation. The alternative approach, comparing groups and finding the most efficient one for the seller or customer, may be too expensive and complex, so my recommendation is to go with the simplest approach, analyze sales, and watch for customer complaints about this point.

There is a selection strategy in the promotion configuration with two options, DEFAULT and CHEAPEST. Do not be confused: CHEAPEST does not mean X or Y needs to be selected for a 100% discount. It works if more than one product is found in Y. If your cart has more than one product from Category Y, the cheapest one will be selected.

Buy 1 Get the 2nd Half Off (Buy 2 get 1 half price)

Example. Buy 1 apple ($10), get 50% off the 2nd apple ($5).

Cart contains Expectations How hybris works OOTB
1 apple ($10) 1 apple ($10) +
a message
“get 1 more apple and you will get 50% off”
Warning icon
hybris OOTB cannot
apply a discount for a second product of the same SKU
2 apples ($10+$10) 2 apples ($15) –“–
3 apples ($10+$10+$10) 3 apples ($25) –“–
4 apples ($40) 4 apples ($30) –“–

Buy X and get Y with the Z% discount

Example: Buy an apple and get a cucumber with a 10% discount.

Cart contains Expectations How hybris works OOTB
1 apple ($10) 1 apple ($10) +
a message
“buy a cucumber with 10% discount”
[not exactly, but near enough]
1 apple ($) +
1 cucumber ($10)
1 apple ($) +
1 cucumber ($9)
[as expected]
1 apple ($) +
2 cucumbers ($10×2=$20)
1 apple ($) +
1 cucumber ($9) +
1 cucumber ($10)
[as expected]
2 apples ($) +
2 cucumbers ($10×2=$20)
2 apples ($) +
2 cucumbers ($9×2=$18)
[as expected]

Add X to cart and get Y for the fixed price of $Z

Example: Buy an apple and get a cucumber for $5.

Cart contains Expectations How hybris works OOTB
1 apple ($10) 1 apple ($10) +
a message
“buy a cucumber for $5”
~
1 apple ($) +
1 cucumber ($10)
1 apple ($) +
1 cucumber ($5)
[as expected]
1 apple ($) +
2 cucumbers ($10×2=$20)
1 apple ($) +
1 cucumber ($5) +
1 cucumber ($10)
[as expected]
2 apples ($) +
2 cucumbers ($10×2=$20)
2 apples ($) +
2 cucumbers ($5×2=$10)
[as expected]

Buy X product from Category X and get any product from Category Y for $Z

Example: Buy any fruit and get any vegetable for $5.

Cart contains Expectations How hybris works OOTB
1 apple ($10) 1 apple ($10) +
a message
“buy any vegetable for $5”
[not exactly, but near enough]
1 apple ($) +
1 cucumber ($10)
1 apple ($) +
1 cucumber ($5)
[as expected]
1 apple ($) +
2 cucumbers ($10×2=$20)
1 apple ($) +
1 cucumber ($5) +
1 cucumber ($10)
[as expected]
2 apples ($) +
2 cucumbers ($10×2=$20)
2 apples ($) +
2 cucumbers ($5×2=$10)
[as expected]
1 apple ($) +
1 peach ($) +
2 cucumbers ($10×2=$20)
1 apple ($) +
1 peach ($) +
2 cucumbers ($5×2=$10)
[as expected]
1 apple ($) +
1 cucumber ($12) +
2 carrots ($10) +
1 cabbage ($12)
In this example, the cheapest product should be taken to the promotion group (a carrot).
1 apple ($) +
1 cucumber ($12) +
1 carrot ($5) +
1 carrot ($10) +
1 cabbage ($12)
[as expected]

Buy different Xs, get Y% off for a 2nd and Z% for a 3rd

Example (from Svayznoy.ru, where I used to work). If you buy two different accessories from the list, you will get 10% off for the second. If you buy three items, the second will cost 10% off and the third will cost 25% off.

hybris OOTB cannot be configured for this type of promotion.

Cart contains Expectations How hybris works OOTB
1 iPhone case ($20) 1 iPhone case ($20)
2 iPhone cases ($20) 1 iPhone case ($20) +
1 iPhone case ($20)
1 iPhone case A ($20) +
1 iPhone case B ($40)
1 iPhone case A ($20) +
1 iPhone case B ($36)
Warning icon
hybris OOTB cannot
distinguish different/same products in the promotion
1 iPhone case A ($20) +
1 iPhone case B ($40) +
1 iPhone case C ($28)
1 iPhone case A ($20) +
1 iPhone case B ($18) +
1 iPhone case C ($21)
— ” —
2 iPhone cases A ($20) +
1 iPhone case B ($40) +
1 iPhone case C ($28) +
1 iPhone case D ($14)
2 iPhone cases A ($20) +
1 iPhone case B ($18) +
1 iPhone case C ($21) +
1 iPhone case D ($14)
— ” —

This promotion type is not 100% compatible with Drools if implemented as a single rule. The reasons are:

One possible solution is to use a custom rule group, with three stackable promotions in it.

Promotion Conditions Actions
#1 (Stackable) 1. Qualifying products (a list) Blacklist the most expensive
#2 (Stackable) 1. Qualifying products (a list) except for blacklisted
2. Promotion #1 was fired
Blacklist the most expensive (product X)

Create a discount (configurable) for product X (10%) in the cart
#3 (Stackable) 1. Qualifying products (a list) except for blacklisted
2. Promotion #2 was fired
Identify the most expensive (Product Y)

Create a discount (configurable) for product Y (25%) in the cart

All [category/product(s)] for $X

Example. All fruits for $10.

Cart contains Expectations How hybris works OOTB
1 apple ($15) 1 apple ($10) [as expected]
1 apple ($15) +
1 cucumber ($12)
1 apple ($10) +
1 cucumber ($12)
[as expected]
1 apple ($15) +
1 cucumber ($12) +
1 peach ($16)
1 apple ($10) +
1 cucumber ($12) +
1 peach ($10)
[as expected]
1 apple ($5) 1 apple ($5) [as expected]
1 apple ($5) +
1 peach ($12)
1 apple ($5) +
1 peach ($10)
[as expected]
10 apples ($11×10=110) 10 apples ($10×10=$100) [as expected]

Example. Some products (apples, cucumbers) for $10.

Cart contains Expectations How hybris works OOTB
1 apple ($15) 1 apple ($10) [as expected]
1 apple ($15) +
1 cucumber ($12)
1 apple ($10) +
1 cucumber ($10)
[as expected]
1 apple ($15) +
1 cucumber ($12) +
1 peach ($16)
1 apple ($10) +
1 cucumber ($10) +
1 peach ($16)
[as expected]
1 apple ($5) 1 apple ($5) [as expected]
1 apple ($5) +
1 peach ($12)
1 apple ($5) +
1 peach ($12)
[as expected]
10 cucumbers ($11×10=110) 10 cucumbers ($10×10=$100) [as expected]

Percent discount

Example. All apples 30% off.

Cart contains Expectations How hybris works OOTB
1 shirt ($100) 1 shirt ($70) [as expected]
2 shirts ($200) 2 shirts ($140) [as expected]

Bundle products

Example. If you buy both apples and cucumbers, 10% off for a bundle.

Cart contains Expectations How hybris works OOTB
1 apple ($20) 1 apple ($20)
Warning icon
hybris OOTB cannot
apply a discount to a total bundle price
1 apple ($20) +
1 cucumber ($10)
1 apple ($18) +
1 cucumber ($9)
— ” —
1 apple ($20) +
2 cucumbers ($10)
1 apple ($18) +
1 cucumber ($9) +
1 cucumber ($10)
— ” —
2 apples ($20×2=$40) +
2 cucumbers ($10×2=$20)
2 apples ($36) +
2 cucumbers ($18)
— ” —
3 apples ($20×3=$60) +
2 cucumbers ($10×2=$20)
2 apples ($36) +
1 apple ($20) +
2 cucumbers ($18)
— ” —
2 cucumbers ($10×2=$20) 2 cucumbers ($20) — ” —

Fixed amount discount

Example. Apples 10% off.

Cart contains Expectations How hybris works OOTB
1 apple ($20) 1 apple ($18) [as expected]
1 apple ($20) +
1 cucumber ($10)
1 apple ($18) +
1 cucumber ($10)
[as expected]

Order history

X% discount for customers who placed more than Y orders before

Hybris does not support it OOTB. If you need to implement this promotion type, consider the following points:

Get $X% off if bought more than $Y worth of products before

Hybris does not support it OOTB. If you need to implement this promotion type, consider the following points (in addition to those mentioned above):

Customer groups

X% discount for customers whose email contains text [‘company.com’]

Hybris does not support it OOTB. If you need to implement this promotion type, consider the following points:

Delivery Promotions

Free shipping on all products

Hybris does support it. However, you can face problems if free shipping is also a condition for other promotions. hybris OOTB does not have such a condition, so in the default setup it is not an issue. For example:

With these rules, you can face an interesting issue:

So the order of promotions counts in this case. If the discount promo is first, you will have a lower price ($99), but you also need to pay for delivery ($13). If the discount promo is last, you will have free delivery ($0), but you will pay the full price for the apples ($110).

You also need to take into account that hybris promo actions do not change the order by default. They extend it by adding discounts. It means that if you need to implement the condition “if the delivery is not free”, there are two things that bring this information:

For the statement “if the total worth of products in the cart is more than $100, the delivery should be free”, the promotion engine creates DeliveryRAO, but CartRAO remains untouched. After the promotion calculation process, all DeliveryRAOs are applied to the Cart.

Buy x, get free shipping on order

Hybris does support this promotion type. It is a combination of Qualified products and Free Delivery.

Coupons

In hybris, you can apply/redeem a coupon that brings no benefits. Unfortunately, OOTB hybris does not check if the coupon is used or not. The customer can waste their coupons if there are any promotions capable of working with this coupon.

Order discount with the coupons

There is an OOTB condition that checks if the coupon is applied to the order. In hybris, the coupon itself does not have information about its value. The value is supposed to be set in the promotion action.

Gift coupons

Gift coupons are issued when the order is placed. This approach has some drawbacks.

The order can be canceled or reconsidered just after the purchase. In this case, the coupon needs to be called off. If the coupon is used by the customer, you cannot call it off, but you also cannot cancel the order just because you have issues with the customer’s gift coupon.

The right way is to issue the coupon after the order is delivered. The coupon should be generated in one of the last steps in the order process. Even in this case, you need to think about what to do if the purchase is returned.

© Rauf Aliev, April 2017