Thanks for the access. Ok, so the issue with using buy x get y, is some products get assigned to buy x and some to get y. The first 2 products you add to the cart get assigned to buy x, and are not taken into account in the ordering. The 3rd product you add to the cart becomes the get y and is taken into account. This is why the last product in the cart is always discounted.
So to do this have to use another approach. The idea is to:
- check to see if there are at least 3 products in the cart
- if so give a discount to the lowest price item
To do this we need to create a combination coupon:
Coupon a: check if at least 3 products in the cart
- value: 0
- Minimum product quantity: 3
Coupon b: give discount on lowest price item using value definition
Process type: Progressive
Ordering: Lowest value
# of product discount
Then create a combination coupon:
- Function type: combination
- Process type: Only if all apply
- Coupons: add coupons a and b
Then use coupon C.
Since you provided access I created these coupons already. You will still need to modify the children coupons with the specific categories the coupon applies for, but should all work as expected now.