Onlineshop für personalisierte PDF-Urkunden mit Stripe-Zahlung
scherzurkunden.de: ein PDF-Shop, der seine Zahlen nachrechnet
- Zeitraum
- –
- Auftraggeber
- Eigenes Produkt
- Website
- scherzurkunden.de
Kennzahlen
- Produkte: 19 Urkunden und 4 Gutscheine
- 23
- Artisan-Kommandos statt eigener Admin-Oberfläche
- 26
- automatisierte Tests, grün in der Pipeline
- 456
Kontext
scherzurkunden.de verkauft personalisierte Scherzurkunden als PDF — Ablassbriefe, Adelsbriefe, Heldenurkunden und Narrenlizenzen, dazu Gutscheine. Der Shop ist mein eigenes Produkt. Ich habe ihn von August bis Oktober 2026 mit Laravel gebaut, durchgehend mit KI-Unterstützung: Alle 84 Commits tragen Claude als Co-Autor.
Problem
Ein Shop für ein Scherzprodukt hat ernste Pflichten. Er nimmt echtes Geld an, muss bei Unstimmigkeiten korrekt erstatten und darf keine Urkunde ausliefern, deren Text über den Rand läuft. Gleichzeitig ist es ein Ein-Personen-Betrieb: Jede Verwaltungsoberfläche wäre eine weitere Angriffsfläche, die gepflegt werden muss.
Lösung
Breite statt Zeichenzahl
Ob ein Name auf die Urkunde passt, hängt nicht an der Zahl der Zeichen, sondern an ihrer Breite: In der Hausschrift braucht eine Zeile aus Großbuchstaben rund anderthalbmal so viel Platz wie gleich viele Kleinbuchstaben. Der Shop liest deshalb die echten Zeichenbreiten aus denselben Schriftdateien, die ins PDF eingebettet werden, und wählt die größte Schriftgröße, die passt. Das Bestellformular prüft mit derselben Rechnung — was das Formular annimmt, passt auch ins PDF.
Zahlungen werden nachgerechnet
Bevor eine Urkunde erzeugt wird, prüft der Shop die Zahlung gegen eine einfache Gleichung: Zwischensumme gleich Bestellpreis, Rabatt nicht negativ, Endbetrag gleich Zwischensumme minus Rabatt. Stimmt etwas davon nicht, wird die Bestellung abgelehnt und die Erstattung automatisch ausgelöst.
Betrieb über Kommandos statt Admin-Oberfläche
Es gibt keine eigene Admin-Seite. Sperren, erneuter Versand, Gutscheinverwaltung, Bewertungsmoderation und Löschungen laufen über 26 Artisan-Kommandos auf dem Server; neun davon laufen zeitgesteuert. Geldbewegungen wie Erstattungen erledige ich im Dashboard des Zahlungsanbieters. Was nicht im Web erreichbar ist, muss dort auch nicht abgesichert werden.
Echtheit zum Nachprüfen
Jede Urkunde trägt eine Nummer, einen Prüfcode und einen QR-Code. Über eine öffentliche Prüfseite lässt sich jede Urkunde anhand ihres Prüfcodes nachschlagen. Eine Sperrliste erkennt auch Umgehungsversuche mit ähnlich aussehenden Zeichen.
Stack
| Komponente | Technologie |
|---|---|
| Framework | Laravel 13, PHP 8.4 |
| Zahlung | Stripe Checkout mit Webhooks |
| dompdf, QR-Codes, eigenes Layout nach Zeichenbreite | |
| Oberfläche | Blade, Alpine.js, Tailwind CSS 4 |
| Betrieb | 26 Artisan-Kommandos, davon neun zeitgesteuert |
| Tests | PHPUnit, PHPStan Level 5; Playwright mit axe-core lokal vor Releases |
Ergebnis
- 23 Produkte: 19 Urkunden mit Live-Vorschau und vier Gutscheine
- Layout nach echter Zeichenbreite: Was nicht passt, nimmt das Formular gar nicht erst an
- Jede Zahlung nachgerechnet, bei Abweichung wird die Erstattung automatisch ausgelöst
- Keine eigene Admin-Oberfläche: Betrieb über 26 Kommandos
- 456 automatisierte Tests, grün in der Pipeline des ausgelieferten Stands
Was es nicht leistet: Es gibt keine Benutzerkonten. Wer eine Bestellung wiederfinden will, gibt seine E-Mail-Adresse ein und bekommt die Links per Mail.
Was ich daraus gelernt habe
Die beste Admin-Oberfläche für einen kleinen Shop war keine. Jede Verwaltungsaufgabe als Kommando zu bauen hat mich gezwungen, sie genau zu benennen — und die Frage, wie man eine Admin-Seite absichert, hat sich gar nicht erst gestellt.
Mit KI-Unterstützung erstellt und vom Autor geprüft.
Firmenprojekt? Projekte für Unternehmen laufen über twentyonepixels — dort gibt es Leistungen, Konditionen und Referenzen. twentyonepixels.de