KI-Rechnungsprüfung: Automatisierung mit Claude Vision API - Von 45 Min auf 2 Min

💡 Praxis-Beispiel: Sehen Sie sich unsere Dynamics 365 Case Study an – dort zeigen wir, wie wir X-Rechnung, ZUGFeRD und PDF-Rechnungen automatisch verarbeiten und direkt in Microsoft Dynamics 365 Finance & Operations buchen.

Das Problem: Manuelle Rechnungsprüfung kostet 18.000€/Jahr

Kennen Sie das? Ihre Buchhaltung verbringt 3-4 Stunden pro Tag mit manueller Rechnungsprüfung:

  • Rechnung aus E-Mail herunterladen
  • PDF öffnen, Betrag, Datum, Rechnungsnummer ablesen
  • Daten in ERP/Buchhaltungs-Software eintippen
  • Rechnung mit Bestellung abgleichen (falls vorhanden)
  • Bei Unstimmigkeiten: E-Mail an Lieferanten
  • Rechnung archivieren (GoBD-konform)

Zeit pro Rechnung: 45 Minuten (Durchschnitt)
Fehlerquote: 8-12% (Tippfehler, falsches Feld, vergessene Rechnungen)

Beispiel: Bauunternehmen mit 1.200 Rechnungen/Jahr

Metrik Wert
Rechnungen pro Jahr 1.200
Ø Zeit pro Rechnung (manuell) 45 Min.
Gesamt-Aufwand pro Jahr 900 Stunden
Stundensatz Buchhaltung 40€/Std.
Kosten pro Jahr 36.000€
Fehler (8% von 1.200) 96 Rechnungen
Ø Korrektur-Aufwand pro Fehler 30 Min.
Fehler-Kosten pro Jahr 1.920€
GESAMT-KOSTEN 37.920€/Jahr

❌ Das Problem: Manuelle Rechnungsprüfung ist teuer, fehleranfällig und bindet Ressourcen. Ihre Buchhaltung macht keine strategische Arbeit, sondern Daten-Abtippen.


Die Lösung: KI-gestützte Automatisierung

Stellen Sie sich vor:

  1. Rechnung kommt per E-Mail rein
  2. KI extrahiert automatisch: Betrag, Datum, Rechnungsnummer, Lieferant, USt-ID
  3. KI validiert: Betrag > 0? Datum plausibel? USt-ID korrekt?
  4. KI prüft Duplikate: Wurde diese Rechnung schon erfasst?
  5. Confidence Score > 90%? → Auto-Approve + E-Mail an Prüfer
  6. Confidence Score < 90%? → Manuelle Prüfung + Felder sind schon vorausgefüllt

Zeit pro Rechnung: 2 Minuten (nur Validierung, falls Confidence < 90%)
Fehlerquote: 1-2% (nur bei schlechten Scans oder Handschrift)

Was macht die KI konkret?

Aufgabe Manuell Mit KI
Betrag extrahieren 45 Sek. 0 Sek.
Datum extrahieren 30 Sek. 0 Sek.
Rechnungsnummer finden 60 Sek. 0 Sek.
Lieferant erkennen 45 Sek. 0 Sek.
USt-ID validieren 120 Sek. 0 Sek.
Duplikate prüfen 180 Sek. 0 Sek.
Daten eintippen 300 Sek. 0 Sek.
Manuelle Validierung (nur wenn nötig) - 120 Sek. (bei 10% der Rechnungen)
GESAMT 780 Sek. (13 Min.) 12 Sek. Ø

Zeitersparnis: 768 Sekunden (12,8 Min.) pro Rechnung = 98,5% schneller


ROI-Berechnung: 127% im ersten Jahr

Ausgangssituation (wie oben)

  • 1.200 Rechnungen/Jahr
  • 900 Stunden manueller Aufwand
  • 36.000€ Personalkosten
  • 1.920€ Fehler-Kosten
  • GESAMT: 37.920€/Jahr

Mit KI-Rechnungsprüfung

Kosten-Position Betrag
Implementierung (einmalig)
Intrexx-Entwicklung (5 Tage) 6.000€
n8n-Workflow (2 Tage) 2.400€
Testing + Rollout (1 Tag) 1.200€
Summe Implementierung 9.600€
Laufende Kosten (Jahr 1)
Claude Vision API (1.200 Rechnungen à 0,30€) 360€
n8n Cloud (optional, kann auch self-hosted 0€) 240€
Intrexx-Lizenz (Anteil für Rechnungen, 10%) 1.200€
Manuelle Validierung (10% der Rechnungen, 120 Std.) 4.800€
Summe laufende Kosten 6.600€
GESAMT Jahr 1 (Impl. + Laufend) 16.200€

