Buy 2 get one free conflict with happy hour

I have set up a buy 2 get 1 (cheapest) as with the following action

This works as expected except when there are happy items on the same ticket in which case it gives the buy 2 get 1 promo on everything, including the happy hour items, which is not what we want.

The happy hour price is tagged with HH so I thought it should be straighforward to simply exclude HH tagged orders from the but 2 get 1 promo

But this not only doesn’t work as I wanted, it also stops the promo working. I have tried various combinations with no success. Can anybody help and suggest what I am doing wrong?

You cant use != in that type of expression.
If you can find/work out the unbracketed equivalent it might be posible with != however am thinking you may need to use a ‘admin order state’. I have a few, and setup automation to make it so you can have a positive constraint rsther than exclude.
Ie, an order state of say NotHH=true.

I was just solving this problem and instead of using Adjust Order Price I would assign a HappyHour order state to orders from specific groups within 4pm to 7pm period, then execute automation command that would make a check with {TICKET ORDER COUNT EXP:(OS.HH=HappyHour)} % 3 = 0 and if true, it would gift an item for free automatically.

Its different solution to something similar you have but I prefer order states because you can report it later.

You could look at my more complex discounts system.
We have several discount levels with different drink and food discount %.
I have a string of automation that updates and calculates a fixed discount calculation to the value required.
You could look to do where rather than gifting the order you set a discount calculation to the value of the number of free items.
I ended up with 6 discount types which are updated and removed based on ticket state fkr discount type.
You would be able to report based on calculatikn if you split discounts to factors needed to report seperatly.
I did this as it allowed me to have more granular control.
Changing ticket discount type state recalculated discount for ticket. Scope in there to exclude items as if remember corectly set a discountable sgate on adding, this can be updated to make it excluded from total used to calculate discount.

Thanks for the replies. I dont really want to change the approach as happy hour is already working well so changing this and going through all the retesting is not a great plan. A % discount is too complex as there are close to 100 items on this promo with a range of prices which brings us back to an alternative to the != expression. This should be the price tag = default price list. There is no definition for this but it shows in the price list editor as Price

If I modify my action as follows

the promo still works on happy hour prices which suggest the expression (OT.PriceTag = Price) may be incorrect. I have tried leaving it blank, as this is used elsewhere to select the default price list, but this cuses an exception and the programme crashes. Any ideas?

I am not fully familiar with what expressions can be used within the Adjust Order Price action but try this && OrderTag.TagName="x"

Isn’t that just a more verbose version of what I have already? I tried it anyway but it hasn’t solved the problem

Yes, I had to use it in my order tag report some time ago because (OT.xxxx) expression was giving out some odd results so thought it might work here too

I asked emre about defulat price tag.
Think either
= nothing
= ‘’ empty
Or space was suggested.
Its on forum somewhere.

Try just and instead of &&

Isnt OT order tag, not price tag?

This was topic I was thinking of but was not directly related to your use/need

For Price selector try putting:

{ORDER DETAILS:MT.Price.sum:Order.IsSelected}

Changing && to AND didn’t make any differrence.

I don’t understand how you are suggesting to use {ORDER DETAILS:MT.Price.sum:Order.IsSelected}. I assume you mean replace (OT,PriceTag = Price) in some way. Could you please quote the full expression. What I am trying to get to is that the order is only selected when the price is from the default price list and not selected if the price is from the happy hour price list

if its a timed happy hour could you not just block the buy 2 get 1 during happy hour?

It is already like that. Buy 2 get 1 free operates 12:00-16:00 then HH 16:00-19:00 and this is all fine.

At 19:00 we go back to B2G1, at which point some of the open tickets have items that were sold at HH price but now fall under the B2G1 promo so as soon as another eligible item is added it it promptly searches the whole ticket and gives one or more HH items for free. e.g. lets say somebody has ordered 6 beers in HH, these are all on the ticket at HH price: if he then orders a full price beer when the B2G1 promo starts at 19:00, the action will look at all the 7 beers am give two for free.

To eliminate this we either need to choose ietms with full price for the B2G1 promo or not allow HH items

There is not a way to do this atm. What you can do though is constrain the rule to dates outside of happy hour time. It wont run at all during those hours.

EDIT: Nevermind I see what you are saying. Hmm

So use {ORDER DETAILS:MT.Price.sum:Order.IsSelected} in the Price Selector box of the action. That forces it to use default price. But I dont think that solves your issue really. hmm

No it doesn’t. Currently looking at using states as a way of solving it i.e. a happy hour state and non happy hour state. Looking hopeful so far

States should work.
As order added rule set a happy hour and non happy our state as orders added based on time and include no happy hour state in you b2g1 constraint.