Zum Hauptinhalt springen

Rechnungsstellung

[billing] [admin]

Stripe-Connect-basierte Abrechnung — licensio = Plattform, Anbieter = Connected Accounts. Pauschale Plattformgebühr: 10 % in der Beta (resolveProvisionPercent, pro Anbieter übersteuerbar — siehe Zugang & Konditionen). Stripe Tax automatisch.

Für wen​

Admins. Der Tab "Rechnungsstellung" sammelt alle Daten, die Stripe für korrekte Rechnungen, MwSt, Zahlungs-Abwicklung braucht.

Was du einstellst​

Rechtlicher Name + Rechtsform​

  • z.B. "Plant Technology GmbH"
  • Wird in Stripe als business_profile.name gesetzt
  • Erscheint auf jeder Rechnung als Absender

Adresse​

  • Straße, PLZ, Stadt, Land
  • Wird in Stripe als company.address versucht zu setzen (Express-Accounts akzeptieren das oft nur via Onboarding)

Steuer​

  • USt-ID — wird zu Stripe-tax_ids hinzugefügt
  • Steuernummer — informativ, auf Rechnungen abgedruckt
  • Stripe Tax muss separat im Stripe-Dashboard aktiviert werden (Tab Tax → Automatic Tax ON)

Kontakt​

  • E-Mail (für Stripe-Mails)
  • Telefonnummer

Eigenes Logo das auf Stripe-Rechnungen erscheint. Upload via:

  1. licensio-Storage (für Vorschau im Admin)
  2. Stripe Files API mit purpose: 'business_icon'
  3. accounts.update auf Connected Account mit settings.branding.logo

Empfohlen: PNG quadratisch, ≥256x256, < 200 KB.

Schritt für Schritt​

1. Stripe-Connect aktivieren​

Einstellungen → Stripe → Account anlegen → Stripe-Onboarding (Express Account). Liefert deine Bankdaten, Person-Verifikation etc.

2. Rechnungsstellung-Tab füllen​

Alle Felder ausfüllen + Logo hochladen. Speichern triggert automatisch Stripe-Sync (best-effort).

3. Stripe Tax im Dashboard aktivieren​

  • dashboard.stripe.com → Tax → Settings
  • Automatic Tax auf ON
  • Tax registrations → Deutschland hinzufügen
  • Firmenadresse muss vollständig sein

4. Erstes Paket testen​

Pakete erstellen → bei Speichern wird Stripe-Product + Price erzeugt. Im Stripe-Dashboard sichtbar unter Products des Connected Accounts.

5. Erste Zahlung​

Zwei Pfade, je nachdem wer sie auslöst:

  • Admin-„Freischalten": Die Freischaltung erzeugt immer eine Stripe-send_invoice-Rechnung (14 Tage Fälligkeit, auto_advance, Zahlarten per Preflight aus den Connect-Capabilities des Connected Accounts abgeleitet — card / sepa_debit; keine aktiv → Fehler). Kein Checkout auf dem Admin-Pfad. Der Kunde bleibt pending_payment und wird erst über den invoice.paid-Webhook active.
  • Endkunden-Self-Service (/join): Der Kunde durchläuft den Stripe-Checkout (Subscription für monatliche Pakete oder Single-Charge für einmalige).

Webhook-Events bestätigen die Zahlung in licensio.

Betriebshinweis (PFLICHT pro Anbieter-Stripe-Konto): Stripe-eigenen Rechnungs-/Abo-Mailversand im Stripe-Dashboard abschalten (Einstellungen → Abrechnung → Rechnungen / Abos und E-Mails), sonst erhält der Kunde eine Doppel-Mail. Die licensio-Mail mit dem Hosted-Invoice-Link ist die einzige Kundenmail.

Stripe Tax — Logik​

SenderEmpfängerUSt-IDErgebnis
DEDEbeliebig19 % MwSt
DEEUmit USt-IDReverse Charge 0 %
DEEUohne USt-IDLokaler Satz des Empfängerlandes
DENicht-EUbeliebig0 %

Stripe wendet das automatisch an, wenn automatic_tax: { enabled: true } und tax_behavior: 'exclusive' (Netto-Preise).

Webhook-Events (eingehend)​

Es gibt zwei Stripe-Webhooks mit unterschiedlichen Zwecken — Verwechslung führt zu Signaturfehlern und kaputten Plan-Updates.

Anbieter-Portal-Webhook — /api/stripe/webhook (<slug>.licensio.io)​

Verarbeitet Zahlungen deiner Endkunden (Stripe Connect):

  • checkout.session.completed — Erstzahlung erfolgreich
  • setup_intent.succeeded — Payment-Method gespeichert (Flow B)
  • invoice.paid — wiederkehrende Zahlung
  • invoice.payment_failed — Zahlung gescheitert (Notification + Mahnung)
  • charge.refunded — Erstattung
  • customer.subscription.updated / .deleted — Abo-Lifecycle
  • account.updated — Connected-Account-Status

Secret in ENV: STRIPE_WEBHOOK_SECRET (Portal-Vercel-Projekt).

licensio-Platform-Webhook — /api/stripe/licensio-webhook (admin.licensio.io)​

Verarbeitet deine eigene kostenpflichtige Plan-Subscription bei licensio (ein Upgrade, das später im Admin passiert — die Registrierung selbst ist immer der kostenfreie Zugang):

  • checkout.session.completed — neue kostenpflichtige Plan-Subscription
  • customer.subscription.updated — Plan-Wechsel, Renewals
  • customer.subscription.deleted — Kündigung → Anbieter fällt zurück auf den kostenfreien Zugang (plan = free)
  • invoice.payment_failed — Zahlungsfehler bei deiner Plan-Rechnung

Secret in ENV: LICENSIO_STRIPE_WEBHOOK_SECRET (Admin-Vercel-Projekt). Schreibt direkt in tenants.plan, plan_started_at, licensio_stripe_customer_id, licensio_subscription_id.

Rechnungen im Portal​

Kunden sehen ihre Stripe-Rechnungen direkt im Portal-Account-Tab "Lizenz & Vertrag" → Rechnungen-Kachel mit PDF-Download (über Stripe Invoices API).

Häufige Fragen​

Wie hoch ist die Plattformgebühr? Pauschal 10 % in der Beta (application_fee_percent auf jeder Stripe-Subscription, aufgelöst von resolveProvisionPercent; pro Anbieter via settings.provision_percent übersteuerbar). Der Rest geht an dich. Sichtbar im Stripe-Dashboard als Application Fee. Details: Zugang & Konditionen.

Wer sieht meine Stripe-Daten? Nur du. licensio-Plattform-Admins haben Read-Zugriff für Support-Fälle, aber keine Modifikations-Rechte.

Was wenn der Stripe-Webhook fehlschlägt? Webhook-Endpoint mit STRIPE_WEBHOOK_SECRET validiert Signaturen. Bei Fehler retryt Stripe automatisch (~mehrere Stunden). Fehler-Logs in Vercel-Logs sichtbar.

Kann ich Rechnungen auch ohne Stripe schicken? Aktuell läuft alles über Stripe. Manuelle Rechnungsstellung (PDF generation außerhalb Stripe) ist nicht implementiert.

Reverse Charge bei EU-Kunden — wie? Stripe Tax erkennt EU-USt-IDs automatisch (validiert via VIES). Wenn Kunde im Checkout USt-ID eingibt, wird Reverse Charge angewandt. tax_id_collection ist in unseren Checkouts aktiviert.

Verwandt​