Petri Heil Online — Vereins-Operations-Guide¶
Schritt-für-Schritt: vom Null-Zustand bis zum vollen Online-Bezahl-Betrieb.
Stand: 2026-05-06 (v1.2)
Zielgruppe: Vorstand, Kassier, Vereins-Admin
Ergänzendes Dokument: TENANT_HANDBOOK.md (Referenz)
Dieses Dokument richtet sich an den Vereins-Vorstand als Anwender. Technische Plattform-Operationen (Server-Konfiguration, Webhook-Setup, Live-Switch) führt Petri Heil Online zentral aus und sind hier nicht beschrieben.
Was du am Ende hast¶
Mitglieder bezahlen Jahresbeiträge selbst online. Der Erlaubnisschein wird automatisch aktiviert sobald das Konto ausgeglichen ist. Tageskarten und Gastkarten haben einen separaten, aber ebenfalls Stripe-basierten Workflow.
Vorstand Mitglied Stripe Verein
─────── ──────── ────── ──────
generate-permits ──▶ E-Mail "bitte zahlen"
/portal/account/ ──▶ Checkout
──▶ Webhook ────────────▶ Charge=paid
Permit aktiv
Bestätigungs-Mail
Servicegebühr
Vorbereitung: was du vorab brauchst¶
- [ ] Vereins-Instanz ist eingerichtet (
<verein>.petri-heil.online) - [ ] Vereins-Admin-Login funktioniert
- [ ] Vereinsdaten vollständig (Name, Adresse, IBAN, USt./Steuernummer, Kontakt-E-Mail)
- [ ] Mitgliederliste mit Bankdaten in
MemberBankInfogepflegt (für Übergang von SEPA) - [ ]
MembershipBasePrice-Tabelle gepflegt (Preise pro Status) - [ ] Mindestens ein Vorstandsbeschluss, dass ihr auf Online-Zahlung umstellt
Phase 0 — Stripe Connect verbinden (einmalig)¶
0.1 Voraussetzungen sammeln¶
Vor dem Stripe-Onboarding bereitlegen: - Vereinsregister-Auszug (nicht älter als 3 Monate) - Vereinssatzung (PDF) - Steuernummer + Freistellungsbescheid (falls gemeinnützig) - IBAN des Vereinskontos - Personalausweis-Kopie der/des Vorstandsvorsitzenden + Kassier - Wohnadresse + Geburtsdatum der vertretungsberechtigten Personen - Geschätztes Jahresvolumen (z.B. 50.000 €)
0.2 Stripe Connect Onboarding¶
1. Vereins-Admin → Konfiguration → Tab "Stripe Connect (Online-Zahlungen)"
2. Klick "🚀 Stripe Connect einrichten"
3. Weiterleitung zu Stripe-Onboarding (https://connect.stripe.com)
4. Konto-Typ: "Unternehmen / Verein"
5. Vereinsdaten ausfüllen
6. IBAN für Auszahlungen
7. Personalausweis + Selfie verifizieren
8. Stripe redirect zurück zu Petri Heil
9. Stripe-Verifikation läuft (1–3 Werktage)
0.3 Status prüfen¶
Konfiguration → Tab Stripe Connect:
- ✅ stripe_account_id: gefüllt (acct_xxx)
- ✅ stripe_account_status: Aktiv
- ✅ stripe_charges_enabled: True
- ✅ stripe_onboarding_completed: True
Wenn Status „Ausstehend" oder „Eingeschränkt": Stripe wartet auf Dokumente. Mail-Postfach prüfen.
0.4 Zahlungsmethoden im Stripe-Dashboard aktivieren¶
Vorstand öffnet sein Stripe-Dashboard: https://dashboard.stripe.com/settings/payment_methods
Aktivieren (alle Schalter auf ON): - [x] Karten (Visa, Mastercard, Amex) - [x] Link (Stripe One-Click) - [x] SEPA Direct Debit - [x] Klarna (separater Vertrag — Stripe leitet weiter) - [x] EPS (für AT-Gäste)
⚠️ Ohne diese Aktivierung filtert Stripe die Methoden im Checkout heraus. Mitglied sieht dann nur „Karte".
Phase 1 — Modus festlegen (SEPA ODER Stripe)¶
1.1 Wo umschalten¶
Vereins-Admin → Konfiguration → Tab "Bezahl-Modus Mitgliedsbeiträge"
Dropdown: - SEPA-Lastschrift (Verein zieht ein) — alter Workflow, Default - Online-Zahlung über Stripe (Mitglied bezahlt selbst) — neuer Push-Modus
⚠️ Tageskarten und Gastkarten sind von dieser Einstellung nicht betroffen — sie haben einen eigenen Workflow.
1.2 Wann auf Stripe schalten?¶
| Vorteil | Stripe |
|---|---|
| Keine SEPA-Rückläufer | ✅ |
| Sofortige Liquidität | ✅ |
| Mitglied trägt Verantwortung | ✅ |
| Erlaubnisschein-Sperre erzwingt Zahlung | ✅ |
| Nachteil | Stripe |
|---|---|
| Mitglied muss aktiv werden (manche werden vergessen) | ⚠️ |
| Servicegebühr 0,3 € + 0,9 % Petri Heil + Stripe-Gebühr | ⚠️ |
| Mehr Erinnerungs-E-Mails nötig | ⚠️ |
1.3 Wechsel-Bedingungen¶
- SEPA → Stripe: nur möglich, wenn Stripe Connect vollständig eingerichtet ist (
stripe_account_idgesetzt,stripe_account_status='active',stripe_onboarding_completed=True,stripe_charges_enabled=True). Sonst Validierungs-Fehler beim Speichern der Konfiguration. - Stripe → SEPA: jederzeit möglich. Bestehende Mitgliederkonten + Zahlungshistorie bleiben erhalten.
Phase 2 — Datenbasis vorbereiten¶
2.1 Mitgliedsstatus-Preise pflegen¶
Admin → Finanzen → Basispreise
Pro MembershipStatus (Erwachsen, Jugend, Senior, Familie …):
- active_base_price: 80 €, 30 €, 60 €, 120 € …
- passive_base_price: 40 €, 15 €, 30 €, 60 €
Wenn ein Status keine Zeile hat → kein Beitrag.
2.2 Adjustments anlegen (Rabatte / Aufschläge)¶
Admin → Finanzen → Kosten / Rabatte
Beispiele: - Rabatt „Doppel-Mitglied": -20 € - Aufschlag „Putzdienst-Pauschale": +10 €
2.3 Spez. Gewässerkosten¶
Admin → Finanzen → spez. Gewässerkosten
Pro Gewässer optional Zusatz-Pauschale (z.B. 90 € für Hammerweiher).
2.4 Mitglieder-Bankdaten + Adjustment-Zuweisung¶
Admin → Finanzen → Bankdaten
Pro Mitglied:
- IBAN, BIC, Bankname, Kontoinhaber
- Adjustments anhaken (z.B. „Doppel-Mitglied")
- include_in_calculation ✅
update_total_cost() läuft beim Speichern automatisch. Im Stripe-Modus erzeugt das gleichzeitig den MemberCharge für die Saison.
Phase 3 — Test-Lauf (Test-Modus, nicht Live!)¶
3.1 Modus auf Stripe schalten¶
Vereins-Admin → Konfiguration → Tab Bezahl-Modus → Online-Zahlung über Stripe → Speichern
3.2 Bestehende Mitglieder-Bankdaten resyncen¶
Beim Speichern der Bankdaten werden automatisch Mitglieder-Posten erzeugt. Für alle Mitglieder gleichzeitig: Bulk-Aktion benutzen.
Admin → Finanzen → Bankdaten → alle markieren → Aktion „Beiträge neu berechnen"
Verifikation:
- Admin → Finanzen → Mitglieder-Posten — Liste sollte sich füllen mit „Jahresbeitrag 2027"-Einträgen.
3.3 Permits generieren¶
Admin → Mitglieder → Mitglieder-Erlaubnisscheine → Aktion „Erlaubnisscheine für aktuelle Saison erstellen"
Im Stripe-Modus:
- Permits werden mit is_active=False (gesperrt) angelegt sofern offene Posten vorhanden
- PDF wird trotzdem erzeugt
- revocation_reason: „Online-Zahlung ausstehend — wird nach Begleichen aller Posten freigeschaltet."
3.4 Test als Mitglied¶
1. Mitglied-Test-Account einloggen: <verein>.petri-heil.online/portal/login/
2. Sidebar → "Mein Konto"
3. Saldo + Posten sichtbar
4. Klick "Alle bezahlen"
5. Stripe Checkout öffnet sich
6. Test-Karte: 4242 4242 4242 4242 / CVC 123 / Datum 12/30
7. "Zahlen" → Erfolgreich
8. Redirect zu Success-Seite
9. Bestätigungs-E-Mail kommt im Mail-Postfach des Test-Mitglieds an
10. Saldo = 0,00 €, Permit = "Aktiv"
3.5 Edge-Cases testen¶
| Test | Erwartung |
|---|---|
| Karte abgelehnt (4000 0000 0000 9995) | Status error, Charges bleiben offen |
| Browser-Tab schließen vor Bezahlen | „Jetzt bezahlen"-Button bleibt im Konto |
| Manueller Zusatz-Posten anlegen | Permit wird sofort gesperrt |
| Posten als „Erlassen" markieren | Permit aktiviert wenn keine anderen Posten offen |
| SEPA-XML im Stripe-Modus aufrufen | Fehler-Hinweis erscheint |
Phase 4 — Mitglieder kommunizieren¶
4.1 Vorab-Anschreiben (8 Wochen vor Live)¶
Vorlage (anpassen):
Liebe Mitglieder,
ab Saison 2027 stellen wir den Jahresbeitrag von SEPA-Lastschrift auf Online-Zahlung um.
Was ändert sich für dich? - Du loggst dich im Mitglieder-Portal ein:
<verein>.petri-heil.online/portal/login/- Unter „Mein Konto" siehst du deinen Beitrag - Du bezahlst online per Karte, SEPA, Klarna oder Sofort - Erst nach Zahlung wird dein Erlaubnisschein freigeschaltetFrist: bitte bis 31.01.2027 bezahlen.
Bei Fragen:
4.2 Erinnerungen automatisch¶
Petri Heil schickt automatische Erinnerungs-E-Mails: - 14 Tage vor Fälligkeit - 7 Tage vor Fälligkeit - 1 Tag vor Fälligkeit - 1 / 7 / 30 Tage nach Fälligkeit (Eskalation)
Verein muss nichts tun. Voraussetzung: Mitglieder haben gültige E-Mail-Adresse im User-Profil.
Phase 5 — Live-Schaltung¶
5.1 Test-Modus → Live¶
Die Umstellung von Test- auf Live-Betrieb wird zentral durch Petri Heil Online vorgenommen. Sobald aktiv, sieht der Vorstand in der Stripe-Connect-Sektion den Status „Live-Account aktiv". Bitte rechtzeitig per Mail an support@petri-heil.online Bescheid geben, wann Live geschaltet werden soll.
5.2 Erst-Generierung der Saison-Permits¶
Admin → Mitglieder-Erlaubnisscheine → Erlaubnisscheine für aktuelle Saison erstellen
→ Saison: <kommende Saison>
→ Erstellen
System legt automatisch: - Permit-Datensatz pro Mitglied (gesperrt da Posten offen) - PDF-Generierung - MemberDocument-Eintrag (Mitglied sieht im Portal)
5.3 Initiales Mitglieder-E-Mail¶
Optional: einmalige Push-Mail an alle Mitglieder „dein Jahresbeitrag steht zur Zahlung bereit".
Phase 6 — Laufender Betrieb¶
Was Petri Heil automatisch macht¶
| Vorgang | Trigger |
|---|---|
| Reminder-E-Mails (14/7/1d) | täglich um 08:30 Uhr |
| Eskalations-E-Mails (1/7/30d nach Frist) | täglich um 08:30 Uhr |
| Charge → bezahlt → Permit aktiv | sofort nach Stripe-Webhook |
| Bestätigungs-E-Mail an Mitglied | sofort nach Bezahlung |
| Servicegebühr-Abzug | automatisch bei jeder Zahlung |
| Application Fee Audit-Log | automatisch |
Was der Vorstand tun muss¶
| Vorgang | Wann |
|---|---|
Monatliches Audit Mitglieder-Posten (Status, Saldo) |
monatlich |
| Manuelle Posten anlegen (Arbeitsstunden-Strafe etc.) | nach Bedarf |
| Bei „nichts erscheint" → MemberBankInfo neu berechnen | nach Tarif-Änderung |
| Eskalierte Mitglieder kontaktieren | nach 30-Tage-Eskalations-Mail |
| Stripe Dashboard → Auszahlungen prüfen | wöchentlich/monatlich |
Manuelle Posten anlegen (Beispiel: fehlende Arbeitsstunden)¶
Admin → Finanzen → Mitglieder-Posten → Hinzufügen
Mitglied: Müller, Hans
Saison-Jahr: 2026
Posten-Typ: Fehlende Arbeitsstunden
Bezeichnung: Fehlende Arbeitsstunden 2026 (3h)
Beschreibung: Soll: 10h, geleistet: 7h. Pönale 25 €/h.
Betrag: 75,00 € (im Formular technisch in Cent: 7500)
Status: Offen
Speichern
→ Mitglieds-Permit wird automatisch gesperrt (sofern aktiv war). Mitglied sieht den Posten + bezahlt online → Permit aktiv.
Bezahl-Modus wechseln¶
Vereins-Admin → Konfiguration → Tab Bezahl-Modus → Speichern
| Wechsel | Effekt |
|---|---|
| SEPA → Stripe | Bestand bleibt. Bei nächstem update_total_cost: Charges entstehen. |
| Stripe → SEPA | SEPA-Lastschrift wieder möglich. Bestehende Charges bleiben offen. |
Troubleshooting¶
„Mitglied sieht keine Posten im Portal"¶
Ursachen + Lösung:
- Verein ist im SEPA-Modus → wechseln auf Stripe
- Mitglied hat keine MemberBankInfo → Bankdaten anlegen + speichern
- include_in_calculation=False → auf True setzen
„Permit ist trotz Bezahlung noch gesperrt"¶
Ursachen + Lösung:
- Andere Posten noch offen → Admin → Finanzen → Mitglieder-Posten filtern auf Mitglied + Status „Offen"
- Manuelle Posten vom Vorstand vergessen zu erlassen → erlassen
- Wenn alle Posten als „bezahlt" markiert sind und Permit trotzdem gesperrt → Petri Heil Support kontaktieren (support@petri-heil.online); kann an einer fehlgeschlagenen Webhook-Zustellung liegen, wird zentral geprüft
„SEPA-XML-Generator zeigt Fehler"¶
Verein ist im Stripe-Modus. Wechsel zurück auf SEPA-Modus → SEPA-Generierung wieder möglich.
„Mitglied beklagt sich, hat aber keine E-Mail-Adresse"¶
Admin → Mitglieder → Mitgliedsprofil — E-Mail nachpflegen. Reminder-Versand skippt automatisch Mitglieder ohne E-Mail.
„Mitglied bekommt keine Erinnerungs-Mails"¶
- Verein ist im SEPA-Modus → keine Reminder (sinnvoll: Verein zieht ja selbst ein)
- Mitglied hat keine offene Forderung → keine Reminder
- Mitglied hat keine E-Mail
- Gestern wurde schon eine Erinnerung der gleichen Stufe gesendet → Doppel-Schutz
„Permit für ein einzelnes Mitglied trotz Saldo aktivieren?"¶
Vorstand setzt im Mitglieder-Posten-Admin alle offenen Charges auf Erlassen → Permit aktiviert sich automatisch. Audit bleibt erhalten.
„Wie sehe ich was Petri Heil an Servicegebühren einbehält?"¶
Im Stripe Dashboard des Vereins unter „Plattform-Gebühren" / „Application Fees" — pro Zahlung Cent-genau ausgewiesen. Zusätzlich erhält der Verein monatlich eine Sammelrechnung von Petri Heil Online über die abgezogenen Servicegebühren.
Checkliste vor Go-Live¶
- [ ] Stripe Connect Konto aktiv (charges_enabled=True)
- [ ] Zahlungsmethoden im Stripe Dashboard aktiviert (Karte, SEPA, Link, Klarna, EPS)
- [ ] Petri Heil Servicegebühr in den AGB erwähnt (Standard-Klausel im Vorstandsbeschluss)
- [ ] MembershipBasePrice für alle aktiven Status gepflegt
- [ ] WaterAdditionalCost für besondere Gewässer
- [ ] AdjustmentDefinition (falls Rabatte/Aufschläge)
- [ ] MemberBankInfo für alle aktiven Mitglieder vollständig
- [ ] Test-Bestellung erfolgreich durchgelaufen (Bezahl + Permit-Aktivierung)
- [ ] Mitglieder vorab informiert (mind. 4 Wochen)
- [ ] Bezahl-Modus auf Stripe gestellt
- [ ] Permits für aktuelle Saison generiert
- [ ] Erste Wochen aktiv überwachen, Mitglieder mit Problemen kontaktieren
Support¶
- Plattform-Support Petri Heil Online:
support@petri-heil.online/ werktags 9–17 Uhr - Stripe-spezifische Probleme: Stripe Dashboard Chat (24/7) oder support.stripe.com
- Rechts-/Steuerfragen: eigener Steuerberater oder Verein-Rechtsschutz
Anhang: Schnell-Referenz Admin-URLs¶
| Funktion | URL |
|---|---|
| Vereins-Konfiguration | /admin/tenant_config/configuration/1/change/ |
| Mitglieder-Posten | /admin/accounting/membercharge/ |
| Mitglieder-Bankdaten | /admin/accounting/memberbankinfo/ |
| Basispreise | /admin/accounting/membershipbaseprice/ |
| Erlaubnisscheine | /admin/members/memberfishingpermit/ |
| Erlaubnisscheine generieren | /admin/members/memberfishingpermit/generate-season-permits/ |
| Stripe-Zahlungen | /admin/daycards/stripepayment/ |
| Rechnungen | /admin/billing/invoice/ |
| Mitglieder-Portal | URL |
|---|---|
| Mitglied-Login | /portal/login/ |
| Konto-Übersicht | /portal/account/ |
| Tageskarten | /portal/daycards/cards/ |
© Petri Heil Online — Version 1.2 — 2026-05-07
Änderungshistorie:
- v1.1 — Code-Verifikation: Admin-Button-Label korrigiert („🚀 Stripe Connect einrichten"). SEPA→Stripe-Wechsel an Stripe-Connect-Vollständigkeit gebunden. Bulk-Action „Beiträge neu berechnen" (nicht „Beträge"). revocation_reason exakt zitiert.
- v1.2 — Zielgruppen-Säuberung: technische Operator-Inhalte entfernt (STRIPE_TEST_MODE-Env, Stripe-CLI-Befehle, MailHog-Hinweis, Servicegebühr-Log-Admin-URL, zentrale Webhook-Diagnose). Begriff „Tenant" durch „Verein" / „Vereins-Admin" / „Vorstand" ersetzt. Live-Schaltung als zentrale Petri-Heil-Aktion klargestellt. Operator-Inhalte ins separate PLATFORM_OPERATOR_RUNBOOK.md ausgelagert.