Live, handed over
An ordering website and back office for a Liverpool cake maker
Vivi's Cakery sells a set menu of cakes and bespoke cakes for special occasions. We built a website where customers can order and pay for a menu cake or ask for a bespoke quote, plus a back office the baker runs herself, mostly from her phone.
- Client
- Vivi's Cakery
- Sector
- Bakery (made-to-order celebration cakes)
- Cakes on the menu
- 9
- Client change requests shipped and checked live
- 31
- Settings the baker can edit
- 14
- Backup history kept
- 14 daily + 8 weekly
The challenge
- The bakery sells two different ways: set menu cakes at fixed prices, and bespoke cakes that have to be quoted from what the customer describes and the photos they send.
- The site it had was not something the baker could run herself: photos went in by pasting a web address, and the admin password could only be changed on the server.
- The legal pages, robots.txt and sitemap all returned 'page not found', so the site was missing basic information a food business must show and search engines need.
- There was no backup of the customer data anywhere: names, contact details, delivery addresses, order history and the photos customers had sent in.
The screens
Home. The homepage, leading with the Britain's Best Classic Cake 2026 win and a carousel of the menu cakes.
Home. The same homepage on a phone, with the order and bespoke buttons above the fold.
Cake menu. The nine-item menu with prices, the winning cake marked, and photos labelled when they show an example rather than that exact cake.
Cake page and order form. A cake page with its allergen declaration, size options and the order form filled in with demo details, ready to hand off to Stripe (not submitted).
Ordering step. Picking a size, a delivery date and slot, and a Liverpool postcode before paying.
Bespoke quote. The six-step bespoke cake request, here at the flavour step for a demo wedding enquiry (not submitted).
Bespoke quote. The bespoke request on a phone, choosing flavours with a progress bar across the top.
Back office dashboard. The same dashboard on a phone, which is where the baker actually uses it.
Back office dashboard. The baker's dashboard: paid orders not yet started, the order on/off switch, today's cake limit, today's deliveries and recent quotes.
Orders. Active orders filtered by status, with delivery date, total and where each cake is up to.
Order detail. One order: status buttons that update the customer's tracking page, a plain note that refunds are made in Stripe, and the delivery details.
Order detail. The order page on a phone, with the status buttons at the top.
Cake editor. Editing a menu cake: copy, price, visibility, photo upload with alt text, and priced size options.
What we built
Public site and cake menu
A homepage, menu, gallery of past commissions, about and contact pages. Each cake has its own page with sizes, options and an allergen declaration.
Menu ordering with Stripe
The customer picks a size, a delivery date and slot, and a Liverpool postcode, then pays on Stripe's hosted checkout. Card details never touch the bakery's server.
Bespoke quote request
A six-step form where the customer describes the cake and uploads reference photos. The baker sends a quote and the customer pays through a Stripe payment link.
Back office
A dashboard for orders, quotes, cakes and site settings. From it the baker can move an order through its stages, pause ordering, cap how many cakes she takes each day, and edit menu cakes with real photo uploads.
Order tracking
Customers follow their order on a public tracking page. It uses a private code, not the order number, which would be easy to guess.
Hosting, deploys and backups
The site runs in Docker behind Caddy. GitHub Actions checks, builds and deploys every change. The database and uploaded photos are backed up every night, encrypted, and a restore has been tested.
What it does
Built with
- Next.js 16
- React 19
- TypeScript
- PostgreSQL 16
- Drizzle ORM
- Auth.js
- Stripe Checkout and webhooks
- Resend
- Tailwind CSS v4
- Vitest
- Playwright
- Docker
- Caddy
- GitHub Actions
- Card payment through Stripe Checkout, confirmed by webhook
- Bespoke quote requests with reference photo uploads, visible only to a signed-in admin
- Order on/off switch and a daily cake limit
- Status buttons that update the customer's tracking page
- Fourteen site settings the baker can edit, including contact details, without a new deploy
- Photo upload with alt text and priced size options in the cake editor
- A made-to-order note on every menu cake, and photos labelled when they show an example rather than that exact cake
- Search-friendly product and bakery data, with no invented reviews or ratings
- A deploy check that stops the site going out without the trader details a consumer site must show
- Nightly encrypted backups of the database and customer photos, with a tested restore
The site is live at viviscakery.co.uk and has been handed over to the client, with the complete source code and a self-hosting guide, which she owns outright.
All 31 changes the client asked for during the handover were shipped and checked on the live site.
The site was once taken off its server and restored from an off-site copy with its customer data intact. It now has nightly encrypted backups, and a restore has been tested.
It is now in maintenance only: changes are limited to fixing real problems.
Want something like this?
Tell us about your business and what you need. We will reply with honest questions, then a written proposal.
