The above is from the receipt when visiting a supermarket earlier in the year.
Yes, it's an entry for 88.297 KiloGrams of loose fruit at £1.95 per KG, coming to a total of £172.18!
That's almost 200 pounds and the weight of a grown adult!
It's also (to the best of my memory) more than I've ever spent in a supermarket at one time.
During the lockdown, I made my once-a-week trip to the supermarket for essentials.
I used the "Smart Shop" app on my phone to scan and pack items as I shopped.
There are several possible benefits to using the app, but, to me, the biggest was reduced time with a cashier when we should be doing "social distancing."
The following is an explanation of a specific issue I've observed with the app.
I'm realistic enough to know the app won't be perfect, especially with my high standards.
A few minutes later, I noticed the running balance was significantly larger than what was reasonable based on my trolley. I was only shopping once a week, so spending a bit more than I had in the past, but this was way beyond anything reasonable.
I tried removing the incorrect entry, but the app wouldn't let me without scanning it again--which was obviously impossible.
The item was eventually removed, and I paid for my shopping. Nobody in the store was interested in finding out more about how or why this had happened, and so I went home. (I'll save my rant on front-line customer service workers who aren't interested in escalating technical issues for another time.)
This experience weighed on my mind and left me with two big questions.
- How did this item end up on my list?
- How is this item even possible?
How is this item possible?
The entry is for a product the weight of a grown adult.
It's not physically possible to balance that many items on the scales.
The troublesome item has what I'll refer to as a 'self-weighed barcode.' (It's a few years since I worked in a supermarket, and I don't know the terminology they use.)
So, hopefully, you can see what the system thought I'd scanned, but...
How did this item end up on my list?
Or, as a bigger, more general question, how did a different item from what I'd scanned show up on my list?
Firstly, let's consider if this matters.
If the price charged is less than it should be:
- The store will lose money and may try and accuse you of deliberately underpaying. It might be hard for them to prove guilt, but it'll be harder for you to prove innocence. At any rate, it has the potential to be an unwelcome and stressful exchange. Again, a small discrepancy may not be worth the company's effort to change their systems to address.
- If you're undercharged, then you gain. Bonus.
- The company won't mind. For them, the occasional over or undercharged item will probably cancel out.
- Legislators might be interested, but I don't know enough about this area to say for sure.
- For the individual, this could be a big deal. If, as in my case, it's a large difference, this could have a big impact on a person's finances. A large discrepancy is likely to be spotted, but multiple smaller differences might not be. What if you were regularly being overcharged?
How many times has this happened before, but the price difference wasn't large enough for me to notice? - It's a worrying thought.
So, what's happening when the wrong product/price show up?
Let's start by looking at the process as a whole. Here's how it's supposed to work.
- I scan the product with the app on my phone.
- The app decodes the image to identify a barcode.
- The data (barcode value) is sent to the server.
- The server responds with the product and price.
- Repeat for each product.
- At the end, the device/app sends all data to the till.
- I pay at the till. - Done.
The possible causes of the issue are either in the app, on the server, or in communication between them.
- If it's a communication issue, it could be one of data corruption or a man-in-the-middle attack causing data corruption. I don't think either of these is the cause of the issue I encountered.
- It could be that the server sent the response to the wrong device. Perhaps somewhere else, someone did scan the product that showed up on my device, and the messages got mixed up. Perhaps someone else scanned all that fruit and was only charged for some chocolate. This again seems extremely unlikely.
- Perhaps the server was misconfigured, and it thought the barcode for the chocolate was the expensive fruit. That I scanned the chocolate again and it showed up correctly suggests this isn't the case. Of course, an invalid server configuration could have been corrected between the two times I scanned, but I think this is very unlikely.
What could the supermarket have done to prevent this?
I have a few recommendations:
- Continue to invest in improved accuracy of barcode "scanning" based on phone cameras.
- Add validation for extremes of weight and price when reading values from 'self-weighed barcodes.'
- Ensure encrypted connections between the app and server to avoid accidental corruption, modification during transmission, or responding to a different client than the sender.
- Introduce a process for automatically logging and investigating exceptional values or errors.
What I'm doing because of this?
- I now double-check everything I scan.
- I verify the contents of my receipt matches what I put in my basket/trolley.
Bonus validation issue I found with their software for everyone who has read this far.
I regularly see the busy/progress spinner being displayed for longer than elsewhere in the store in these aisles. On one occasion, the delay was significantly longer than I'd encountered previously. It stopped me from scanning further items, and because I'm inclined to wonder when software misbehaves, I started counting seconds until it finished what it was doing.
If you're wondering which supermarket this was, why not leave a guess in the comments. ;)