Waitrose have run a food and drink festival every year since 2016: ticketed masterclasses, chef demos, supplier showcases, all anchored on a live in-person event. We built the platform that year and we’ve kept it running through every edition since.
The hard parts aren’t where you’d expect. Ticket pages and chef bios are straightforward. Capacity is hard. Each session has a fixed cap, hundreds of people try to book at once, baskets time out if they don’t check out within a window, and waitlists fill the gaps as cancellations come in. The site has to keep all of that consistent under launch-day load.
The other hard part is the in-person bit. Door staff scan QR-coded tickets on phones in a building where the WiFi isn’t always cooperating. We built the check-in flow as an offline-first progressive web app. Scans queue locally, sync when there’s signal, no one gets stuck at the gate. The backend supports it with rate-limited bulk sync endpoints and a fairly defensive view of “did this ticket already get scanned”.
The stack has shifted across years. The original build was Laravel-only with server-rendered Blade templates; today the API stays in Laravel and the customer-facing frontend is a Nuxt PWA, with editorial content coming out of a headless CMS. The relationship has carried through every year’s edition, and each year’s a bit smoother than the last.