CallwiseDocs

Abrechnung, Laufzeit und Zahlungsausfall

Die kostenlose Woche, die Laufzeit von 12 Monaten, die Kündigung der Verlängerung, keine Erstattungen, welche Module ein Arbeitsbereich hat, und was geschieht, wenn eine Zahlung fehlschlägt.

Ein Arbeitsbereich abonniert eine Basis, einen Tarif oder ein Branchenpaket, plus Add-ons. Zusammen entscheiden sie, welche Module er hat. Jedes Modul hat dann einen Abrechnungszustand, geschrieben nur von der Abrechnung (der Service-Role), nie von einer Person in der App.

Die kostenlose Woche

Jeder Kauf beginnt mit einer kostenlosen Testphase von 7 Tagen, eine je Kunde. Die Daten kommen aus trialSchedule(purchaseDay) in @callwise/pricing:

  • An der Kasse gibt der Kunde Zahlungsdaten ein und setzt das Häkchen bei der Einwilligung. Eine Zahlungsmethode wird gespeichert, und heute werden $0 abgebucht. Die Kasse zeigt Today: $0 · First charge on <date> und den Betrag.
  • Tag 7 (der Tag nach dem letzten kostenlosen Tag): Der Jahresbetrag wird einmal abgebucht, und die Laufzeit von 12 Monaten beginnt an diesem Tag. Ein Kauf am 16. Okt. 2026 ist vom 16. bis 22. Okt. kostenlos, wird am 23. Okt. 2026 abgebucht, und seine Laufzeit geht vom 23. Okt. 2026 bis zum 22. Okt. 2027 und verlängert sich am 23. Okt. 2027.
  • Eine Kündigung während der Testphase kostet nichts. Auf der Website heißt das Testphase kündigen (/account/trial, Bestellnummer + E-Mail) und ruft cancelTrial() in @callwise/store auf: erlaubt nur, solange die Bestellung trialing ist und vor dem Tag der ersten Abbuchung; es entwertet die gespeicherte Methode und bucht nichts ab. Nach der ersten Abbuchung ist die Laufzeit nicht erstattungsfähig, und nur die Verlängerung kann gekündigt werden.
  • Eine Testphase je Kunde, gezählt über die normalisierte E-Mail gespeicherter Bestellungen (Kleinbuchstaben, Leerzeichen entfernt, +tags gestrichen, Punkte bei Gmail ignoriert). Ein zweiter Kauf hat keine Testphase: Er wird an der Kasse abgebucht, seine Laufzeit beginnt an diesem Tag (termFrom(today)), und die Kasse sagt „Ihre kostenlose Testphase wurde bei einer früheren Bestellung genutzt: heute abgebucht“.

Bestellstatus in @callwise/store: trialing (Methode gespeichert, nichts abgebucht) → active (erste Abbuchung erfolgt) oder trialing → trial_cancelled (nie etwas abgebucht). Jede Bestellung speichert trial: { start, end, firstChargeOn }, amountToday, firstCharge: { amount, on, idempotencyKey, status } und die Daten der Laufzeit.

Der Abbuchungsjob an Tag 7

runDueTrialCharges(now) bucht jede Bestellung im Status trialing ab, deren Tag der ersten Abbuchung heute oder früher liegt, genau einmal, und setzt sie auf active. Gekündigte Testphasen werden übersprungen; Bestellungen, deren Tag 7 noch bevorsteht, bleiben unberührt. Der Job ist idempotent: Eine abgebuchte Bestellung ist nicht mehr trialing, und jede Abbuchung trägt einen Idempotenzschlüssel je Bestellung (first-charge:<orderId>). Zweimal ausführen oder ein Absturz zwischen Abbuchung und Speichern bucht daher nie zweimal ab. Eine fehlgeschlagene Abbuchung bleibt trialing und wird beim nächsten Lauf erneut versucht.

pnpm --filter @callwise/store charge-due                          # against apps/site/.data/orders.json
pnpm --filter @callwise/store charge-due -- --now 2026-10-23      # pretend it is day 7

