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.
- Option #2. The product should be placed in the cart manually by the customer.
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 |
![]() 1 orange free |
| 2 apples + 1 orange ($) |
2 apples ($) + 2 oranges free |
![]() 1 orange ($) + 1 orange free |
| 2 apples + 2 oranges ($) |
2 apples ($) + 2 oranges free |
![]() 2 oranges ($) + 1 orange free |
| 2 apples + 3 oranges ($) |
2 apples ($) + 1 orange ($) + 2 oranges free |
![]() 3 oranges ($) + 1 orange free |
As you can see from the table, the hybris OOTB BOGOF promotion has the following flaws:
- If you buy N products, you will still get only one free product. If you create two orders in a row instead of one combined order, you will get two free products, one per order.
- If your free product is available for purchase and the customer added this product to the cart manually, the price of this product will not be zeroed.
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 |
![]() |
| 2 apples ($) | 2 apples ($) + 2 oranges free |
![]() |
| 2 apples + 1 orange ($) |
2 apples ($) + 2 oranges free |
![]() 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.
- Buy any fruit, get one milk product free. Apple is a fruit. Yogurt is a milk product.
- Buy any vegetable, get one milk product free. Cucumber is a vegetable.
| 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 |
![]() 1 cucumber ($) + 1 yogurt free + 1 yogurt ($) |
| 1 apple ($) + 1 cucumber ($) + 3 yogurts ($) |
1 apple ($) + 1 cucumber ($) + 1 yogurt ($) + 2 yogurts free |
![]() 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 |
![]() 1 cucumber ($) + 1 yogurt free + 1 yogurt ($) |
| 2 apples ($) + 1 cucumber ($) + 2 yogurts ($) |
2 apples ($) + 1 cucumber ($) + 1 yogurt ($) + 1 yogurt free |
![]() 1 cucumber ($) + 1 yogurt free + 2 yogurts ($) |
| 4 apples ($) + 2 cucumbers ($) |
4 apples ($) + 2 cucumbers ($) + 2 yogurts free |
![]() 2 cucumbers ($) + 1 yogurt free |
| 4 apples ($) + 2 cucumbers ($) + 2 yogurts ($) |
4 apples ($) + 2 cucumbers ($) + 1 yogurt free + 1 yogurt ($) |
![]() 2 cucumbers ($) + 2 yogurts ($) 1 yogurt free |
In hybris, this type of promotion is implemented as:
- AND-Group of
- Container 1: SKU = apple, amount = 2
- Container 2: SKU = cucumber, amount = 1
- Action: Free gift, amount = 1
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“ |
![]() No OOTB support |
| 2 Shirts A ($) | 2 shirts ($) + a message “add 1 shirt to buy all three for $100“ |
![]() 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 |
![]() No OOTB support |
| 3 shirts A ($) | If the total price < $100, the price of the cart item “3 shirts A” is now $100 |
![]() 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″ |
![]() 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%) |
![]() 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…) |
![]() No OOTB support |
| 5 shirts ($15×5=$75) | 3 shirts ($30) + 2 shirts ($15×2=$30) + a message (“add 2 more shirts…) |
![]() No OOTB support |
| 6 shirts ($15×6=$90) | 6 shirts ($30×2=$60) | ![]() No OOTB support |
| 7 shirts ($15×7=$105) | 6 shirts ($60) + 1 shirt ($15) |
![]() No OOTB support |
“3 different shirts => fixed price”

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:
- Condition
- Container A
- Condition for the first product in the bundle
- Container B
- Condition for the first product in the bundle
- Container C
- Condition for the first product in the bundle
- Container A
- Action
- Target bundle price (A+B+C)
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 |
![]() 1 apple free |
| 4 apples ($) | 3 apples ($) + 1 apple free |
4 ![]() 1 apple free |
| 5 apples ($) | 4 apples ($) + 2 apples free |
5 ![]() 1 apple free |
| 6 apples ($) | 4 apples ($) + 2 apples free |
6 ![]() 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 |
![]() |
| 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” |
![]() 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) |
![]() 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:
- The number of groups is not fixed (two or three).
- The first group must contain the most expensive product if the cart contains more than one product from the list of qualifying products.
- The second group must contain the most expensive product among the remaining products.
- The third group must contain the most expensive product among the remaining products.
- For the remaining products, the grouping starts from the first group again.
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) | ![]() 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:
- Identify the system that is the source of truth for the orders. Commonly, the e-shop sends orders to an external system, and these orders can be changed/canceled there without notifying the e-shop. Certainly, if the e-shop is currently using order history for other purposes, this situation is likely unreal.
- Order history can be huge and slow. Any real-time requests can slow down your system. Think about caching order totals to make the calculations faster. Ideally, the number and total cost of delivered orders should be calculated each time the order status is changed to “DELIVERED”.
- List all statuses and edge cases that may create inconsistencies. For example, the system will take only delivered orders into account for this promotion type.
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):
- Period of time. Open periods are not good for this promotion type; they do not motivate customers to buy more, and after years they come back with problems for the business.
- Currencies. Some purchases can be made in different currencies from the same account.
- Refunds and returns.
- Purchases paid by points/non-monetary payment methods.
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:
- If e-mails can give the customer discounts, the registration process will be more comprehensive for the customer. The customer needs to confirm the e-mail address before this address is recognized as qualified for the promotion type.
- Needless to say, “@company.com” must be the trailing part of the e-mail and must contain a “@” character. If your system checks just for a substring, emails like “blablabla+company.com@gmail.com” can be wrongly identified.
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:
- delivery cost is $13
- 10% discount for all apples if the delivery is not free (because in fact it is not really free for the seller; it pays for it anyway and prefers not to give any discounts when delivery is free for the customer);
- if the total worth of products in the cart is more than $100, the delivery should be free.
With these rules, you can face an interesting issue:
- apples cost $11/lb
- you decide to buy 10 lb, so the total cost is $110
- the delivery is not free by default, so you have a 10% discount, and your final price is $99 ($110-11) + $13 for delivery = $112
- $99 < $110, so the delivery will not be free even if your original total price is more than $100
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:
- CartRAO. It is created by the promotion module BEFORE the promotion engine starts working.
- DeliveryRAO. It is created by promotion actions DURING promotion engine execution.
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