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.

AnbieterAdresseEreignisse
Polar…/webhook/polarorder.paid, order.refunded
Stripe…/webhook/stripecheckout.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.