Heftli
Rechnungs-SaaS für Freelancer und Schweizer KMU
- Alleiniger Designer, Entwickler und Betreiber
- Januar 2026
- TypeScript, React, Supabase, Stripe, PostgreSQL

Das Problem
Schweizer Freelancer und kleine Unternehmen müssen QR-Rechnungen ausstellen, einen nationalen Standard mit strengen Formatregeln, den die meisten internationalen Rechnungstools entweder gar nicht oder nur schlecht unterstützen. Die Alternativen waren Konzern-Buchhaltungssuiten mit Setup-Aufwand in Tagen, oder Tabellen.
Ich wollte etwas, das QR-Rechnung nativ abbildet, Zeit gegen Kunden erfasst und keine Buchhaltungskenntnisse voraussetzt.
Architektur
Multi-Tenant vom ersten Commit an
Tenancy nachzurüsten ist teuer. Deshalb kamen Row-Level Security und Tenant-Scoping vor dem ersten Feature. Supabase liefert die Postgres-Schicht und Auth. Jede Query läuft unter einer RLS-Policy, damit ein Tenancy-Bug in der Anwendung keine Daten über Account-Grenzen hinweg preisgeben kann. Die Anwendung startete auf Cloudflare Workers. Ich habe sie auf DigitalOcean migriert, damit sie nicht an die Runtime eines einzelnen Anbieters gebunden ist.
Stripe übernimmt Subscriptions mit Webhook-Reconciliation. Die Anwendung leitet den Billing-State aus Stripe ab, statt ihn zu spiegeln. Das beseitigt eine ganze Klasse von Drift-Bugs.
Der QR-Rechnungs-Generator ist ein eigenständiges Modul, das schweizerische Zahlungsteile erzeugt und gegen die Spezifikation validiert wird, nicht gegen Sample-Output.
- Mandantentrennung per Row-Level Security in Postgres
- Stripe als Source of Truth für den Billing-State
- Background Jobs für Reconciliation und geplante Rechnungen
- Migrationen in CI gegen ein production-ähnliches Dataset
Betrieb
Eine Person, jede Schicht
Es gibt kein Team. Ich schreibe die Migrationen, kümmere mich um Sonderfälle bei fehlgeschlagenen Zahlungen, überwache die Background Worker, beantworte Support-Mails und liefere das Frontend aus.
Diese Einschränkung hat die Architektur stärker geprägt als jede Vorliebe. Was regelmässig Handarbeit braucht, wurde automatisiert oder entfernt, weil es niemanden gibt, dem ich es übergeben kann. Das System muss langweilig genug sein, um es eine Woche in Ruhe zu lassen.
Kontakt
Kontakt aufnehmen
Senden Sie mir eine Nachricht für einen ersten Austausch oder schreiben Sie mir direkt eine E-Mail.
Kontakt