A personal project: How I built an Alexa skill that actually adds items to my Tesco basket, instead of just making a list I have to process later.
The Ritual That Finally Broke Me
"Alexa, add milk to my shopping list."
Sounds convenient, right? Except here's what happens next: at some point before my Tesco delivery slot, I open the Alexa app, look at my shopping list, then switch to the Tesco app, search for "milk", scroll past the fifteen varieties I don't want, find the one I actually buy, add it to basket. Repeat for every item.
The whole point of voice shopping was to save time. Instead, I'd created a two-step process that took longer than just typing it into Tesco in the first place.
So I built something better.
What I Actually Wanted
The dream was simple: say "Alexa, add milk" and have it appear in my Tesco basket. Not on a list. In the basket. Ready to order.
But Tesco doesn't have an Alexa skill. Amazon's "order by voice" only works with Amazon Fresh. And the IFTTT integrations I found were either broken, limited to specific product IDs, or required me to set up complex applets for every single item I might ever want to buy.
I wanted something that understood what I meant. When I say "bread", I want the sliced wholemeal loaf I always buy, not artisan sourdough or hot dog rolls.
(Tesco, if you're reading this, please try harder.)
Challenge 1: Teaching AI What "Bread" Means to Me
The pain: "Bread" returns 359 results on Tesco (at the time of writing). Even if you narrow it to "white bread", there are dozens of brands and sizes. Every household has preferences. Maybe you always buy Warburtons, or you're loyal to Hovis, or you go for whatever's on offer.
The solution: I built a preference learning system. The app knows my Tesco Favourites (the products I've bought before), and uses AI to match what I say to what I actually want.
But here's where it gets clever: the system learns from my feedback.
When the AI suggests Kingsmill and I wanted Warburtons, I can mark it wrong and pick the right one. The system remembers. Next time I say "bread", it knows I prefer Warburtons. Do this a few times and it starts getting things right first time.
The learning is asymmetric on purpose. When I correct a mistake, the system learns quickly (that was wrong, don't do it again). When it gets it right, it reinforces gently (good job, keep doing that). This stops it from overreacting to one-off choices.
Challenge 2: Not Everything Matches Perfectly
The pain: Sometimes I ask for something that isn't in my Favourites. Maybe it's a new product, or something I buy rarely. The system needs to handle this gracefully.
The solution: Confidence scoring. The AI returns not just its best guess, but how confident it is:
- Exact match (90%+ confidence): "You said milk, you've bought this specific milk 47 times, here it is."
- Good match (70-89%): "You said pasta, and this penne looks right based on your history."
- Partial match (50-69%): "You said biscuits. I found Hobnobs in your favourites, but you might mean something else?"
- No match: "I don't recognise 'artichoke hearts', you might need to add this one manually."
For anything below high confidence, the app shows alternatives. One tap to swap to a different product if the AI guessed wrong.
Challenge 3: Mobile Shopping Shouldn't Feel Like Work
The pain: Even with smart matching, you still need to actually add items to your Tesco basket. The goal was to make this as quick as possible.
The solution: A dead-simple shopping list interface optimised for phones.
Each item shows the product the AI matched, with a direct link to Tesco. Tap the link, hit "Add to basket" on Tesco's site. Done. Swipe right to mark it complete. Swipe left if you don't want it (and tell the system why, so it learns).
There's a progress bar at the top so you know how far through you are. A button opens all remaining items in sequence. Tap through each one adding to basket, close the tabs as you go.
What used to take 20 minutes of searching and scrolling now takes about 5 minutes of tapping "Add to basket".
Challenge 4: Preferences Are Complicated
The pain: It's not just about brands. Some people want the cheapest option. Others want organic. Some have allergies to navigate. "Get me cheese" means different things to different households.
The solution: A preferences system that the AI actually uses:
- Budget level: Prefer value range, go premium, or balance quality and cost
- Organic preference: Prioritise organic products when available
- Allergens: Exclude anything containing nuts, gluten, dairy, etc.
- Dietary requirements: Vegetarian, vegan, halal, kosher
The AI factors all of this in. If I'm set to "budget" and ask for cheese, it'll pick the value cheddar, not the cave-aged Gruyère.
And if I consistently choose a specific brand despite what my settings suggest, the system learns that exception. Settings are defaults; actual behaviour overrides them.
Behind the Scenes
The technical stack, for anyone curious:
- Alexa skill: Custom model that captures what I say and posts it to my server
- AI matching: Analyses my request against my favourites list
- Preference learning: PostgreSQL database tracking brand preferences by category
- Web interface: Next.js app that works great on phones
- Automation: n8n workflow that processes my voice commands at 7am and emails me a summary
The AI costs next to nothing. Far cheaper than the time I was wasting before.
What's Next
The roadmap includes:
- Multi-store support: Sainsbury's, Ocado, Asda. Same system, different supermarkets
- Shared lists: Let my partner add items from their phone
- Shopping history: "Reorder last week's shop" with one command
- Price alerts: "Let me know when coffee goes on offer"
The Real Win
The best measure of success? I don't think about grocery shopping anymore.
Items get added by voice throughout the week. When I notice we're low on something, when I'm cooking and realise I need an ingredient, when my partner shouts from another room. By the time delivery day comes, the list is ready and mostly matched. Five minutes to confirm and order.
That's the promise voice assistants were supposed to deliver from the start. It just took a bit of DIY to get there.
Got an idea for an app? Want to learn more? Get in touch