Food & hospitality · Halal meal prep & catering · Case study
A complete halal meal-prep and catering platform, built to own local search from Leeds to Teesside
Perfect Prep: a static halal meal-prep and catering site with 29 postcode pages, five catering verticals, town landing pages, and full local-SEO schema.
- Astro 5 (static output)
- Cloudflare → Vercel delivery, London (lhr1) region-pinned
- sharp image pipeline
- Self-hosted Fredoka + Nunito Sans (variable fonts)
- JSON-LD: Restaurant/Menu/MenuItem, Service, LocalBusiness, FoodEstablishment, FAQPage, Breadcrumb, Article
- Build-time hand-rolled sitemap with per-route priority + changefreq
- Web3Forms static enquiry form (no backend)
- Hardened CSP + HSTS-preload + COOP/CORP, RFC 9116 security.txt
Perfect Prep is a family-run, 100% halal meal-prep and catering business, cooking fresh across Yorkshire and Teesside. Weekly meal prep goes out every Sunday, and the same kitchen caters parties, BBQs, events and music-video shoots, from 10 to 300 covers. The food was already excellent and the demand was already there. What it did not have was anywhere for a Google search to land. The brief was to turn a one-line Instagram presence into a real platform: something that ranks locally, reads beautifully on a phone, explains the halal sourcing properly, and funnels every visitor into a single, low-friction ordering conversation.
This is a project we own the whole of, brand through build, so this write-up can be specific about how it is put together.
The challenge: great food trapped inside an Instagram profile
The demand was real, but it all lived inside a single Instagram account. There was nowhere to land a Google search, no per-area pages for the towns the kitchen actually delivers to, no menu that a search engine could read rather than a caption it could not, and no separate home for the catering side, which is a different buyer asking a different question. Someone booking a 200-cover wedding is not the person ordering Sunday meal prep, and sending both to the same page loses both.
The job, then, was a website that does the selling in the gap between the post and the DM: get found on local search, answer the practical questions (areas, delivery, halal sourcing, pricing) before they arrive as messages, and hand a warmed-up visitor to Instagram to confirm the order.
The approach: build for local search from the data up
Local search is the whole game for a delivery kitchen, so the site is architected around it rather than having SEO bolted on afterwards. The area network, the menu, the catering pages and the sitemap are all driven from typed data files, so the structure that Google reads is generated, consistent, and cheap to extend. Adding a postcode or a town is appending one entry, and a fully-formed, schema-marked, indexable page appears with no loose ends and no orphaned links.
That data-first spine is what lets a small kitchen compete for “halal meal prep [area]” and “halal catering [town]” across a whole delivery footprint, not just its home postcode, without spinning up thin, duplicated doorway pages.
What we built
A food-forward storefront. A warm, playful brand built around butter-cream surfaces, vivid terracotta, herb-green and sun-yellow, a custom chef mascot, the rounded Fredoka display face over Nunito Sans body, chunky tactile buttons, and an app-style bottom tab bar on mobile so the site feels like an app rather than a brochure. The home page leads with the week’s menu and a plain how-it-works.
A readable, structured menu. A weekly menu page plus a dedicated page per dish, marked up with Restaurant, Menu and MenuItem structured data, and backed by a shared allergens page, so the dishes are eligible to surface as rich results instead of being buried in an image caption.
Five catering verticals, each its own page. Parties, events, BBQs, music-videos and linkups are separate landing pages carrying Service and breadcrumb schema, because each is a distinct buyer with a distinct question, and none should land on a generic page.
Town-tailored catering pages on top of the verticals. A second data-driven tree generates “halal catering in [town]” pages at /catering/[area], nine towns at launch, deliberately slugged so they never collide with the five core verticals. Each is written for the real town, not a find-and-replace of the name.
29 postcode area pages, Leeds to Teesside. One honest landing page per area, each with LocalBusiness schema and a correct areaServed, anchored to a real local hook and written for the actual neighbourhood and its delivery reality. Coverage is labelled honestly per area, core, outer, or catering-only, because a wrong promise on a delivery page kills the conversion it was built to win.
Use-case landing pages for the high-intent searches. Dedicated pages for halal wedding catering, office lunch catering, Ramadan meal prep, and halal meal prep for athletes, each targeting a specific search the kitchen can genuinely serve, rather than hoping the home page ranks for everything.
The practical pages that close the sale. A dedicated halal sourcing-and-cooking page, plus pricing, delivery and FAQ, so the questions that usually arrive as DMs are answered before the DM is sent.
A journal and the brand extras. A Markdown journal with Article schema for recipes and halal food writing, plus about, refer-a-friend and newsletter pages.
Built to get found, and built to prove it
Every route that matters carries the right structured data: Restaurant, Menu and MenuItem on the food; Service on catering; LocalBusiness and FoodEstablishment with opening hours and a Yorkshire-and-Teesside service area; FAQPage, Breadcrumb and Article across the supporting content. That is eight-plus distinct schema types, all generated from shared helpers so they stay correct as content grows.
Underneath, the sitemap is hand-rolled and generated at build time. Rather than accept the generic output of a sitemap plugin, the site emits a single sitemap with per-route priority and changefreq, ranked by conversion weight, and reads the area and catering data files directly so new pages are never missed and stale ones never linger. robots.txt and the canonical <link> both point at it. The result is a crawl surface that describes the intent of the site precisely, not just its file tree.
Fast, accessible, and hardened
- Static and self-hosted. The whole site is a static Astro 5 build, delivered through Cloudflare in front of Vercel and region-pinned to London (lhr1), with the
sharppipeline handling images and fonts and icons served from origin. There is no Google font CDN and no server runtime slowing the first paint. - No cookie-based tracking. There are no cookie trackers and no ad networks. The only analytics is Cloudflare’s cookieless, no-PII beacon, and it renders only when a token is configured, so the site needs no consent banner and stays clean until it is switched on.
- Accessible by default. WCAG-AA contrast, 44px tap targets, visible focus states, and reduced-motion respected. A food site that is a pleasure to use on the bus is a food site that converts.
- Hardened. A strict Content-Security-Policy, HSTS with preload, cross-origin isolation (COOP/CORP),
X-Frame-Options: DENY, and a locked-downPermissions-Policy, with a published RFC 9116security.txt. The full posture is documented in the project’s own security audit.
The ordering flow, and the outcome
The kitchen takes orders by Instagram DM, moving to WhatsApp as the line goes live, and the whole site is built to feed that rather than fight it. Every page routes the visitor to message the meals they want, or their headcount for catering, plus a delivery postcode. The catering side also carries a fully static enquiry form, posting straight to an inbox with no backend and no database, that falls back to an Instagram DM link whenever a key is not configured, so the page is never broken. The total and the Sunday slot are confirmed in the message, and payment is on confirmation, with no upfront commitment. The website does the qualifying so the conversation starts warm.
We will not dress this up with numbers we do not have. The platform is live and complete: the brand, the menu system, the catering and town pages, the 29-area local network, the use-case landing pages, the schema and the hardened, accessible build all exist and all connect. As the business grows, new dishes, new towns, new postcodes and the move to WhatsApp ordering slot straight into the data-driven system that is already there, without a rebuild.
Why us
Perfect Prep got a complete, expertly built platform from one accountable team: brand, build, menu system, catering pages, local-SEO area network, schema, performance, accessibility and security, all in-house and all connected. The same team that designed it can keep running it, so the roadmap is owned rather than a one-off drop.
If you run a food, delivery or catering business that is living inside an Instagram profile and losing local search to bigger names, get in touch. We will talk before we quote.