Zum Inhalt springen
Elyes FerchichiWebdesign Bremen
PrototypGastronomie (Pizzeria, Lieferung & Abholung) · Bremen, Horn-Lehe (fiktiver Betrieb)

Pizza Blitz – Website mit eigenem Bestellsystem (Stripe → Kasse → Telegram)

Pizza Blitz ist ein fiktiver Lieferdienst, an dem ich zeige, wie ein eigenes Bestellsystem ohne Lieferplattform funktioniert. Die Website nimmt Bestellungen entgegen, kassiert per Stripe, bereitet den Datensatz für die WinOrder-Kasse auf und meldet jede Bestellung per Telegram. Die komplette Kette ist mit Testkarte durchgetestet.

Zeitraum
Sommer 2026
Status
Online als Prototyp – Zahlung im Stripe-Testmodus, noindex
Art
Prototyp, fiktiver Betrieb
Branche
Gastronomie / Lieferdienst
Umfang
One-Pager + Impressum/Datenschutz + Bestell-Backend
Technik
HTML/CSS/JS, GSAP, Cloudflare Worker + KV, Stripe Checkout

Prototyp: funktionsfähig gebaut und getestet, aber kein Auftrag eines zahlenden Kunden. Zahlungen laufen im Testmodus.

Startseite von Pizza Blitz Bremen mit Hero, Speisekarte und geöffnetem Warenkorb – Desktop- und Handyansicht
Im Rahmen scrollen, um die ganze Seite zu sehenpizzablitz.elyesferchichi.com
Startseite von Pizza Blitz Bremen mit Hero, Speisekarte und geöffnetem Warenkorb – Desktop- und Handyansicht – Handyansicht
Mobilansicht

Ausgangslage

Viele Pizzerien zahlen bei jeder Bestellung über Lieferplattformen eine Provision und bekommen dafür nicht einmal die Kundendaten. Ich wollte zeigen, dass ein eigenes Bestellsystem für einen kleinen Betrieb machbar ist – ohne eigenen Server, ohne monatliche Softwaremiete und ohne Abhängigkeit von einer Plattform. Mehr dazu unter Online-Bestellsystem.

Der Ausgangspunkt war ein exportiertes Website-Bundle aus einem Baukasten: eine proprietäre Laufzeitumgebung, die sich nicht sauber bearbeiten ließ. Statt daran herumzuflicken, habe ich die Seite komplett als echtes HTML, CSS und JavaScript neu gebaut – mit Speisekarte, Warenkorb und Kasse als festem Bestandteil.

Wichtig war mir, dass die Bestellung nicht in einer E-Mail endet, sondern dort landet, wo die Küche arbeitet: in der Kasse. Deshalb bereitet das Backend jede bezahlte Bestellung als Datensatz für WinOrder auf, ein in der Gastronomie verbreitetes Kassensystem. Das gleiche Prinzip nutze ich beim Antepli-Konzept – dort mit Küchen-Ticket statt Kasse.

Ziele

6 Ziele, an denen sich das Projekt messen lässt
  • Bestellungen ohne Plattform-Provision direkt über die eigene Website annehmen
  • Zahlung sicher abwickeln – der Server rechnet die Preise, nicht der Browser
  • Bezahlte Bestellungen automatisch für die WinOrder-Kasse aufbereiten
  • Sofortige Benachrichtigung des Betriebs per Telegram
  • Öffnungszeiten und Annahmeschluss technisch erzwingen, nicht nur anzeigen
  • Schnelle, barrierearme Seite, die auch am Handy Lust auf Bestellen macht

Lösung

Was gebaut wurde – Baustein für Baustein
Teller mit Besteck

One-Pager mit klarer Bestellführung

Hero, Highlights, „In drei Schritten zur heißen Pizza“, Speisekarte, Über uns, Bestell-Tracker, Bewertungen und Kontakt – alles auf einer Seite, der Warenkorb ist von überall erreichbar.

Paket mit Einkaufstasche

Warenkorb mit Persistenz

Der Warenkorb liegt im localStorage und übersteht Seitenwechsel und Reloads. Mengen, Zwischensumme und Lieferart werden direkt im Warenkorb gepflegt.

Vorhängeschloss

Kasse über Stripe Checkout

Die Kasse öffnet ein Formular mit Kontakt- und Lieferdaten und leitet zu Stripe Checkout weiter. Nach der Zahlung kommt der Gast auf einen Bezahlt-Screen mit Bestellnummer und Artikelliste zurück.

Schild mit Stern

Server als Preiswahrheit

Preise und Öffnungszeiten liegen in einer Menü-Datei auf dem Worker. Der Browser schickt nur Artikel-IDs und Mengen; der Server rechnet alles neu. Manipulierte Preise sind damit ausgeschlossen.

Blitz

Webhook → WinOrder-Datensatz → Telegram

Stripe meldet die Zahlung an einen Webhook mit HMAC-Signaturprüfung. Erst dann wird die Bestellung als bezahlt markiert, als WinOrder-Datensatz im KV abgelegt und per Telegram gemeldet.

