I have created a customer loyalty and reward app that works in a very simple manner. We supply cafes etc. with a printed QR code which the customers scan on each visit, using the app. Upon completing X visits, the customer is entitled a reward, e.g. a free coffee. In order to prevent illegitimate check ins, such as taking a photo of the printed QR code and scanning it at home, we supply an iBeacon along with the label. Therefore, whenever a user scans with the app the QR code, the app attempts to communicate via BLE with the relevant iBeacon. If it's found, the check in is considered legitimate.
This however has proven to have many shortcomings, the most important of which are:
- The iBeacon batteries run out quite often (after a few months) and despite the fact that the owners receive SMS to replace the batteries, they mostly don't bother.
- The iBeacon itself is relatively expensive (about $15 each) given that we offer this service for free.
Given that the incentive to "hack" this app ain't that big (you are not going to win a car or a house by the beach), one would suggest to rely only on the user's location for example to validate that the customer is indeed at the store. However, we want this to also work on delivered goods. Currently we also supply "mobile" labels that a delivery boy has with him and the customer may scan at home or work.
I am trying to think of a simpler or more cost efficient way to validate customer check ins but haven't managed to do so.
Can anyone suggest an alternative "good enough for most cases" way to do this?
My main problem is that someone can take a picture of a QR code and scan it at home. Therefore, I was wondering how hard would it be to check the image my app "sees" during scanning at the server side. So if I uploaded an image taken by the camera, every time someone scans a label and have some "automagic" way to determine if it's a legit scan or e.g. the screen of another phone or a printed copy of my label?
Could I print something on the paper or the plastic label that I can identify during scanning that would be hard to imitate? E.g. making the label look green when viewed on a specific angle?