FIM One bietet eine vollständige Stripe-Billing-Pipeline hinter einem von Administratoren kontrollierten Feature-Flag. Private Deployments ohne Zahlungsanforderungen lassen es deaktiviert und sehen die UI nie. SaaS-Betreiber schalten einen Toggle um und erhalten sofort gehostetes Checkout, Customer Portal, Webhook-gesteuerte Abonnement-Lebenszyklen und Kontingent-Durchsetzung.Documentation Index
Fetch the complete documentation index at: https://docs.fim.ai/llms.txt
Use this file to discover all available pages before exploring further.
Billing ist standardmäßig deaktiviert. Neue Installationen und bestehende Self-Hosts starten beide mit
system_settings.billing_enabled = FALSE. Keine Billing-UI wird angezeigt, bis ein Administrator sie explizit aktiviert.Was Sie erhalten
- Free + Pro Tiers mit monatlichen Token-Kontingenten (Standard: Free 1M / Pro 5M; beide nach Aktivierung anpassbar)
- Stripe-gehosteter Checkout — Benutzer upgraden, ohne dass Ihre Code-Kartendaten berührt
- Customer Portal — Benutzer aktualisieren Zahlungsmethoden, laden Rechnungen herunter, kündigen — alles auf Stripes Benutzeroberfläche
- Webhook-gesteuerte Lebenszyklen — Abonnements werden automatisch bereitgestellt und erneuert; gekündigte Abos werden am Ende des Zeitraums auf Free herabgestuft
- Quota-Durchsetzung — Token-Nutzung pro Zeitraum verfolgt; Unterbrechung im Datenstrom mit strukturierter Upgrade-Aufforderung
- Admin-Seiten für Plan-CRUD und Abonnement-Überwachung
Voraussetzungen
- Stripe-Konto mit aktiviertem Live-Modus. Unternehmen mit Sitz in Singapur müssen KYC abschließen (Business UEN, Ausweis des Geschäftsführers, Bankkonto). Die Genehmigung dauert normalerweise 1–3 Tage.
- Stripe Live API-Schlüssel vom Typ Restricted (empfohlen gegenüber Standard
sk_live_***— einfacher zu widerrufen, begrenzte Berechtigungen). - Webhook-Endpunkt öffentlich erreichbar unter
<your-domain>/api/webhooks/stripe. - Bankkonto für Auszahlungen. Multi-Währungs-Abrechnung (z. B. USD-Auszahlung auf ein USD-Konto) wird für Stripe-Konten ohne USD-Standard empfohlen, um 1,5–2 % Devisenverluste pro Transaktion zu vermeiden.
Einrichtung
1. Stripe Dashboard
Pro-Produkt erstellen
- Catalog → Products → + Add product
- Name:
Pro, description:5M tokens / month, priority support - Pricing: Recurring, monthly, $20.00 USD (adjust to your pricing strategy)
- Save → copy the resulting
price_***ID (you will UPDATE the localbilling_planstable with this value after activation)
Erstellen Sie einen eingeschränkten API-Schlüssel
- Developers → API keys → + Create restricted key
- Name:
fim-one production - Permissions (minimum):
- Customers: Write
- Subscriptions: Write
- Checkout Sessions: Write
- Customer portal: Write
- Prices: Read
- Products: Read
- Save → copy
rk_live_***
Webhook-Endpunkt registrieren
- Developers → Webhooks → + Add endpoint
- URL:
https://<your-domain>/api/webhooks/stripe - Zu empfangende Events:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failed
- Nach dem Speichern auf “Reveal signing secret” klicken →
whsec_***kopieren
Multi-Währungs-Abrechnung konfigurieren (empfohlen)
Wenn sich die Standardwährung Ihres Stripe-Kontos von der Preiswahrung unterscheidet, die Sie berechnen (häufiger Fall: SGD-Konto mit USD-Abrechnung):- Settings → Bank accounts and currencies → Add a settlement currency
- Wählen Sie die Preiswahrung (z. B. USD)
- Fügen Sie das entsprechende Bankkonto an (z. B. ein Aspire USD Virtual Account)
- Speichern — Stripe leitet USD-Gebühren direkt zu USD-Auszahlungen weiter, ohne Devisenumrechnung
2. Backend .env
Legen Sie diese drei Schlüssel in Ihrer Produktions-.env fest:
.env neu, damit die Schlüssel übernommen werden:
3. In Admin aktivieren
- Als Admin anmelden
- Admin → System Settings → Billing
- Enable Stripe Billing einschalten
- Das Backend validiert, dass sowohl
STRIPE_SECRET_KEYals auchSTRIPE_WEBHOOK_SECRETvorhanden sind — wenn einer fehlt, wird 400 zurückgegeben und der Schalter bleibt AUS - Nur bei der ersten Aktivierung führt das Backend ein idempotentes Setup durch:
- Erstellt Free + Pro Pläne (übersprungen, falls bereits vorhanden)
- Setzt
system_settings.default_plan_idauf die Free Plan ID - Füllt
users.plan_id = free.idfür alle Benutzer ohne Plan auf - Synchronisiert
default_token_quota→ Free Planmonthly_token_quota, sodass das bestehende global von Admin kontrollierte Kontingent erhalten bleibt
- Nachfolgende Umschaltungen aus/an sind ein reines Flag-Flip ohne Datennebenwirkungen
4. Aktualisieren Sie den Pro-Plan mit Ihrem Live-Preis
Nach der Aktivierung aktualisieren Sie den vordefinierten Pro-Plan, um auf Ihren Live-Stripe-Preis zu verweisen:- Admin → Billing → Plans → Pro → Edit
- Fügen Sie Ihre
price_1***(aus Schritt 1) inStripe Price IDein - Speichern
5. Smoke-Test
- Öffnen Sie
/settings?tab=billingals normaler Benutzer - Klicken Sie auf Switch to Pro
- Stripe Checkout wird geöffnet; füllen Sie es mit einer echten Karte mit niedrigem Betrag aus (erstatten Sie danach)
- Webhook sollte ausgelöst werden — überprüfen Sie im Stripe Dashboard → Webhooks → aktuelle Ereignisse zeigen 2xx-Antworten
- Abonnementzeile erscheint in der Tabelle
subscriptions;users.plan_idwechselt zupro - Die Benutzeroberfläche zeigt jetzt Pro-Plan + Schaltfläche „Manage subscription”
Abrechnung deaktivieren
Schalten Sie den Schalter Enable Stripe Billing in Admin → System Settings → Billing AUS. Wenn deaktiviert:- Alle
/api/billing/*-Endpunkte geben 503 zurück - Der Webhook-Endpunkt gibt 503 zurück (Stripe wird erneut versuchen und dann im Dashboard als fehlgeschlagen angezeigt — das ist in Ordnung, Sie können den Webhook stattdessen im Stripe Dashboard deaktivieren, wenn die Abrechnung dauerhaft ausgeschaltet ist)
- Die Registerkarte Plan & Billing für Benutzer verschwindet
- Die Navigationsgruppe Admin → Billing ist ausgeblendet
- Die Quota-Kette überspringt die Plan-Stufe und fällt direkt auf
default_token_quotazurück
subscriptions-, billing_plans- und users.plan_id-Zeilen bleiben unverändert. Das erneute Aktivieren wird vom gleichen Status aus fortgesetzt, ohne dass eine Migration erforderlich ist.
Berechnungsreferenz — Kontingent- und Token-Mathematik
Dies ist die autoritative Referenz für jede numerische Regel, die entscheidet, was ein Benutzer verbrauchen darf, wann sein Zähler zurückgesetzt wird und wie die Auflösungskette zusammengesetzt wird. Lesen Sie dies, bevor Sie Preise ändern, Kontingente anpassen, Nutzungs-Dashboards erstellen oder v2/v3-Arbeiten planen. Zukünftige, aber noch nicht ausgelieferte Regeln sind in ihrem reservierten Slot dokumentiert, damit Mitwirkende wissen, wo neue Logik eingebunden wird.Glossar
| Variable | Speicher | Semantik | Bereich |
|---|---|---|---|
users.token_quota | pro Benutzer (Überschreibung) | Dreistellige Überschreibung; siehe Semantik unten | NULL, 0 oder positive Ganzzahl |
users.tokens_used_this_period | pro Benutzer (Zähler) | Kumulierte Tokens seit letztem Zurücksetzen | nicht-negative Ganzzahl |
users.quota_reset_at | pro Benutzer (Anker) | Spiegelt Subscription.current_period_end für bezahlte Benutzer | Zeitstempel |
users.plan_id | pro Benutzer (FK) | Aktiver Plan | FK billing_plans.id |
billing_plans.monthly_token_quota | pro Plan | Obergrenze für Benutzer dieses Plans | nicht-negative Ganzzahl |
system_settings.default_token_quota | Singleton | Defensive Fallback, wenn kein Plan zutrifft | nicht-negative Ganzzahl |
system_settings.default_plan_id | Singleton | Kostenlos-Plan-Zeiger für neue/nicht zugewiesene Benutzer | FK oder NULL |
system_settings.billing_enabled | Singleton | Master-Schalter — steuert Schritt 2 der Kette | Boolescher Wert |
Was als Token zählt
Die Token-Nutzung wird auf der LLM-Aufrufsebene erfasst, basierend auf demusage-Objekt von LiteLLM bei jedem Completion.
- Gezählt: Prompt-Tokens + Completion-Tokens bei jedem Modellaufruf
- Gezählt: jeder Roundtrip in einem mehrstufigen / Tool-Use-Agent-Flow (jeder Modellaufruf ist eine separate Belastung)
- Gezählt: Embedding-Anfragen (KB-Ingestion, Abruf-Scoring)
- Nicht gezählt: eingegebene Daten, die nie an ein Modell gesendet werden (z. B. hochgeladene Dateien, die der Benutzer verwirft)
- Nicht gezählt: Anfragen, die fehlschlagen, bevor sie den Provider erreichen (Authentifizierungsfehler, Rate-Limit-Vorabprüfung)
- Zwischengespeicherte Eingabe: in v1 zum vollen Preis gezählt (kein Provider-Cache-Rabatt wird angezeigt). v2 kann zwischengespeicherte Prompt-Tokens möglicherweise separat gutschreiben.
Three-state override semantics
users.token_quota ist die administrative Überschreibung pro Benutzer. Sie hat drei Bedeutungen in einer Spalte:
| Value | Meaning | Use case |
|---|---|---|
NULL | Not set — defer to plan / default | Default state for all normal users |
0 | Unlimited | Admin / internal accounts; “VIP gift” |
N > 0 | Hard cap at N | Block an abuser without canceling their paid subscription; pre-paid enterprise allocation |
Quota resolution chain — v1 (current)
For any authenticated request, the cap is computed top-down — first match wins:users.plan_id for every user. It exists as a defense-in-depth so a misconfigured plan never silently uncaps a user.
Periodische Zurückstellung
- Für bezahlte Benutzer spiegelt
quota_reset_atSubscription.current_period_endwider. Derinvoice.payment_succeededWebhook-Handler setzttokens_used_this_period = 0und verschiebtquota_reset_atbei jeder erfolgreichen Verlängerung auf das neue Periodenende. - Für kostenlose Benutzer (kein Stripe-Abonnement) setzt ein stündlicher Cron
tokens_used_this_periodauf 0 an einer Kalendermonatsgrenze, die am Plan-Zuweisungsdatum verankert ist. - Planänderungen in der Mitte einer Periode setzen den Zähler nicht zurück — nur Verlängerungen tun dies. Dies verhindert Quota-Cycling-Exploits („abonnieren → Pro-Quota nutzen → kündigen → erneut abonnieren”).
Mid-stream enforcement
- Pre-flight check at chat-call entry: cheapest path, blocks requests the user can’t afford to start.
- During streaming, the running token count is re-evaluated on every chunk. Crossing the cap closes the stream with a structured terminator frame, not a network error.
- The frontend interprets the terminator and surfaces
<QuotaExceededDialog>with a deep link to/settings?tab=billing. - Non-streaming responses return HTTP
402with body{ code: "QUOTA_EXCEEDED", reset_at, upgrade_url }.
Billing-deaktiviert-Fallback
Wennsystem_settings.billing_enabled = FALSE:
- Schritt 2 der Kette wird übersprungen — die Kette reduziert sich auf
override → default → unlimited. /api/billing/*und/api/webhooks/stripegeben503zurück.- Die Registerkarte
Plan & Billingfür Benutzer und die Admin → Billing-Navigationsgruppe sind ausgeblendet. - Alle Abrechnungsdaten (Abonnements, Pläne,
users.plan_id) bleiben erhalten — das erneute Aktivieren setzt den gleichen Status fort, ohne Migration erforderlich zu sein.
Reserviert: quota chain v2 — Team-Plätze
Noch nicht ausgeliefert. Hier dokumentiert, damit die v2-Arbeit einen bekannten Landeplatz hat.
Subscription.quantityführt die Platzanzahl (Stripe-nativ).- Der effektive Plan eines Benutzers wird durch Team-Mitgliedschaft aufgelöst, bevor auf seinen persönlichen Plan zurückgegriffen wird:
- Quota ist pro Platz (jedes Team-Mitglied erhält ein vollständiges
monthly_token_quota), nicht ein gemeinsamer Pool. Gemeinsame Pools führen zu First-Come-First-Served-Erschöpfung und sind kundenfeindlich. - Override-Semantik bleibt unverändert — Team-Administratoren können einzelne Mitglieder weiterhin hart begrenzen über
users.token_quota = N, was in der Kette über dem Team-Plan liegt.
Reserved: quota chain v3 — native Org allocation (no Stripe)
Noch nicht veröffentlicht. Reserviert für On-Prem- / Enterprise-Deployments, die Kontingente intern zuweisen, ohne pro Benutzer über Stripe zu bezahlen.
- Neue Tabelle
org_quota_allocations(user_id, monthly_token_quota, org_id)verteilt ein übergeordnetes Budget auf Mitglieder. - Zuweisungen sind pro Benutzer, kein gemeinsamer Pool — jedes Mitglied hat ein klares individuelles SLA.
- Aktualisierte Chain:
max(), nichtsum(). Ein bezahlter Pro-Benutzer erhält nie weniger als das, wofür er bezahlt hat, auch wenn sein Org-Administrator eine niedrige Zuweisung festlegt. Das über Stripe bezahlte Kontingent ist unverletzlich.
Reserviert: Pay-per-use-Gutschriftsaldo (v3 separate Dimension)
Noch nicht ausgeliefert. Eine separate Achse vom obigen Schema — Gutschriften sind eine einmalige Aufstockung, keine Abonnement-Stufe.
- Neue Tabelle
user_credits(user_id, balance_cents, currency)— finanziert über Stripe Checkoutmode='payment'. - Verbrauchsreihenfolge: Abonnement-Kontingent zuerst, dann Gutschriftsaldo (nur nach Erschöpfung des Abonnements beginnt die Gutschrift zu sinken).
- Gutschriftsaldo ist nicht erstattbar (Industriestandard für Prepaid).
- UI zeigt beide Balken:
Subscription quota: 4.2M / 5M used+Credits: $7.40 remaining.
Standardwerte
Standardwerte bei der Bereitstellung — alle nach der Installation anpassbar, außer wo angegeben.| Variable | Standard | Anpassbar über |
|---|---|---|
billing_plans.monthly_token_quota (Free) | 1,000,000 | Admin → Billing → Plans → Free → Edit |
billing_plans.monthly_token_quota (Pro) | 5,000,000 | Admin → Billing → Plans → Pro → Edit |
system_settings.default_token_quota | 1,000,000 (synchronisiert mit Free bei Aktivierung) | Admin → System Settings → Quotas |
system_settings.billing_enabled | FALSE | Admin → System Settings → Billing |
| Pro-Listenpreis | $20.00 USD / Monat | Stripe Dashboard (price object) |
| Stripe-Webhook-Events abonniert | 6 | Stripe Dashboard → Webhooks |
| Stripe-Preis-Cache-TTL | 5 Minuten | hardcoded in stripe_client.py |
| Subscription-Lifecycle-Cron | stündlich | APScheduler in web/main.py |
| Free-Tier-Reset-Cron | stündlich (Kalendermonats-Grenze) | APScheduler in web/main.py |
Preismodell
V1 ist ein pauschales Abonnement. Free + Pro, monatliche Abrechnung, nur USD. Nicht im Umfang von v1 (absichtlich, auf die Roadmap verschoben):- Team-Plan (Stripe-Plätze /
subscription.quantity) - Jährliche Abrechnung
- Multi-Währungs-Präsentation
- Gutscheine / Promo-Codes
- Steuerbehandlung (Stripe Tax-Integration — erfordert separate Compliance-Überprüfung)
- Nutzungsbasierte Messung / Überschussgebühren
- Pay-per-Use-Guthaben (einmalige Aufstockung)
Fehlerbehebung
Toggle wird nicht aktiviert — 400-Fehler
Toggle wird nicht aktiviert — 400-Fehler
Der Aktivierungsendpunkt erfordert, dass sowohl
STRIPE_SECRET_KEY als auch STRIPE_WEBHOOK_SECRET gesetzt sind. Bestätigen Sie, dass sie in .env vorhanden sind und dass das Backend nach der Bearbeitung neu gestartet wurde.Webhook gibt 503 zurück
Webhook gibt 503 zurück
Entweder ist die Abrechnung deaktiviert (Toggle ist AUS), oder die Anfragensignaturverifizierung ist fehlgeschlagen (nicht übereinstimmender
STRIPE_WEBHOOK_SECRET). Überprüfen Sie Stripe Dashboard → Webhooks → aktuelle Ereignisse auf den tatsächlichen Fehlertext.Benutzer abonniert, sieht aber immer noch kostenlosen Plan
Benutzer abonniert, sieht aber immer noch kostenlosen Plan
Der
checkout.session.completed-Webhook hat Ihr Backend nicht erreicht. Überprüfen Sie, dass die Endpunkt-URL im Stripe Dashboard genau mit <your-domain>/api/webhooks/stripe übereinstimmt, einschließlich des nachfolgenden Pfads. Überprüfen Sie die letzten Webhook-Zustellungen auf Fehler.Pro-Benutzer sieht die Test-Modus-Preis-ID
Pro-Benutzer sieht die Test-Modus-Preis-ID
Die Seed-Migration schreibt eine Test-Modus-Preis-ID. Nach der Aktivierung der Produktionsabrechnung aktualisieren Sie den Pro-Plan, um Ihre Live-
price_1*** über Admin → Abrechnung → Pläne → Pro → Bearbeiten oder über direktes SQL UPDATE zu verwenden.Quittungen sind mit Stripe-Standardeinstellungen gekennzeichnet
Quittungen sind mit Stripe-Standardeinstellungen gekennzeichnet
Konfigurieren Sie Ihr Geschäfts-Branding im Stripe Dashboard → Einstellungen → Branding. Fügen Sie Ihr Logo, Ihren Geschäftsnamen (z. B. „FIM Labs Pte. Ltd.”) und Ihre Adresse hinzu. Stripe wendet diese auf alle automatisch generierten Quittungen und Rechnungen an.
Devisenverluste bei Auszahlungen
Devisenverluste bei Auszahlungen
Wenn sich die Standardwährung Ihres Stripe-Kontos von Ihrer Abrechnungswährung unterscheidet, konvertiert Stripe bei jeder Auszahlung (1,5–2% Spread). Fügen Sie eine entsprechende Abrechnungswährung unter Einstellungen → Bankkonten und Währungen hinzu, verknüpfen Sie ein Bankkonto mit derselben Währung, und Stripe leitet Zahlungen mit derselben Währung ohne Umrechnung weiter.