Schnellstart in etwa 15 Minuten
Von der ZIP-Datei bis zum ersten Testkauf in der Polar-Sandbox. Für Stripe ändern sich nur Schritt 4 und 6.
Du brauchst: Node.js 22, ein Cloudflare-Konto und ein Konto bei Polar (die Sandbox genügt) oder Stripe (Testmodus).
1. Installieren und Tests laufen lassen
ZIP herunterladen, entpacken und im Ordner ausführen:
npm ci --ignore-scripts
npm test
Die Tests laufen vollständig lokal: Die Anbieter-APIs sind nachgebildet, D1 und R2 simuliert Miniflare.
2. Produkt im Katalog beschreiben
In catalog.yaml stehen deine Verkäuferdaten und Produkte. Nur dort aufgeführte SKUs sind kaufbar. Trag unter seller auch die Adressen deines Impressums und deiner Datenschutzerklärung ein (imprint_url, privacy_url); die Bestellseite verlinkt sie, und ohne sie lässt sich kein Produkt aktivieren.
products:
- sku: mein-ebook
project: mein-shop
name: Mein E-Book
price_eur: 19
delivery: [download, license-key]
files:
- key: ebooks/mein-ebook.pdf
source: dateien/mein-ebook.pdf
polar:
product_id: 00000000-0000-0000-0000-000000000000
active: true
Danach npm run catalog ausführen. Der Generator prüft SKU, Preis, Lieferart, Anbieter-IDs und die Links zu den Rechtsseiten und schreibt src/catalog.generated.json.
3. Cloudflare-Zugang anlegen
Im Cloudflare-Dashboard unter Profil → API Tokens einen eigenen Token mit Workers Scripts Edit, D1 Edit und Workers R2 Storage Edit für dein Konto erstellen. Die Account-ID steht in der Adresszeile des Dashboards.
4. Zahlungsanbieter verbinden
Polar: Produkt anlegen und dessen UUID in den Katalog eintragen. Unter Settings → Developers einen Organization Access Token mit checkouts:write und products:read erstellen. Für die Sandbox in wrangler.toml POLAR_API_BASE = "https://sandbox-api.polar.sh" setzen.
Stripe: einen Restricted Key mit Checkout Sessions: Write anlegen. Verkaufst du über Managed Payments, setze im Katalog providers.stripe.managed_payments: true.
5. Erster Deploy
export CLOUDFLARE_API_TOKEN=… CLOUDFLARE_ACCOUNT_ID=…
export POLAR_ACCESS_TOKEN=…
node scripts/deploy.mjs
Das Skript legt D1-Datenbank und R2-Bucket an, spielt die Migrationen ein, deployt den Worker, setzt die Secrets, lädt die Produktdateien hoch, prüft /healthz und nennt am Ende die Webhook-Adresse. Fehlen Zugangsdaten, bricht es ohne Fehler ab und sagt, was fehlt. Hat der Worker noch kein PAY_SECRET, erzeugt es einmalig eins; daraus leitet der Worker alle Schlüssel ab. Bis das Webhook-Secret gesetzt ist, verkauft der Worker nicht.
6. Webhook eintragen
Die Webhook-Adresse steht am Ende der Deploy-Ausgabe.
| Anbieter | Adresse | Ereignisse |
|---|---|---|
| Polar | …/webhook/polar | order.paid, order.refunded |
| Stripe | …/webhook/stripe | checkout.session.completed, checkout.session.async_payment_succeeded, checkout.session.async_payment_failed, charge.refunded, charge.dispute.created |
Das Signing-Secret als POLAR_WEBHOOK_SECRET bzw. STRIPE_WEBHOOK_SECRET exportieren und node scripts/deploy.mjs noch einmal ausführen. Ab jetzt nimmt der Worker Bestellungen an.
7. Kaufknopf einbauen und testen
<a href="https://dein-worker.workers.dev/buy/mein-ebook">Jetzt kaufen – 19,00 €</a>
<p>Endpreis inkl. USt. Verkauf über Polar als Händler (Merchant of Record).</p>
Den passenden Hinweistext liefert GET /price/mein-ebook. Nach einem Testkauf landest du auf der Bestellseite mit Download und Lizenzschlüssel.
Optional: per GitHub Actions
Das Kit enthält .github/workflows/ci.yml: Tests bei jedem Push, Deploy vom Branch main mit Repository-Secrets. Solange Secrets fehlen, endet der Deploy-Schritt grün mit Hinweis.