Leistungen

Backend Engineering, Produkt

Branche

B2B-Marktplatz

Jahr

2022-2024

Drei Tage zu zwei Sekunden. Gleicher Vertrag. Null Fehler.

Ein B2B-Marktplatz brauchte Verträge für jede neue Listing-Vereinbarung. Der bestehende Prozess: ein Account Manager füllt eine Word-Vorlage aus, schickt sie per E-Mail an die Rechtsabteilung zur Prüfung, erhält Änderungsvorschläge zurück, übernimmt die Korrekturen, exportiert als PDF und versendet die finale Version zur Unterschrift. Durchschnittliche Bearbeitungszeit: 3 Werktage. Jeder fünfte Vertrag enthielt Feldfehler - falscher Firmenname aus dem vorherigen Vertrag übernommen, veraltete Zahlungsbedingungen, fehlende Klausel-Updates. Die Plattform brauchte Verträge, die sofort aus verifizierten Daten generiert werden, mit rechtlich genehmigten Vorlagen, die manuelle Zusammenstellung komplett eliminieren.

01.
DIE HERAUSFORDERUNG

Die Word-Dokument-Pipeline

16 Word-Vorlagen lagen auf einem geteilten Netzlaufwerk. Jede Vorlage hatte gelb markierte Platzhalterfelder, die Account Manager manuell ersetzten. Der Prozess brach auf vorhersehbare Weise: Platzhalter wurden übersehen (ein Vertrag ging einmal mit '[FIRMENNAME]' in der Kopfzeile raus), Klauselversionen drifteten zwischen Vorlagen auseinander (die Haftungsobergrenze unterschied sich in 4 Vorlagen), und Versionskontrolle existierte nicht. Wenn die Rechtsabteilung eine Klausel aktualisierte, musste jemand die Änderung manuell in alle 16 Vorlagen übertragen. Drei Monate nach einer Haftungsklausel-Aktualisierung enthielten zwei Vorlagen noch die alte Version. Es fiel niemandem auf, bis der Anwalt eines Kunden es bemerkte.

Der schnellste Weg, Vertragsfehler zu eliminieren, ist den Schritt zu eliminieren, in dem Menschen Vertragsdaten eintippen.

02.
DIE LÖSUNG

Template-Engine mit Variablen-Injektion

Verträge sind jetzt Django-Templates mit typisierten Variablen. Jede Vorlage ist ein Datenbanksatz mit Dokumentstruktur, Klauselreferenzen und Variablen-Platzhaltern. Wenn ein Account Manager auf 'Generieren' klickt, zieht das System verifizierte Daten aus dem Listing-Datensatz - Firmenname, Adresse, vereinbarte Konditionen, Preise - und injiziert sie in die Vorlage. Die Ausgabe ist ein gestyltes HTML-Dokument, das über WeasyPrint zu PDF gerendert wird. Variablen werden nie manuell eingetippt. Klauseln werden über Django Template Inheritance zwischen Vorlagen geteilt. Wenn die Rechtsabteilung eine Klausel aktualisiert, bekommt jede Vorlage, die sie erbt, das Update automatisch.

Die Vertragsgenerierungs-Pipeline:

Python
class ContractGenerator:
    def generate(self, listing, template_type):
        """Generate a contract PDF from verified data."""
        template = ContractTemplate.objects.get(
            type=template_type,
            is_active=True,
        )

        # Pull variables from verified database records
        context = {
            'company': listing.company,
            'address': listing.company.billing_address,
            'terms': listing.agreed_terms,
            'pricing': listing.pricing_schedule,
            'clauses': template.get_active_clauses(),
            'generated_at': timezone.now(),
        }

        # Validate all variables before rendering
        template.validate_context(context)

        # Render HTML → PDF
        html = render_to_string(
            template.django_template_path,
            context,
        )
        pdf = weasyprint.HTML(string=html).write_pdf()

        # Store with audit trail
        return Contract.objects.create(
            listing=listing,
            template_version=template.version,
            clause_versions=template.clause_version_map(),
            pdf_hash=hashlib.sha256(pdf).hexdigest(),
            pdf_file=ContentFile(pdf, name=f'{listing.slug}.pdf'),
        )

Einen Vertrag bauen

