Kia ora from the MenuAid Product team!
We’re taking a small break from churning out features and bumping up our code coverage score to serve up a little taster of what we’ve been working on for the last few months, and where we are heading in the future.
Amuse Bouche 🍤
Naturally, a little context. MenuAid launched in September 2021 with a focus on solving the “What’s for dinner?” dilemma. In the time since, we’ve focused a lot of our efforts on creating a magnificent recipe library, and all the meal-planning bells and whistles that come along with that - the meal planner itself, the shopping list, and the review system.
This was born out of the context of the COVID pandemic - where experimentation, exploration and, well, fun, was hard to come by.
Since then, as we emerge slowly from our COVID cocoons, cost-of-living has become front-of-mind. Part of solving the “What’s for dinner?” dilemma is making sure that our users can get what they need in order to make that dinner, without breaking the bank.
Early on in the MenuAid journey, we integrated with Whisk - this allows us to push our shopping list into an online shopping experience with Countdown.
Frankly, this experience isn’t as good as we’d like.
Sometimes Whisk will pick the wrong product for the ingredient (say, chocolate milk instead of milk chocolate), sometimes the quantity is a bit off (a 1kg bag of lemons for one lemon), and the cart doesn’t clear itself after purchase, causing an irritating double-up experience (or worse - double purchase). We thought we could do better.
The first thing we knew we needed to do was to collect data. Lots, and lots, of data. If we are going to attempt to match our ingredients to products from the supermarkets, we need to know as much as we can about what’s out there! A quick investigation into the API layouts of the big 3 supermarkets (Pak’nSave, New World and Countdown) revealed the following rough structure for all of them:
So we set about running a stocktake, once every 24 hours that:
- Loops over all the ingredients we have in our recipes
- For each of them, loops over all of the Supermarkets we have configured
- For each of them, searches for products that might match the ingredient
- For each of them, loops over all the locations for the Supermarket that the product is from
- For each of them, checks the current stock and price data for that product at that location
If that sounds like a lot, it is. In fact it was even more than we’d thought, and we thought it’d be quite a lot. We’ve ended up storing all of our product data in a separate database, as it was starting to affect how the rest of the site was operating.
We quickly accumulated millions of rows of product data and stock data, with some notable “fun” hurdles along the way, including:
- explaining to a computer that “milk chocolate” and “chocolate milk” are not the same thing
- convincing a computer that “lemonade” is not a better match for “lemon” than “lemons” is
- teaching a computer that yes, you can buy “3 apples” and “1kg of apples” and both of those should be fine
After a lot of trial and error and database optimisation, we settled on a dataset that we were happy to push forward with - but forward to where?
Our first idea was to be able to provide an estimate of your shopping list; that is, if you were to go and buy all the things in your MenuAid shopping list right now, how much would that cost you? In order to do that, we needed two things:
- a) to decide where you were going to buy from
- b) to decide what you were going to buy when you got there
The former is solved by you, dear user, telling us which of the aforementioned store locations you’d like to shop at. If you are one of the lucky few who have slipped into our experiment pool, you’ll have seen something like this at the bottom of your shopping list:
After selecting your store from the pop-up modal, it will quickly adjust to this, like magic:
“Wow!” I hear you say! But also, “where are these prices coming from?”. A fair question indeed. This is the part that needed a bit more of a human touch (maybe we can outsource it to ChatGPT in the future, but for now - people power!).
The team created a game - essentially a very specific form of Captcha - so that our recipe team could tell us which of the products we’d found were genuine matches (see: “milk chocolate vs chocolate milk”). If they needed more options, they could get them.
If they needed a different search term - say, zucchini instead of courgette - then they could have that too. To incentivise them, we added a classic leaderboard and thermometer - it’s no exaggeration to say that all other work was cast aside without a second thought upon release.
Once we had a collection of matches, we refined it further to say which items we preferred for each supermarket. Most of the time, the main driver for this was price - but occasionally, we opted for fresh over frozen, glass over plastic, or any other thing that made a product more suitable.
With those selected, we use the price of that product at your selected store (or if it is out of stock, averaged across the stores nationwide) to provide your estimate.
We ensure that we are getting you at least as much as you need - so if you need between 1 and 6 eggs, we get you a six-pack, if you need 7, we get you either a dozen or two six-packs. Add it all up and there’s your estimate.
Pictured: a direct representation of how our system converts 6 eggs to 7.
At a basic level, we wanted to help our users see what items in their lists were actually the most expensive - frankly, usually meat - and allow them to dynamically adjust their list to see what effect it has on their budget. Additionally, changing your preferred store location is a quick way of comparing a shop. Making this easy and intuitive is the first step in helping our users manage the current cost-of-living crisis.
Cheese Board 🧀
The next thing we are cooking up is the ability to order your shopping list from your selected store location. As mentioned at the top, Whisk provides us this functionality for Countdown, but we have had a lot of calls for the same functionality at New World and Pak’nSave.
As noted, this is a work in progress at the moment, but hidden behind an admin-only feature flag is the alpha version of this functionality - soon to be released to the public after a little bit more testing.
By connecting your user account for online shopping, we can create and update a cart for you, and push the products (in the correct quantities) in, leaving you simply to review, pick your timeslot, and pay.
Our goal with this is to make it easier than using Whisk, and better at selecting the right products. Testing so far is promising in this regard, but I’m sure the proof will be in the pudding.
Speaking of selecting the right products - that’s the next part on the horizon. We know you all have your favourite brands that you like, dietary alternatives to the standards, or just want the ability to try something different.
As such, we are developing a “product picker” - which will remember your selections - and hopefully also open up the shopping list to better handle “things that are not ingredients”. (As much as TikTok has tried to change it, cleaning solutions are not ingredients - but we do need to buy them at the supermarket!).
Our goal is to have you manage all your shopping list needs through MenuAid - while also inspiring what you might be cooking this week.
To realise that dream, we have few projects in the pipeline that we think will help get us there:
- A quick-compare between stores near you
- The ability to upload your own recipes to the platform to add to your meal planner
- Tracking for pantry staples (things you always have on hand and so should never be added to your shopping list)
- Regular purchases (buy me Vogels every week!)
- Price and availability tracking over time
- Seasonal variance recommendations
And so, so, so much more. Come dine with us as we work our way through this degustation menu stay tuned to this blog for updates as they come about.
Happy eating! 🥞