ROI-Rechnung

Metrik Wert
Kosten vorher (manuell) 37.920€
Kosten nachher (Jahr 1) 16.200€
Ersparnis Jahr 1 21.720€
Investition (Impl. + Jahr 1 laufend) 16.200€
Nutzen (Ersparnis Jahr 1) 21.720€
ROI Jahr 1 127%
Break-Even 8,5 Monate
Ersparnis ab Jahr 2 (jährlich) 31.320€

✅ ROI-Zusammenfassung

  • 21.720€ Ersparnis im ersten Jahr
  • 127% ROI (für jeden investierten Euro gibt es 2,27€ zurück)
  • Break-Even nach 8,5 Monaten
  • 31.320€ Ersparnis ab Jahr 2 (jährlich wiederkehrend)
  • 3-Jahres-ROI: 74.960€ Gesamtersparnis bei 16.200€ Investition = 363% ROI

Technische Architektur (Intrexx + n8n + Claude)

┌─────────────────────────────────────────────────────────┐
│              EINGANGSRECHNUNG (E-Mail/Upload)           │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│                  INTREXX (Low-Code)                     │
│  • PDF-Upload via Drag-&-Drop                           │
│  • Datenbank-Eintrag erstellt (Status: "Neu")          │
│  • afterSave-Trigger feuert Groovy Hook                │
└────────────────────────┬────────────────────────────────┘
                         │
                         │ Groovy Hook sendet:
                         │ - PDF (Base64)
                         │ - Invoice ID
                         │ - Supplier Name (falls bekannt)
                         ▼
┌─────────────────────────────────────────────────────────┐
│                   n8n WEBHOOK NODE                      │
│  • Empfängt Request von Intrexx                         │
│  • Validiert API-Key                                    │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│              n8n: BASE64 → BINARY NODE                  │
│  • PDF dekodieren                                       │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│           CLAUDE VISION API (OCR + EXTRAKTION)          │
│  Prompt:                                                │
│  "Extrahiere aus dieser Rechnung:                       │
│   1. Rechnungsnummer                                    │
│   2. Rechnungsbetrag (Brutto in EUR)                    │
│   3. Rechnungsdatum (Format: YYYY-MM-DD)                │
│   4. Lieferant (Firma)                                  │
│   5. USt-ID                                             │
│   6. Confidence Score (0-100%)                          │
│                                                         │
│   Antwort als JSON."                                    │
└────────────────────────┬────────────────────────────────┘
                         │
                         │ Response:
                         │ {
                         │   "invoice_number": "RE-2026-001",
                         │   "amount": 1234.56,
                         │   "date": "2026-01-10",
                         │   "supplier": "Baustoff GmbH",
                         │   "vat_id": "DE123456789",
                         │   "confidence": 96
                         │ }
                         ▼
┌─────────────────────────────────────────────────────────┐
│              n8n: VALIDATION NODE                       │
│  • Betrag > 0?                                          │
│  • Datum in Vergangenheit < 90 Tage?                    │
│  • Rechnungsnummer nicht leer?                          │
│  • USt-ID-Format korrekt (DE + 9 Ziffern)?             │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│           n8n: DUPLIKATE-CHECK NODE                     │
│  • Query Intrexx DB: Gibt es schon Rechnung mit        │
│    gleicher Rechnungsnummer?                            │
│  • Gibt es Rechnung mit gleichem Betrag + Lieferant    │
│    + Datum (±3 Tage)?                                   │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│               n8n: IF NODE (Confidence)                 │
│  Confidence > 90% && Keine Duplikate?                   │
│    ├─ JA: Status = "Auto-Approved"                      │
│    └─ NEIN: Status = "Manuelle Prüfung"                 │
└────────────────────────┬────────────────────────────────┘
                         │
                         │ Callback an Intrexx REST API
                         │ (Extrahierte Daten + Status)
                         ▼
┌─────────────────────────────────────────────────────────┐
│                INTREXX REST API HANDLER                 │
│  • Datenbank-Update:                                    │
│    - invoice_number = "RE-2026-001"                     │
│    - amount = 1234.56                                   │
│    - invoice_date = "2026-01-10"                        │
│    - supplier_name = "Baustoff GmbH"                    │
│    - vat_id = "DE123456789"                             │
│    - ai_confidence = 96                                 │
│    - processing_status = "Auto-Approved"                │
│  • Workflow-Trigger: E-Mail an Prüfer                   │
└────────────────────────┬────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────┐
│                 USER NOTIFICATION                       │
│  E-Mail: "Rechnung RE-2026-001 geprüft (Auto-Approved)"│
│  Link: https://intrexx.firma.de/invoices/1234          │
└─────────────────────────────────────────────────────────┘