Vorlagentyp wählen, Variablen ausfüllen und generieren. Die Vorschau zeigt, wie typisierte Variablen (hervorgehoben) in die Dokumentstruktur injiziert werden. In Produktion rendert dies zu einem gestylten PDF in unter 2 Sekunden.

Template
Fill in the fields and click Generate
5
Variables
12
Clauses
Generation Time

Template Inheritance für Klauselverwaltung:

HTML
{# base_service_agreement.html #}
{# All 16 contract types inherit from this base #}

<h1>Service Agreement</h1>
<p>Between {{ company.name }} and Pushing Pixels.</p>

{% block scope %}
  <h2>§1 Scope of Services</h2>
  <p>{{ terms.scope_description }}</p>
{% endblock %}

{% block compensation %}
  <h2>§2 Compensation</h2>
  <p>Monthly rate: €{{ pricing.monthly_rate|floatformat:2 }}</p>
{% endblock %}

{# §3-§12: shared standard clauses #}
{% for clause in clauses %}
  <h2>§{{ clause.number }} {{ clause.title }}</h2>
  {{ clause.body|safe }}
{% endfor %}

Produktions-Absicherungen

Variablen-Validierung

Jede Variable hat eine Typ-Einschränkung und eine Validierungsregel. Firmennamen müssen in der Datenbank existieren. Geldbeträge müssen positive Zahlen sein. Datumsbereiche müssen logisch gültig sein (Enddatum nach Startdatum). Wenn eine Variable die Validierung nicht besteht, wird die Generierung mit einer spezifischen Fehlermeldung angehalten. Das fängt die Fehlerklasse ab, die den manuellen Prozess plagte: falsche Firmennamen, negative Beträge durch Copy-Paste-Fehler, abgelaufene Datumsbereiche aus vorherigen Verträgen.

Klausel-Versionierung

Jede Klausel hat eine Versionsnummer und ein Änderungsprotokoll. Wenn die Rechtsabteilung eine Klausel aktualisiert, wird die Version inkrementiert und die alte Version archiviert. Das Vertragsgenerierungsprotokoll zeichnet auf, welche Klauselversion verwendet wurde. Wenn ein Streitfall sechs Monate später auftritt, kann das System exakt rekonstruieren, welche Version jeder Klausel galt, als der Vertrag generiert wurde. Keine Zweideutigkeit, kein Durchsuchen von E-Mail-Threads.

PDF-Rendering-Konsistenz

WeasyPrint rendert HTML zu PDF mit pixelgenauer Konsistenz über alle Umgebungen. Derselbe Vertrag erzeugt das identische PDF, egal ob auf dem Dev-Server, Staging oder Produktion gerendert. Font-Embedding stellt sicher, dass das Dokument auf jedem Gerät identisch aussieht. Ein Hash jedes generierten PDFs wird neben dem Vertragsdatensatz zur Manipulationserkennung gespeichert.

03.
DAS ERGEBNIS

Verträge in Datengeschwindigkeit

Die Vertragsgenerierung sank von 3 Werktagen auf unter 2 Sekunden. Feldfehler sanken von 20% auf null - Variablen kommen aus verifizierten Datenbankeinträgen, nicht aus manuellem Tippen. Klausel-Versionsdrift wurde komplett eliminiert. Die Rechtsabteilung prüft eine Vorlageänderung einmal; sie wird automatisch auf alle 16 Vertragstypen übertragen. Das System generiert 40+ Verträge pro Woche. Account Manager verbringen ihre Zeit mit Kundenbeziehungen statt mit Word-Dokumenten.

WICHTIGE KENNZAHLEN

0< 2sGenerierungszeit
0%Feldfehler
0+Wöchentl. Verträge
WAS DER KUNDE SAGT

"Ich habe früher meinen halben Montag mit Vertragserstellung verbracht. Jetzt klicke ich einen Button und das PDF ist in meinem Postfach, bevor ich meinen Kaffee ausgetrunken habe. Die Tatsache, dass ich nicht versehentlich den falschen Firmennamen in einen Vertrag setzen kann, ist das gesamte Projekt wert."

Senior Account Manager

B2B-Marktplatz · Vertrieb

FAQ

Warum kein Vertragsmanagement-SaaS?

Wie prüft die Rechtsabteilung Vorlageänderungen?

Was ist mit Verträgen, die individuelle Klauseln brauchen?

TECHNOLOGIE-STACK