Verträge

Überblick
Verträge führen Retainer, Wartung und Hosting entlang ihres Lebenszyklus — vom Abschluss bis zur Kündigung.
Der Unterschied zum einmaligen Auftrag ist die Dauer: Ein Vertrag erzeugt wiederkehrende Erlöse und verbraucht laufend Kontingente. Beides will beobachtet werden, sonst merkt niemand, dass ein Retainer seit Monaten überzogen ist.
Kernaufgaben
Vertrag anlegen und führen. Laufzeit, Konditionen und Status; der Status-Katalog steht in den Vertrags-Einstellungen.
Kontingente verfolgen. Was vereinbart war und was verbraucht ist. Kunden sehen ihre laufenden Verträge und Kontingente im Kundenportal.
Vorauszahlung verwalten. Vorausbezahlte Guthaben werden gegen die Leistung verrechnet.
Abrechnung auslösen. Der Vertragslauf erzeugt die fällige Abrechnung, siehe Abrechnung.
Kündigen. Die Kündigung ist ein eigenes Recht — sie beendet wiederkehrende Erlöse und ist deshalb keine beiläufige Handlung.
Felder im Detail
Die Spalte Was es bewirkt beantwortet, was sich im System ändert — nicht, wie das Feld heißt. Der graue Name dahinter ist das Feld der API: unter ihm läuft dasselbe über Automation, Import und KI-Werkzeuge.
Vertragskopf
| Feld | Pflicht | Werte / Format | Was es bewirkt |
|---|---|---|---|
Titel title | ja | Text | Wie der Vertrag heißt. Steht auf Beleg, Rechnung und in der Kundenakte. |
Kunde customerId | ja | bestehender Kunde | Mit wem der Vertrag besteht. |
Art type | nein | Retainer, Wartung, Hosting | Die Bauform. Sie bestimmt, welche der Abschnitte unten überhaupt greifen — ein Hosting-Vertrag braucht kein Stundenkontingent. |
Beginn startsAt / Ende endsAt | ja | Datum | Die Laufzeit. Das Ende ist der Anker für Kündigungsfrist und Verlängerung; ohne Ende läuft der Vertrag unbefristet. |
Abrechnungsrhythmus billingCycle | nein | monatlich, quartalsweise, jährlich | In welchem Takt abgerechnet wird. |
Abrechnungszeitpunkt billingMode | nein | im Voraus oder nachträglich | Ob die Periode vorher oder hinterher berechnet wird. Das ist keine Formalie: bei im Voraus wird die Januar-Rechnung im Januar gestellt, bei nachträglich im Februar — mit allen Folgen für Liquidität und Abgrenzung. |
Pauschale flatFeeAmount | nein | Betrag, 0 oder mehr | Der feste Betrag je Periode. |
Deckt nicht abrechenbare Zeiten coversNonBillable | nein | Ja/Nein | Ob auch als nicht abrechenbar erfasste Zeit auf den Vertrag läuft. Bei einem Retainer üblicherweise ja — sonst zahlt der Kunde die Pauschale und Sie schreiben die Arbeit trotzdem nirgends gut. |
Servicezusage slaId | nein | eingerichtete Servicezusage | Welche Reaktions- und Lösungsfristen für Tickets dieses Kunden gelten. |
Indexierung indexationBasisPoints | nein | Basispunkte | Jährliche Anpassung des Preises in Hundertstel-Prozent (100 = 1 %). Sie wird zum Stichtag gerechnet, statt jedes Jahr von Hand nachgezogen zu werden. |
Kundensichtbare Notiz noteCustomerVisible | nein | Text | Text, den der Kunde im Portal sieht. Alles andere bleibt intern. |
Marke brandId | nein | eine Ihrer Marken | Unter welcher Marke der Vertrag läuft. |
Belegvorlage documentTemplateId | nein | eingerichtete Belegvorlage | Layout des Vertragsbelegs. |
Verlängerung und Ende
| Feld | Werte / Format | Was es bewirkt |
|---|---|---|
Verlängerungsart renewalMode | keine, automatisch, auf Anfrage | Was am Laufzeitende geschieht. Automatisch verlängert stillschweigend — deshalb ist die Kündigungsfrist daneben die wichtigste Zahl des Vertrags. |
Verlängerung um (Monate) renewalTermMonths | Zahl | Um wie viel verlängert wird. |
Kündigungsfrist (Tage) noticePeriodDays | Zahl | Wie lange vor dem Ende gekündigt werden muss. Das System meldet den Termin rechtzeitig — genau deshalb steht die Frist hier und nicht nur im PDF. |
Kündigungsgrund terminationReason | Text | Warum gekündigt wurde. Grundlage der Abwanderungs-Auswertung. |
Pausengrund pauseReason | Text | Warum der Vertrag ruht. Ein pausierter Vertrag rechnet nicht ab, bleibt aber bestehen. |
Stundenkontingent
| Feld | Werte / Format | Was es bewirkt |
|---|---|---|
Name quotaName | Text | Wie das Kontingent heißt, etwa „Support" oder „Entwicklung". |
Stunden je Periode quotaTargetHours | Zahl, größer als 0 | Wie viele Stunden enthalten sind. |
Kategorie quotaCategoryKey | Zeit-Kategorie | Welche Art von Zeit darauf läuft. So lässt sich Support getrennt von Entwicklung führen. |
Standard-Kontingent quotaIsDefault | Ja/Nein | Worauf gebucht wird, wenn nichts anderes gewählt ist. |
Regel bei Rest quotaRule | verfällt, wird übertragen, wird zusätzlich berechnet | Was mit nicht verbrauchten Stunden geschieht. Die Antwort auf die häufigste Kundenfrage überhaupt — sie gehört in den Vertrag und hier hinein. |
Übertrag höchstens (Stunden) quotaRolloverMaxHours | Zahl, 0 oder mehr | Wie viel höchstens mitgenommen wird. |
Übertrag verfällt nach (Perioden) quotaRolloverExpiryPeriods | Zahl | Wann übertragene Stunden doch verfallen. |
Deckelung quotaCapMode | harte Grenze, Warnung, weich | Was bei Überschreitung passiert. Harte Grenze verhindert weitere Buchungen, Warnung meldet nur, weich lässt laufen. |
Satz für Mehrstunden quotaOverageRateId | eingerichteter Satz | Womit Stunden über dem Kontingent berechnet werden. |
Steuersatz quotaTaxRate | 0 bis 100 | Der Satz für die Mehrstunden-Abrechnung. |
Warnschwellen quotaWarnThresholds | Prozentwerte | Ab wann gewarnt wird, etwa bei 80 % und 100 %. Die Warnung geht an Sie und ist die Grundlage, den Kunden rechtzeitig anzusprechen. |
Vorausbezahltes Guthaben
| Feld | Werte / Format | Was es bewirkt |
|---|---|---|
Name prepaidName | Text | Wie das Guthaben heißt. |
Stunden prepaidHours | Zahl, größer als 0 | Wie viele Stunden gekauft wurden. |
Preis prepaidPriceAmount | Betrag, 0 oder mehr | Was dafür bezahlt wurde. |
Verfällt am prepaidExpiresAt | Datum | Wann nicht verbrauchtes Guthaben verfällt. Ohne Datum verfällt es nicht. |
Warnschwelle (%) prepaidWarnThresholdPct | Prozent | Ab welchem Verbrauch gewarnt wird — der Anlass, das nächste Paket anzubieten, bevor die Arbeit stockt. |
Positionen
| Feld | Werte / Format | Was es bewirkt |
|---|---|---|
Bezeichnung itemDescription | Text | Was abgerechnet wird. |
Art itemKind | Position, Kontingent, Sonstiges | Wofür die Zeile steht. |
Menge itemQuantity / Einheit itemUnit | Zahl, Einheit | Umfang je Periode. |
Einzelpreis itemUnitPriceAmount | Betrag | Preis je Einheit. |
Steuersatz itemTaxRate | 0 bis 100 | Der Satz dieser Position. |
Artikel itemProductId | bestehender Artikel | Verbindung zum Katalog. |
Kontingent itemQuotaId | bestehendes Kontingent | Auf welches Kontingent die Position zahlt. |
Nur über Schnittstelle und Automation
| Feld | Werte / Format | Was es bewirkt |
|---|---|---|
quoteId, quoteUlid, sourceQuoteId | Kennung eines Angebots | Erzeugt den Vertrag aus einem angenommenen Angebot und hält fest, woraus er entstanden ist. |
Einstellungen & Rechte
- Modul
module.contracts. contract.contract.view/create/edit,contract.contract.terminatefür die Kündigung,
contract.quota.view für Kontingente, contract.prepaid.manage für Vorauszahlungen, contract.config.manage für den Katalog.
- Der Abrechnungslauf hat kein eigenes Recht. Er läuft ereignis- und zeitgesteuert, nicht auf
Knopfdruck — einen Freigabe-Endpunkt gibt es nicht. contract.billing.run ist für eine spätere manuelle Freigabe vorgemerkt und bewirkt heute nichts.
- Der Status-Katalog trägt wie überall eine Lebenszyklus-Kategorie.
FAQ & Fehlerbilder
Ein Kontingent ist überzogen. Das Modul zeigt es; es verhindert es nicht. Die Entscheidung — nachverhandeln oder zusätzlich berechnen — bleibt beim Menschen.
Nach der Kündigung wird weiter abgerechnet. Prüfen Sie das Vertragsende und den zugehörigen Plan in der Abrechnung.
Ich kann nicht kündigen. Dann fehlt contract.contract.terminate.
Der Kunde sieht seinen Vertrag nicht. Prüfen Sie die Portal-Freigabe, siehe Portal-Zugänge.