Sanduhr

Blitz-Tracker mit Zeitlogik

Ein Bestell-Tracker zeigt den Status und eine geschätzte Zeit (Lieferung 35 Minuten, Abholung 20 Minuten). Unbezahlte Bestellungen werden abgewiesen; bei einer frischen Bestellung wartet der Tracker kurz auf den Webhook.

Klemmbrett mit Haken

Öffnungszeiten erzwungen

Außerhalb der Öffnungszeiten heißt der Button „Geschlossen“, und der Server lehnt Bestellungen ab. 15 Minuten vor Schluss ist Annahmeschluss – in Bremer Zeit, unabhängig von der Uhr des Gastes.

Balkendiagramm mit Pfeil nach oben

Shop-Funnel-Analytics

Über mein eigenes Analytics-System werden product_view, add_to_cart, checkout_start, begin_payment und purchase gezählt – nur nach Einwilligung, ohne Google.

Design

Die Farbwelt ist bewusst appetitlich und laut: ein sattes Rot für Aktionen, ein warmes Gelb als Akzent und ein cremefarbener Hintergrund statt kaltem Weiß. Für Text auf Creme habe ich die Rot- und Grüntöne nachjustiert, bis der Kontrast WCAG-sicher war.

Typografisch trifft die Source Serif 4 in Überschriften auf die Instrument Sans im Lauftext. Die Serife bringt Handwerk und „seit 1990“ ins Bild, die Grotesk hält Speisekarte, Preise und Formulare gut lesbar. Beide Schriften sind self-hosted.

Die Bewegung kommt von GSAP mit ScrollTrigger: Sektionen gleiten beim Scrollen ein, der Warenkorb rutscht als Schublade herein. Wer reduzierte Bewegung eingestellt hat, sieht alles sofort und ohne Animation.

Technik

9 Bausteine – und warum genau diese
Vanilla HTML/CSS/JS

Kein Framework, kein Build-Schritt – die Seite lädt schnell und bleibt jahrelang wartbar.

Cloudflare Worker + KV

Bestellungen ohne eigenen Server, kostenlos im Free-Plan; Bestelldaten liegen 14 Tage im KV und verfallen dann automatisch.

Stripe Checkout + Webhook

Zahlung auf einer gehosteten Stripe-Seite (kein Kartenkontakt auf der eigenen Website); der Webhook bestätigt die Zahlung serverseitig mit HMAC-Signatur.

WinOrder-Aufbereitung

Bezahlte Bestellungen werden als Datensatz für das Kassensystem abgelegt – die Übergabe in die Küche ist vorbereitet.

Telegram Bot API

Jede Bestellung landet sofort als Nachricht auf dem Handy des Betriebs – ohne App-Entwicklung.

Origin-Härtung

Der Checkout-Endpunkt antwortet nur der eigenen Domain; fremde Aufrufe bekommen 403.

GSAP + ScrollTrigger (self-hosted)

Weiche Scroll-Animationen ohne externe Requests; lokal ausgeliefert statt vom CDN.

WebP-Bilder

Fotos von rund 2 MB auf rund 400 KB je Bild gebracht – etwa 80 Prozent kleiner bei gleicher Optik.

Eigener Consent-Tracker

Shop-Funnel und Leads messen, DSGVO-konform und ohne Google Analytics.

Antippen zeigt, warum ich mich dafür entschieden habe.

SEO

5
  • Meta-Title und Description mit Ort, Angebot und Aufforderung („Jetzt bestellen“)
  • JSON-LD vom Typ Restaurant mit Adresse, Geokoordinaten und Öffnungszeiten
  • Sitemap und robots.txt vorhanden, OG-Bild für Messenger und Social Media
  • Bewusst noindex: Es ist ein fiktiver Betrieb – er soll bei Google nicht mit echten Pizzerien konkurrieren. Vor einem echten Live-Gang wird das entfernt.
  • Saubere Überschriften-Hierarchie und sprechende Sektions-IDs für Ankerlinks

Barrierefreiheit

5
  • Kontraste nach WCAG geprüft und Farbtöne für Text auf Creme angepasst
  • Alle Touch-Ziele mindestens 44 Pixel, Eingabefelder 16 Pixel (kein Zoom-Sprung auf iOS)
  • Skip-Link zum Inhalt; Dialoge (Warenkorb, Kasse, Bestätigung) setzen inert und aria-hidden auf den Hintergrund
  • Emojis durch Inline-SVG ersetzt, damit Screenreader nichts Sinnloses vorlesen
  • Animationen respektieren prefers-reduced-motion

Datenschutz

5
  • Schriften und GSAP self-hosted – keine Verbindung zu Google Fonts oder CDNs
  • Google Maps nur per Zwei-Klick: die Karte lädt erst nach aktiver Zustimmung
  • Consent-Dialog im Markenlook; Messung erst nach Einwilligung
  • Kartendaten bleiben bei Stripe – die Website sieht keine Kartennummern
  • Bestelldaten verfallen nach 14 Tagen automatisch; Kontaktformular geht per Worker an Telegram, nicht an Formspree

