Customer Loyalty Points Setup [4K with Voiceover]


OK Brother …
IF My Customer Have Point 12 point in the Picture
So customer want to buy his point to Reduce Total amount We only allow 10 point Even he have 12 or 15
like that. If customer have 24 or 34 we only accept that only 20 and 30 Like that.@JTRTech


It will all be done using the calculation part… It’s basic maths with expressions/tags as variables.
search the forum for rounding examples. Q did a lot in his curency topics using a script he made which was nice. Sure there is a basic helper function also.


Hola! I started working with the points: each product has one value. when I select a customer name, the system takes it but after paying, the system closes itself and the order reappears. so I have to erase the name in order to shut off properly. why is this error occurring?

Your video was helpful. Do you have any videos that can help me understand what a log is and similar?

thanks a lot


Am not following, maybe do a screen recording so can see what you mean.

Search the forum for voiceover, I have 4-5 tutorials similar to this one.
There are links to a bunch of them at the top.


Hi Joe,

Ive followed this absoloutely brilliant tutorial to the letter. However when I perform the following:

Customer has more points than the total of the order. Value of points takes the balance to 0 as expected however the amount of points does not decrease.

Can you point me in the right direction.

Ignore the +1 x 100 part ive returned that back to just *100 I was trying to make it a positive figure.

This end rule you can see I think is the problem when the total is 0 because the points covers the bill. there is nothing to multiply by 100 to give a figure. I think lol.




Obviously not to the letter :stuck_out_tongue: your loyalty entity has a different name :stuck_out_tongue:

Been a while since I did this but was tested woking so something different somewhere, perhaps entity type name or something.
Ill try and have a closer look later as am away from desk at the minute


Ha Ha no problems Yeah ive got a slightly different entity name setup as I already have that name used in the tutorial ill go over it again.

Ill post here if I manage it


Ive got it the problem is the order of the rules on the final step. I have had to rearrange it now it works fine.




First thank you for you great tutorial, great to see the thought process of problem solving.
I have implemented this loyalty system on my test machine however I would like to be able to limit the points awarded to certain products (all products are tagged with either FOODS/DRINKS/SUNDRIES) and not everything. In particular it is the food tag which I would like to use.

Am I right in thinking the change will have to be made in the Update Ticket Points Value State rule

Using Reports to test I can retrieve the total for the tag in question but what I am struggling with is retrieving the total for only the ticket in question and implementing that in the rule above.

As can be seen above the first line in the template provides the total amount for the workperiod directly below the date.

I have viewed the template help files but so far have not been able to find the right syntax to get the total I need. Any help in pointing me in the right direction is greatly appreciated.
Cheers Michael


There are a limited number of reports which will work on the current unsubmitted ticket. They are about 3/4 of the way down and they are names differently like TICKET ORDER DETAILS rather than report. Am not at PC to check exact report.
Your correct in that it’s not so straight forward to do report type expressions for current ticket. If it’s submitted you can use ticket I’d to do close and opening type processing but unsubmitted restricts the options a little.


Found a solution that gives me the total for foods tag.

[=Math.floor(TN('{TICKET ORDER EXACT TOTAL EXP:MenuItem.Tag = "FOODS"}') * 5)]

Hope this helps anyone else looking to do a similar loyalty system.


Encountered an issue with End Of Day Reports / Work Period Reports where the loyalty discounts will not be taken into account in my takings totals - this would lead to tax issues (VAT) and accounting where total takings were not being reported accurately.
My solution is to append the following at the top of my reports:

[Z Reading End Of Day:3,2]
Loyalty Discounts | [=TN('{REPORT CALCULATION TOTAL:(CT=Loyalty Discount)}')]
>FOOD | [=F(TN('{REPORT CALCULATION TOTAL:(CT=Loyalty Discount)}') + TN('{REPORT ORDER DETAILS:O.ExactTotal.Sum:MenuItem.Tag = "FOODS"}'))]
>DRINKS | [=TN('{REPORT ORDER DETAILS:O.ExactTotal.Sum:MenuItem.Tag = "DRINKS"}')]
>SUNDRIES | [=TN('{REPORT ORDER DETAILS:O.ExactTotal.Sum:MenuItem.Tag = "SUNDRIES"}')]

>Totals below do not take into account loyalty discounts

This is unique to my setup but may help others.


As you say this should be unique to you as calculations are accounted for in the default work period report.


Can’t the points be tampered with? Even though you mark it as hidden?


Admin could change in edit entity
Could be changed in SQL directly
Both involve admin access/passwords and could do more damage elsewhere if they had maltent.


Okay, now I understand. The Loyalty Card entities are completely separate from Customer entities and you set it up so that Loyalty Card Entities are not searchable, therefore, not editable.


I want to tie the Loyalty Card to a Customer Entity, not the Loyalty Card Entity. Is there a way to hide the “Loyalty Points” Custom Entity Data Field. Cashiers still need to be able to access and edit other Custom Entity Data Fields.


Great tutorial. Works fine. I am having problem using the points to pay for the ticket. When i apply the points, the ticket shows zero, but does not close as if it was paid. I am using the 5% back as actual cash back to my customers. I have read all of the points as tender posts, but still can’t figure out the solution. Any help?

now i apply points here:

payment screen shows zero balance and ticket does not close as if it was paid.


Yes, I’m sure there is an option on entity fields to make them hidden.


If you press close does it not close ticket and Mark as paid?