Headless is not a buzzword; it is a decision with consequences. For CAVA I deliberately split the shop into two halves: what the customer sees, and what handles orders, tax and inventory. That split costs more up front — and pays back every day afterwards.
Two halves, cleanly separated
CAVA runs on a headless architecture. The frontend is a Next.js 14 project on Vercel. The backend is Shopware 6.7.9 on German servers. The two talk over an API, but otherwise live apart.
The commerce logic stays entirely in Shopware: the catalogue of around 316 products across wines, spirits, olive oil and delicatessen, the cart, the checkout and the tax calculation. These are things you should not reinvent — Shopware does them correctly and verifiably. The storefront, on the other hand — everything the customer sees and touches — is rebuilt in Next.js.
Why headless for a small merchant
The honest answer has three parts. First, performance: a custom frontend ships only what each page actually needs — no theme ballast, no code for features that page never uses. A product page loads like a product page, not like an entire shop system.
Second, flexibility: the design is not hostage to a theme system. When CAVA needs six languages, a Weinland map and an AI sommelier, I build them — I do not bend a foreign template until it roughly fits.
Third, ownership: the brand is not trapped inside a template someone else controls. What makes CAVA look like CAVA belongs to CAVA. A third-party theme update cannot change the look overnight.
What it costs — and who it is worth it for
Headless is more work up front. Instead of installing a finished theme, you build the storefront. That is real effort, and I say so plainly, because it is not the right choice for every shop.
For CAVA it was the right one. A wine house with 316 products, six languages and the ambition to stand next to larger houses needs a frontend that grows with it rather than holds it back. The extra work at the start is an investment in speed, control and independence — and that pays off every day after.
The pipeline that keeps 316 products clean
A catalogue this size does not stay tidy on its own. Behind CAVA runs a product-enrichment pipeline that works in the background: it fills in and normalises product data, so unit price, alcohol by volume, region and description appear consistently on every page.
Those background jobs run on BullMQ. They process products in a queue rather than making a page wait — the customer never notices work happening in the engine room. New or changed products are enriched and written back, without anyone hand-maintaining 316 records.
The rest of the engine room
Email runs through Resend — order confirmations and notifications over a service built for deliverability. Analytics is Vercel Analytics, cookieless by design: I can see which pages work without following visitors through tracking cookies.
Payment is Vorkasse — bank transfer — per the AGB. The architecture is kept deliberately lean: few building blocks, each with a clear purpose. That is exactly what makes it maintainable — and what makes CAVA fast.
The architecture at a glance
- Frontend: Next.js 14 on Vercel
- Backend: Shopware 6.7.9 on German servers
- Headless: catalogue, cart, checkout and tax stay in Shopware
- Enrichment: background jobs on BullMQ
- Catalogue: around 316 products — wines, spirits, olive oil, delicatessen
- Email: Resend · Analytics: Vercel Analytics (cookieless)
- Payment: Vorkasse / bank transfer per the AGB
- All prices exclude 19% VAT.
— Dimitrios