Performance

Gemessen am 16. September 2026, mobil (simulierte 4G-Drosselung) mit Lighthouse.
LCP6,5 sLargest Contentful Paint
CLS0,110Layout-Verschiebung
TBT200 msBlockierzeit
Gewicht1636 KBÜbertragene Daten
Bildgewicht
~2 MB → ~400 KB je FotoWebP, etwa 80 Prozent kleiner
Fonts
self-hosted, 0 externe Requests8 WOFF2-Dateien
Animation
GSAP lokal statt vom CDNkeine Drittserver-Abhängigkeit
Backend
Cloudflare-Edgekein eigener Server, kein Kaltstart

Der Lighthouse-SEO-Wert ist hier bewusst reduziert: Die Seite trägt „noindex", weil sie als Konzept bzw. privates Projekt nicht in Suchmaschinen erscheinen soll. Alle übrigen SEO-Prüfungen bestehen.

Der Performance-Wert liegt unter meinem Ziel von 80. Die Messung ist echt und bleibt hier stehen, bis die Optimierung (Bildgrößen, Ladereihenfolge) umgesetzt und neu gemessen ist.

Ablauf

6 Schritte von der Idee bis online
  1. Analyse des Bundles

    Das exportierte Baukasten-Bundle war nicht editierbar. Entscheidung: Neuaufbau in sauberem HTML/CSS/JS.

  2. Seite neu bauen

    Struktur, Speisekarte und Warenkorb im Frontend; Fotos zu WebP, Fonts und GSAP lokal eingebunden.

  3. Backend auf Cloudflare

    Worker mit Menü als Preiswahrheit, KV-Speicher, Öffnungszeiten-Logik und Origin-Härtung.

  4. Stripe anbinden

    Checkout-Session, Webhook mit Signaturprüfung, Bezahlt-Screen mit Bestellnummer.

  5. WinOrder + Telegram

    Bezahlte Bestellung als Kassen-Datensatz ablegen und den Betrieb sofort benachrichtigen.

  6. Audit und Test

    WCAG-Kontraste, Touch-Ziele, Dialog-Fokus; komplette Bestellkette mit Testkarte durchgespielt.

Ergebnis

Was am Ende belegbar dasteht
  • Kette Zahlung → Webhook → WinOrder-Datensatz → Telegram mit Stripe-Testkarte erfolgreich durchgetestet
  • Bildgewicht um rund 80 Prozent reduziert (WebP)
  • Keine externen Requests für Fonts oder Animationen; Maps nur nach Klick
  • Shop-Funnel wird im eigenen Analytics-Dashboard als eigenes Panel ausgewertet
  • Für den Echtbetrieb fehlen nur noch Live-Keys, echte Artikelnummern und der WinOrder-Zustellweg

Learnings

Was ich mitnehme
  1. Preise gehören auf den Server. Sobald der Browser rechnet, ist jede Bestellung manipulierbar.

  2. Der Webhook kommt manchmal später an als der Gast zurück auf der Seite ist – der Tracker braucht eine kurze Warteschleife statt einer Fehlermeldung.

  3. Öffnungszeiten müssen an zwei Stellen gepflegt werden (Frontend und Server). Das ist ein Wartungsrisiko, das ich beim nächsten System zentralisiere.

  4. Ein Baukasten-Export ist keine Basis. Neu bauen war schneller als reparieren.

Fragen zum Projekt

Häufige Fragen

Kann ich so ein Bestellsystem für mein Restaurant bekommen?

Ja. Der Aufbau ist übertragbar: Website mit Speisekarte und Warenkorb, Zahlung über Stripe, Benachrichtigung per Telegram oder E-Mail. Die Details besprechen wir persönlich – siehe Online-Bestellsystem.

Fallen laufende Kosten für das Bestellsystem an?

Das Backend läuft auf Cloudflare im kostenlosen Tarif. Stripe berechnet pro Zahlung eine Transaktionsgebühr, aber keine Provision auf den Bestellwert wie Lieferplattformen.

Funktioniert das auch mit einer anderen Kasse als WinOrder?

Die Bestellung liegt als strukturierter Datensatz vor. Die Übergabe lässt sich an jedes Kassensystem anpassen, das Bestellungen per E-Mail, API oder Datei entgegennimmt.

Ist Pizza Blitz ein echter Kunde?

Nein. Pizza Blitz ist ein fiktiver Betrieb, den ich als Prototyp gebaut habe. Die Zahlung läuft im Stripe-Testmodus – es wird nichts wirklich abgebucht.

Ähnliches Projekt?

Sie brauchen so etwas für Ihren Betrieb?

Schreiben Sie mir, was Sie vorhaben. Ich sage Ihnen ehrlich, was sinnvoll ist, und nenne einen Festpreis.