Zahlungsanbieter

Die Schnittstelle PaymentProvider hat setupPaymentMethod (speichert eine Methode, $0), charge (sofort abbuchen, für einen Kauf ohne Testphase), chargeFirst(order) (die Abbuchung an Tag 7) und voidOnCancel(order). Sie hat keinen Erstattungsaufruf. Dieser Build liefert nur den Demo-Anbieter: Das Demo-Kartenformular der Kasse (4242 4242 4242 4242) behält nur die Marke, die letzten 4 Ziffern und das Ablaufdatum, nie die volle Nummer oder die CVC, und es bewegt sich kein Geld.

Nicht gebaut und nicht geprüft (verified: false im Code):

  • Stripe: ein Abonnement mit trial_period_days=7 auf einer Methode, die mit einem SetupIntent gespeichert wurde; die Kartenfelder wären Stripe Elements, sodass Kartennummern unseren Server nie erreichen.
  • Banken ohne wiederkehrende Abrechnung: eine 3D-Secure-Vorautorisierung über den Jahresbetrag an der Kasse, eingezogen an Tag 7 durch den geplanten Job und bei Kündigung entwertet.

Die Laufzeit

  • Jeder Tarif, jedes Paket und jedes Add-on ist ein Mindestvertrag über 12 Monate, jährlich im Voraus abgerechnet, beginnend nach der kostenlosen Woche (oder an der Kasse für einen Kunden, der bereits eine hatte). Es gibt keine Option von Monat zu Monat.
  • Preise werden je Monat angezeigt: Listenpreis abzüglich 12%. Die Abbuchung für die Laufzeit sind zwölf davon, im Voraus eingezogen. Siehe Preise.
  • termFrom(start) in @callwise/pricing liefert die Daten: Die Laufzeit endet am Tag vor dem ersten Jahrestag und verlängert sich am Jahrestag. Eine Laufzeit ab dem 16. Okt. 2026 endet am 15. Okt. 2027 und verlängert sich am 16. Okt. 2027. Monatsenden werden geklemmt (31. Jan. → verlängert sich am 31. Jan., endet am 30. Jan.).
  • cw_subscriptions speichert term_start, term_end und renewal_cancelled_at.

Die Verlängerung kündigen

Kündigen heißt die Verlängerung kündigen, nichts anderes. Ein Inhaber tut das unter Einstellungen → Abrechnung → Verlängerung kündigen. Die Aktion:

  • setzt renewal_cancelled_at (das Verlängerungsdatum wird leer),
  • lässt jedes Modul bis term_end aktiv,
  • bucht nichts ab und erstattet nichts.

Nach term_end soll ein gekündigter Arbeitsbereich schreibgeschützt werden, genauso wie ein Arbeitsbereich im Zahlungsausfall, wie unten beschrieben. In diesem Build stellt an diesem Datum noch nichts den Status um (kein geplanter Abrechnungsjob); die Regel ist festgehalten, damit der Job ihr folgen kann.

Keine Erstattungen

Sobald die erste Jahresabbuchung erfolgt ist, sind Zahlungen nicht erstattungsfähig (eine Kündigung während der kostenlosen Woche kostet nichts, es gibt also nichts zu erstatten): keine volle und keine teilweise Erstattung für ungenutzte Monate, ungenutzte Credits, nicht mehr genutzte Add-ons oder den Wechsel auf einen kleineren Tarif (der zur nächsten Verlängerung wirkt). Der Code hat keinen Erstattungspfad: @callwise/pricing exportiert REFUNDS = 'none' und keine Erstattungsfunktion, @callwise/store und sein PaymentProvider haben überhaupt keine Erstattungsfunktion, und Bestellungen tragen refund: 'never'.

Einwilligung an der Kasse

