Connor asked if there was a better way to work out what a cake actually cost to make. He had a spreadsheet. The spreadsheet had become several spreadsheets. The several spreadsheets had started referencing each other, and at some point one of them had quietly broken without telling anyone, and now the numbers at the bottom of the column were generous in a way that would eventually become someone’s problem.
So I said I’d have a look.
I want to be clear about what I knew at this point. I knew some Excel. I knew enough about WordPress to be dangerous. I had built a database. I had a vague sense that Access was the thing you used when a spreadsheet stopped being a spreadsheet, mostly because that’s what Access told me about itself every time I opened it.
The first version was four tables. Ingredients, suppliers, recipes, and a junction table to link recipes to ingredients with quantities. Standard relational stuff that I had to look up the names of after building it, the way you sometimes do the right thing accidentally and only later find out it has a name.
Then came the unit conversion problem.
Raf buys flour in 16kg sacks. The recipes are written in grams. The supplier invoice lists the sack by weight and price. The cost-per-gram is a calculation, but it’s a calculation that has to live somewhere reliable, because if I let Connor type it in himself it would be wrong by the third recipe and silently wrong forever after. So the database had to do it. Which meant the database had to know that 16kg of flour at one price gave you a per-gram rate, and then a recipe calling for 350g of flour cost that rate times 350, and the whole thing had to update if the sack price changed next month.
That’s not hard. It’s also not what Access wants to do without being talked into it.
I spent a week of evenings on this. Not full evenings. The half-hour after dinner before something better arrived. I learned what a query was, which was embarrassing because I’d been answering questions with the word ‘query’ for years and turns out I didn’t quite know what one was. I learned that Access forms are a bit like WordPress page builders if WordPress page builders had been designed by someone who actively disliked you. I learned that the printable layout view is its own separate skill that has nothing to do with the database underneath.
By the end of it there was something that worked. Connor could add a recipe, pick ingredients from a dropdown that pulled from the suppliers table, type the quantity, and the bottom of the form showed the cost of making one of the thing. Wastage was a percentage you could nudge per recipe. Allergens flagged themselves based on the ingredient list. Stock levels updated when a recipe was logged as made.
It was, objectively, fine. It was also held together with five different bits of VBA I had copy-pasted from forum posts dated 2009, and the printable view rendered any allergen list longer than six items off the side of the page, and the whole thing only existed on one laptop because Access doesn’t really do multi-user without becoming something else entirely.
The other thing nobody warns you about is the support contract.
I didn’t write a support contract. Nobody asked me to. But the moment something existed that Connor depended on for actual business decisions, I had quietly signed one. A WhatsApp at half nine on a Thursday because a recipe wouldn’t save. A panicked voice note because the file had gone read-only. A call on a Sunday because the entire thing had decided, for reasons it would never explain, that the suppliers table was empty. It wasn’t empty. Access was just lying about it for the afternoon.
This is the bit that the small-business-software industry exists to solve and the bit that they charge a lot of money for, and I now understood why. It’s not the database. The database is the easy part. It’s everything around the database. The forms, the reports, the printing, the backups, the version control, the fact that someone has to be on call when it breaks. I had built one of those for free, and now I was one of those for free.
The Access version got retired a while back. The rebuild is a custom WordPress plugin now, with proper user roles so the kitchen sees recipes without seeing costs, ACF doing the heavy lifting, and a sensible backup routine. Connor never has to email himself a copy of the file before doing anything mildly experimental, which is the small-business-software definition of progress.
The Access file still exists. I keep it on MeSeekBox in a folder called ‘old_versions/recipes_access’. I will never open it again. Neither will Connor. But neither of us can quite bring ourselves to delete it, because it was the first thing that ever convinced me that the gap between Excel and ‘actual software’ is a lot smaller than it looks, and a lot wider than you think.