Technologie-Stack

Komponente Technologie Funktion
Frontend + DB Intrexx Upload-Formular, Datenbank, User-Interface
Workflow-Engine n8n Orchestrierung (Claude API, Validierung, Callback)
KI-Engine Claude Vision API OCR + Datenextraktion aus PDF
Integration Layer Webhooks (HTTPS + API-Key) Intrexx ↔ n8n Kommunikation
Archivierung Intrexx DMS (GoBD-konform) PDF/A-Export, 10 Jahre Aufbewahrung

Implementierung in 3 Wochen (Schritt-für-Schritt)

Woche 1: Setup & Foundation

Tag 1-2: Intrexx Datenbank + UI

  1. Datenbank-Tabelle invoices erstellen:
    • id (Primary Key)
    • invoice_number (VARCHAR 50)
    • amount (DECIMAL 10,2)
    • invoice_date (DATE)
    • supplier_name (VARCHAR 200)
    • vat_id (VARCHAR 20)
    • invoice_pdf (FILE)
    • processing_status (VARCHAR 50)
    • ai_confidence (INT 0-100)
    • created_at, updated_at (DATETIME)
  2. Upload-Formular bauen (Drag-&-Drop für PDF)
  3. Übersichts-Seite (Tabelle mit allen Rechnungen)
  4. Detail-Seite (einzelne Rechnung anzeigen + PDF-Preview)

Tag 3: n8n Setup

  1. n8n installieren (Docker oder Cloud)
  2. Ersten Webhook erstellen (Test mit Postman)
  3. Claude API-Key in n8n hinterlegen

Tag 4-5: Intrexx Groovy Hook

  1. afterSave-Event Handler in Intrexx
  2. Groovy Script schreiben (PDF → Base64 → n8n Webhook)
  3. Error-Handling (Try-Catch, Logging)

Woche 2: n8n Workflow + KI-Integration

Tag 6-7: n8n Workflow bauen

  1. Webhook Node (Empfang von Intrexx)
  2. Function Node (Base64 → Binary)
  3. Claude Vision Node (OCR + Extraktion)
  4. Function Node (JSON-Parsing + Validierung)
  5. IF Node (Confidence > 90%?)

Tag 8: Duplikate-Check

  1. HTTP Request Node (Intrexx REST API Query)
  2. Function Node (Duplikate-Logik: Rechnungsnummer + Betrag+Datum)
  3. IF Node (Duplikat gefunden?)

Tag 9-10: Callback an Intrexx

  1. HTTP Request Node (Intrexx REST API Update)
  2. Error-Trigger Node (bei Fehlern: Slack/E-Mail Alert)
  3. Testing (10 Test-Rechnungen durchlaufen lassen)

Woche 3: Testing, Optimierung, Rollout

Tag 11-12: User Acceptance Testing

  1. 50 echte Rechnungen durchlaufen lassen
  2. Fehleranalyse (welche Rechnungen hatten Confidence <90%?)
  3. Prompt-Optimierung (Claude Prompt anpassen für bessere Extraktion)

Tag 13: GoBD-Archivierung

  1. PDF/A-Konvertierung in Intrexx aktivieren
  2. Audit-Log (wer hat wann welche Rechnung validiert?)
  3. Backup-Strategie testen

Tag 14-15: Training & Rollout

  1. User-Training (Buchhaltung): Wie funktioniert das System?
  2. Dokumentation schreiben (Prozess-Diagramm, FAQ)
  3. Go-Live: System für alle Mitarbeiter freischalten

✅ Nach 3 Wochen: System ist live. Erste Rechnungen werden automatisch verarbeitet. Buchhaltung spart ab Tag 1 Zeit.


Code-Beispiele (Groovy, n8n, Claude Prompt)

1. Intrexx Groovy Hook (afterSave)

// ==========================================
// Intrexx Event Handler: afterSave
// Trigger: Rechnung wurde hochgeladen
// ==========================================

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

def invoiceFile = g_record.getFile("invoice_pdf")
if (invoiceFile == null) {
    g_log.error("Keine Rechnung gefunden für ID: ${g_record.getIntegerValue('id')}")
    return
}

// PDF zu Base64 konvertieren
def invoiceBase64 = invoiceFile.getBytes().encodeBase64().toString()

// n8n Webhook URL (aus Intrexx Config)
def n8nWebhookUrl = "https://n8n.your-company.de/webhook/invoice-check"
def apiKey = "YOUR_SECRET_API_KEY"