Die Kasse der Website hat ein Pflichtkästchen, das nicht angehakt startet. Sein Satz nennt die kostenlose Woche, Datum und Betrag der ersten Abbuchung, dass eine Kündigung während der Testphase nichts kostet, die Mindestlaufzeit von 12 Monaten, die nach der Testphase beginnt, die jährliche Abrechnung im Voraus, die automatische Verlängerung und dass es keine Erstattungen gibt, und er verlinkt die Bedingungen sowie die Richtlinie zu Kündigung und Erstattung. Der Satz wird je Bestellung von consentText(offer) gebaut; bei einem wiederkehrenden Kunden sagt er, dass die Testphase genutzt wurde und die Abbuchung heute erfolgt. Der Server berechnet das Angebot neu, lehnt eine Bestellung ohne das Kästchen oder mit einem anderen Satz ab und speichert an der Bestellung:

{ "accepted": true, "at": "2026-10-16T09:30:00.000Z", "termsVersion": "2026-10-16", "text": "I agree to the Terms and …" }

Die Versionsnummer der Bedingungen in diesem Build ist 2026-10-16b. Eine Bestellung von einer Seite, die älteren Text oder eine ältere Version gezeigt hat, wird abgelehnt.

Abrechnungszustände

ZustandKommt daherPersonen können
lockedDas Modul ist nicht im Tarif, im Paket oder in einem Add-onNichts. Die Seite zeigt, welcher Tarif es freischaltet.
activeBezahlt oder in der kostenlosen WocheAlles, was ihre Zugriffsstufe erlaubt
graceDie Zahlung ist kürzlich fehlgeschlagenAlles, solange die Zahlung behoben wird
read_onlyDie Zahlung ist vor einer Weile fehlgeschlagen, oder die Laufzeit endete ohne VerlängerungNur ansehen. Keine Bearbeitung, kein Veröffentlichen.

Ein Inhaber kann ein Modul im Zustand active in den Einstellungen auch ausschalten; dann ist es für alle ausgeblendet. Das Einschalten eines Moduls im Zustand locked lehnt die Datenbank ab.

Wenn eine Zahlung fehlschlägt

Die Zahlen unten kommen aus LAPSE_RULES in @callwise/pricing.

Days after a failed paymentStatusModule stateWhat happens
0activeactiveFull access.
1–7past_duegraceFull access while the payment is fixed.
8–30read_onlyread_onlyData visible, no edits. Calls forward to the fallback number.
after 30lapsedread_onlyStill read-only. Data is kept for 90 days.

Solange der Arbeitsbereich schreibgeschützt ist, werden Anrufe nicht verworfen: Sie werden an die Ersatznummer weitergeleitet, die unter Einstellungen → Telefonnummern gesetzt ist. Daten werden 90 Tage nach einem Zahlungsausfall oder nach dem Ende einer Laufzeit ohne Verlängerung aufbewahrt, damit sie exportiert werden können.

Credits

Jeder Tarif und jedes Paket hat einen gemeinsamen Pool an Credits je Monat, genutzt von jedem Modul und jedem KI-Modell (siehe Preise und KI-Modelle und Credits). Anrufe verbrauchen Credits zum Satz der Modelle, die ihr Agent verwendet. Credits werden nicht in den nächsten Monat übertragen. Inhaber erhalten eine Benachrichtigung bei 80 % und bei 100 %. Über 100 % werden Anrufe an die Ersatznummern weitergeleitet, sofern der Arbeitsbereich nicht Mehrverbrauch zu $0.03 je Credit aktiviert hat.

Wer den Tarif ändern kann

Niemand von innerhalb der App. Tarif, Status, Laufzeit und das Pool-Kontingent liegen in cw_subscriptions, das angemeldete Benutzer lesen, aber nicht schreiben können; der einzige Schreibvorgang der Abrechnung, den ein Inhaber ausführen kann, ist das Kündigen der Verlängerung. In diesem Build gibt es keine echte Zahlung: Der Shop der Website speichert Demo-Bestellungen, im Demomodus wird ein Tarifwechsel simuliert, und im lokalen Datenbankmodus wird er mit der Service-Role geschrieben.

On this page