Concept demo · 2026

Most Dubai supermarkets have a website that can't take an order.

Build story

The Freshmart grocery storefront demo - real UAE products in a browsable catalogue with a live cart.
Real products, real cart. The only fake part is that it's a demo.

Role

  • web
  • product
  • build

Stack

  • Cloudflare Workers
  • Hono
  • D1
  • React
  • TypeScript
The problem
Plenty of grocers here have a site. Almost none of them let you actually buy anything - the ordering happens on WhatsApp, one message at a time, and only while somebody is free to answer.
What I built
A working storefront: real UAE supermarket products, stock held per branch, a cart that checks out cash on delivery with a pin dropped on a map, and the staff dashboard that fulfils the order and takes things out of stock live.
The result
A live demo you can order from on a phone - the whole loop, from a search to a picker marking the tomatoes out and watching them grey out on the customer's screen seconds later.

This one started as a question a client half-asked and never followed up on: could a supermarket here really sell and deliver online, properly, not through a WhatsApp catalogue?

Answering it in a proposal would have taken about as long as answering it in code, and nobody has ever been talked into anything by a proposal. So I built the answer instead of writing it.

Freshmart isn't a real supermarket. The name and the branches are invented, so the demo has somewhere to stand. The products aren't: they're real UAE supermarket lines across the categories people actually shop - fresh produce, bakery, dairy, meat - with real names, real pack sizes and real prices, and the discounted ones still showing what they were marked down from. That mattered more than it sounds like it should. Invented products make a demo look like a demo, and anyone standing in the room knows within two seconds whether those are real Dubai prices.

Stock is per store, not per company. The site that forgets that sells you something from a fridge across town.

A supermarket isn't one shop

The thing that makes grocery genuinely harder than it looks is branches. Stock is per store, not per company, and the version of the site that ignores that is the version that takes an order for something sitting in a fridge across town. Then somebody has to ring the customer back and un-sell it, which costs more goodwill than the basket was worth.

So the demo runs four branches - Marina, JBR, Al Barsha and Al Satwa - each with its own inventory. The storefront asks for your location, picks the nearest one, and shows you what that branch actually has rather than what the chain theoretically stocks.

Which meant it needed the other half too, and the other half is where these projects usually stop. Staff pick their branch, sign in, and get a dashboard: the day's numbers, a list of orders, a click into any one of them for its items, the customer, and a map of where it's going. Plus an inventory editor, because someone has to be able to say the tomatoes ran out.

That's the part that lands in a room. Mark something out of stock on the laptop and watch it grey out on the phone across the table, without anybody touching refresh. It's a small piece of engineering and it does more convincing than the whole rest of the build, because what it's really showing is that the shop and the website can't disagree with each other.

The unglamorous half of ordering

Checkout is cash on delivery with a pin dropped on a map, because that's how delivery actually works here and because a Dubai address is frequently not a thing anyone can type. Then order tracking, so the person who paid can see where it got to instead of messaging to ask.

Phone-first, because that's where the groceries get bought.

It has to be quick, and not as a bonus. This gets used on a phone with one bar of signal, one-handed, usually by somebody who has already decided and just wants it done. Every second before the catalogue draws is a second the basket can be abandoned in, which is why it's served from the edge rather than from one server somewhere else.

There isn't a single emoji in it. Every grocery template on the internet drops a cartoon apple where an icon should go, and it's the fastest way to look like a template rather than a shop, so the icons are all drawn.

Nobody browses to a supermarket

A grocery site doesn't get found by people typing the shop's name. It gets found by somebody who wants milk at nine at night and types where they are. That's local search, and it's about as high-intent as traffic gets - the person searching already has a basket in their head.

So the work starts with keyword research on what people here actually type: the delivery phrase, the area name, the product category, in the order they type them. Then the site gets a page for each of those instead of one homepage carrying all of it. Branch pages that can rank for their own neighbourhood. Category and product pages with structured data, so a price and whether it's in stock can show up inside the Google result. A sitemap that's true, and a site fast enough that the phone doesn't give up first.

Then GA4 and conversion tracking on the checkout itself, so you can see which category pays for itself, which branch converts, and which step the basket gets left at. Without that, every argument about the website is two people guessing at each other.

And it keeps running after launch, which is the half that usually goes missing. The most useful list a grocer can own is what people searched for on their own site and got nothing back for. It's next week's stock order, and almost nobody collects it.

What it isn't yet

Real card payments, real SMS and real accounts are the phase after this one, and the demo says so on the page rather than in a footnote. A pitch demo that quietly implies it's production is a demo that becomes an argument later.

The piece that fits this business best is the one the orders are already arriving through. A bot on the WhatsApp number can take an order in the customer's own words, price it against the branch that's actually got the items, confirm the total, and drop it into the same dashboard the staff are already looking at - so the WhatsApp habit stops being a workaround and becomes a channel with a record behind it. Two of them have been answering for a Dubai showroom, the first since 2024.

After that it's the follow-ups, which in grocery is most of the game: a reorder nudge on the things somebody buys every week, sent to the number they already ordered from. What each of those costs is on the pricing page.

Nobody's paying for it yet. It exists so the next conversation starts with a working thing instead of a slide - and the pitch underneath it is simple enough: a supermarket that can take an order at 9pm is a supermarket that's open at 9pm.

Two ways on from here: the next case study - Gulf luxury real estate sites all look the same. This one doesn't, or the films.