// Payload erstellen
def payload = [
    invoice_id: g_record.getIntegerValue("id"),
    pdf_base64: invoiceBase64,
    supplier_name: g_record.getStringValue("supplier_name") ?: "",
    upload_timestamp: new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'")
]

try {
    def connection = new URL(n8nWebhookUrl).openConnection()
    connection.setRequestMethod("POST")
    connection.doOutput = true
    connection.setRequestProperty("Content-Type", "application/json")
    connection.setRequestProperty("X-API-Key", apiKey)
    connection.setConnectTimeout(5000)  // 5 Sek.
    connection.setReadTimeout(30000)    // 30 Sek.

    def writer = new OutputStreamWriter(connection.outputStream, "UTF-8")
    writer.write(JsonOutput.toJson(payload))
    writer.flush()
    writer.close()

    def responseCode = connection.responseCode

    if (responseCode == 200) {
        def response = connection.inputStream.text
        def json = new JsonSlurper().parseText(response)

        g_record.setValue("processing_status", "In Verarbeitung")
        g_record.setValue("n8n_workflow_id", json.workflow_id ?: "")

        g_log.info("n8n Workflow gestartet für Invoice ID: ${g_record.getIntegerValue('id')}")
    } else {
        g_log.error("n8n HTTP Error ${responseCode} für Invoice ID: ${g_record.getIntegerValue('id')}")
        g_record.setValue("processing_status", "Fehler beim Senden")
    }

} catch (Exception e) {
    g_log.error("n8n Request fehlgeschlagen: ${e.message}")
    g_record.setValue("processing_status", "Fehler: ${e.message}")
}

2. Claude Vision Prompt (in n8n)

// n8n Node: Claude Vision API Call

{
  "model": "claude-3-7-sonnet-20250219",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image",
          "source": {
            "type": "base64",
            "media_type": "application/pdf",
            "data": "{{ $json.pdf_base64 }}"
          }
        },
        {
          "type": "text",
          "text": `Du bist ein Experte für Rechnungsprüfung.
Extrahiere aus dieser Rechnung folgende Daten:

1. **Rechnungsnummer** (z.B. RE-2026-001, Inv-12345, etc.)
2. **Rechnungsbetrag** (Brutto in EUR, nur die Zahl)
3. **Rechnungsdatum** (Format: YYYY-MM-DD)
4. **Lieferant** (Firmenname)
5. **USt-ID** (Format: DE + 9 Ziffern, z.B. DE123456789)
6. **Confidence Score** (0-100%): Wie sicher bist du bei der Extraktion?

WICHTIG:
- Wenn ein Feld nicht gefunden werden kann: null
- Betrag ohne € Symbol, nur Zahl (z.B. 1234.56)
- Datum im ISO-Format (YYYY-MM-DD)
- Confidence Score: 100% = absolut sicher, 50% = unsicher

Antwort als JSON (ohne Erklärung):

{
  "invoice_number": "...",
  "amount": 1234.56,
  "date": "2026-01-10",
  "supplier": "Firma XY GmbH",
  "vat_id": "DE123456789",
  "confidence": 95
}`
        }
      ]
    }
  ]
}

3. n8n Duplikate-Check (Function Node)

// n8n Function Node: Duplikate-Check

const extractedData = $input.first().json;
const invoiceNumber = extractedData.invoice_number;
const amount = extractedData.amount;
const date = extractedData.date;
const supplier = extractedData.supplier;

// Intrexx REST API abfragen (vorherige Node hat Datenbank-Abfrage gemacht)
const existingInvoices = $('Intrexx_Query').all();

let isDuplicate = false;
let duplicateReason = "";

// Check 1: Rechnungsnummer exakt gleich
for (const invoice of existingInvoices) {
    if (invoice.json.invoice_number === invoiceNumber) {
        isDuplicate = true;
        duplicateReason = `Duplikat: Rechnungsnummer ${invoiceNumber} existiert bereits (ID: ${invoice.json.id})`;
        break;
    }
}

// Check 2: Betrag + Lieferant + Datum (±3 Tage) gleich
if (!isDuplicate) {
    const invoiceDate = new Date(date);

    for (const invoice of existingInvoices) {
        const existingDate = new Date(invoice.json.invoice_date);
        const daysDiff = Math.abs((invoiceDate - existingDate) / (1000 * 60 * 60 * 24));

        if (
            invoice.json.amount === amount &&
            invoice.json.supplier_name === supplier &&
            daysDiff <= 3
        ) {
            isDuplicate = true;
            duplicateReason = `Duplikat-Verdacht: Gleicher Betrag (${amount}€) vom gleichen Lieferanten (${supplier}) am ${date} (±3 Tage)`;
            break;
        }
    }
}

return {
    ...extractedData,
    is_duplicate: isDuplicate,
    duplicate_reason: duplicateReason
};

Häufig gestellte Fragen (FAQ)

Wie genau ist Claude Vision bei Rechnungen?
+

Claude Vision erreicht bei strukturierten Rechnungen (Standard-Layouts wie DATEV, Lexware) 95-98% Genauigkeit für Betrag, Datum, Rechnungsnummer.

Bei unstrukturierten Rechnungen (handschriftliche Notizen, Scans schlechter Qualität) 85-92%.

Zum Vergleich: Menschen machen bei manueller Erfassung 8-12% Fehler (Tippfehler, falsche Felder).

Best Practice: 4-Augen-Prinzip – KI extrahiert, Mensch validiert bei Confidence Score <90%.

Was kostet eine KI-Rechnungsprüfung im Vergleich zu DocuWare oder ABBYY?
+

DIY mit Claude Vision API: 0,30€ pro Rechnung (OCR + Extraktion)

Kommerzielle Lösungen:

  • DocuWare: 2-5€/Rechnung
  • ABBYY FlexiCapture: 1,50-3€/Rechnung
  • Candis/Moss: 1-2€/Rechnung

Bei 300 Rechnungen/Monat:
Claude API: 1.080€/Jahr
vs. DocuWare: 7.200-18.000€/Jahr
Ersparnis: 85-94%

Zusätzliche Kosten DIY-Ansatz:

  • Intrexx-Lizenz: ab 12.000€/Jahr (wird aber meist schon für andere Use Cases genutzt)
  • n8n: 0€ (self-hosted)
  • Entwicklung: 5-10 Tage à 1.200€ = 6.000-12.000€ einmalig

Break-Even: 5-8 Monate

Kann die KI auch GoBD-konforme Archivierung?
+

Die KI extrahiert nur Daten – GoBD-konforme Archivierung macht Intrexx (DMS-Modul).

Anforderungen GoBD:

  • Unveränderbarkeit: PDF/A-Konvertierung
  • Versionierung: Audit-Log bei Änderungen
  • Nachvollziehbarkeit: Wer hat wann was gemacht?
  • 10 Jahre Aufbewahrung: Backup-Strategie

Intrexx erfüllt alle Punkte:

  • PDF/A-Export (automatisch bei Upload)
  • Datenbank-Trigger für Audit-Logs
  • Rechte-Management (nur Finance darf löschen)
  • Automatisches Backup (täglich)

Optional: Zertifizierte Archiv-Systeme (d.velop d3, ELO) via Intrexx-Integration anbinden.

Was passiert bei Rechnungen in Fremdsprachen?
+

Claude Vision unterstützt 100+ Sprachen (Englisch, Französisch, Spanisch, Italienisch, Polnisch, Türkisch, etc.).

Genauigkeit:

  • Englisch/Französisch: 95%+
  • Osteuropäische Sprachen: 90-93%

Best Practice: Prompt in Englisch schreiben, Output-Sprache auf Deutsch forcieren.

Beispiel:
Extract invoice data from this document (language: French). Return all values in German. Amount in EUR (convert if needed).

Bei häufigen Fremdsprachen-Rechnungen:

  • Separate n8n-Workflows pro Sprache (optimierte Prompts)
  • Auto-Detection via Language-Detection-Node (Zeile 1 der Rechnung analysieren)
Wie verhindere ich doppelte Rechnungen?
+

3-Stufen-Duplikate-Check:

1) Rechnungsnummer-Abgleich
SQL-Query in Intrexx: SELECT COUNT(*) WHERE invoice_number = ?

2) Betrag + Lieferant + Datum-Kombination
Gleicher Betrag am gleichen Tag vom gleichen Lieferant = 95% Duplikat

3) Semantic Search mit Embeddings
Claude erzeugt Vektor-Repräsentation der Rechnung, Similarity-Check gegen alle Rechnungen der letzten 12 Monate, Threshold >0.92 = Duplikat-Warnung

Umsetzung in n8n:
3 IF-Nodes, bei Duplikat-Verdacht: Status "Manuelle Prüfung" + E-Mail an Finance + Link zu beiden Rechnungen im UI.


🚀 Bereit für automatische Rechnungsprüfung?

Wir haben dieses System bei 8 Kunden implementiert – durchschnittlicher ROI: 143% im ersten Jahr.

Nächster Schritt: Kostenloses 30-Min. Beratungsgespräch

Jetzt Termin vereinbaren

Weiterführende Artikel: