{
  "slug": "rechnungs-strecke",
  "category": "workflow",
  "name": "The Invoice Pipeline",
  "domaene": "Daten, Analytics & Finanzen",
  "typTags": [
    "automatisierend",
    "prüfend",
    "datenbezogen"
  ],
  "teaser": "A workflow that reads incoming PDF invoices, matches them against purchase orders in the ERP, and books matches automatically while routing discrepancies to the finance team for manual review.",
  "hat": {
    "schritte": true,
    "beispiel_szenario": false,
    "ausgabebeispiel": false,
    "konfiguration": false,
    "betrieb": true,
    "arbeitsprompts": true,
    "einrichtung": true,
    "umsetzung": false,
    "export": true,
    "staerken": false,
    "ki_funktionen": false,
    "einschraenkungen": false,
    "weniger_geeignet_fuer": false
  },
  "sections": [
    {
      "id": "description",
      "title": "Description",
      "html": "<p>Incoming invoices are a quiet time sink in many small and mid sized companies: PDFs sitting in an inbox, line items typed in by hand, matching against the purchase order by eye, and weeks passing before anything gets booked. The Invoice Pipeline takes this process off your hands. It reads every incoming invoice, matches it in a structured way against purchase order data and goods receipt in the ERP, and triggers the booking in the accounting system on a match.</p>\n<p>What gets automated is the extraction of invoice data into a clean JSON format, and the matching against supplier, amount, description of goods or services, and purchase order number within a defined tolerance. What deliberately stays out of automation is the decision on discrepancies: if something falls outside the tolerance window, the case goes to the finance team with full details instead of being booked through automatically. Every step, from extraction to the booking decision, is also recorded in an audit log, so the pipeline stays traceable instead of becoming a black box.</p>\n<p>The result is not a fully autonomous accounting agent but a pre sorting layer with a clear boundary: routine invoices go straight through, anything unusual lands with a person. This noticeably shortens the turnaround time and, as a side effect, creates room to actually make use of early payment discount deadlines.</p>\n<ul>\n<li><strong>Faster turnaround:</strong> Invoices are processed in minutes instead of sitting in the inbox for days.</li>\n<li><strong>Fewer errors:</strong> Automatic matching between invoice, purchase order, and goods receipt reduces typing mistakes and things that get overlooked.</li>\n<li><strong>Finance relieved:</strong> Routine invoices are booked automatically, only discrepancies go to the finance team for review.</li>\n<li><strong>Discounts captured:</strong> The short turnaround time creates room to actually meet early payment discount deadlines.</li>\n</ul>\n"
    },
    {
      "id": "builder-prompt",
      "title": "Builder Prompt",
      "html": "<p>Copy the prompt below in full into your automation tool or agent builder. As a file: <a href=\"/ai-library/rechnungs-strecke.en.json\">rechnungs-strecke.en.json</a></p>\n"
    }
  ],
  "schritte": [
    {
      "nr": 1,
      "titel": "Trigger",
      "beschreibung": "The process starts as soon as a new email with a PDF invoice arrives in the invoice inbox.",
      "rolle": "mensch"
    },
    {
      "nr": 2,
      "titel": "Extract data",
      "beschreibung": "A language model reads the invoice and returns invoice number, supplier, amounts, due date, IBAN, and purchase order number as structured JSON.",
      "rolle": "automatisch"
    },
    {
      "nr": 3,
      "titel": "Match against purchase order",
      "beschreibung": "The extracted data is checked against the purchase order data in the ERP: supplier, amount within the defined tolerance, description of goods or services, and purchase order number.",
      "rolle": "automatisch"
    },
    {
      "nr": 4,
      "titel": "Match decision",
      "beschreibung": "The process evaluates whether all criteria fall within the tolerance range and derives the further route from that.",
      "rolle": "automatisch"
    },
    {
      "nr": 5,
      "titel": "Book automatically",
      "beschreibung": "On a match, the invoice is booked in the accounting system with the matching cost center and account.",
      "rolle": "ergebnis"
    },
    {
      "nr": 6,
      "titel": "Escalation",
      "beschreibung": "On a discrepancy, a ticket or message with full details goes to the finance team for manual review.",
      "rolle": "mensch"
    },
    {
      "nr": 7,
      "titel": "Audit log",
      "beschreibung": "The incoming email, the extracted JSON, the match result, and the final status are logged.",
      "rolle": "ergebnis"
    }
  ],
  "herausgeber": "Voyage Digital",
  "version": "2.0",
  "stand": "2026-07-26",
  "nutzen": [
    {
      "titel": "Faster turnaround",
      "text": "Invoices are processed in minutes instead of sitting in the inbox for days."
    },
    {
      "titel": "Fewer errors",
      "text": "Automatic matching between invoice, purchase order, and goods receipt reduces typing mistakes and things that get overlooked."
    },
    {
      "titel": "Finance relieved",
      "text": "Routine invoices are booked automatically, only discrepancies go to the finance team for review."
    },
    {
      "titel": "Discounts captured",
      "text": "The short turnaround time creates room to actually meet early payment discount deadlines."
    }
  ],
  "voraussetzungen": [
    {
      "label": "Invoice inbox",
      "text": "A dedicated address for incoming PDFs, for example invoices@company.com.",
      "icon": "mail"
    },
    {
      "label": "ERP or purchase order system",
      "text": "SAP, Dynamics, or Odoo supplies the purchase order data and goods receipts.",
      "icon": "inventory"
    },
    {
      "label": "Accounting system",
      "text": "DATEV, Lexoffice, or a comparable system books the approved invoices.",
      "icon": "account_balance"
    },
    {
      "label": "LLM access and team chat",
      "text": "Access to OpenAI, Claude, or Gemini for extraction and matching, plus Slack or Teams for escalations.",
      "icon": "key"
    }
  ],
  "betrieb": {
    "testing": [
      {
        "label": "Test invoices",
        "text": "Test a real invoice with a matching purchase order and a second one with a deviating amount.",
        "icon": "receipt_long"
      },
      {
        "label": "Extraction",
        "text": "Check whether invoice number, supplier, amounts, IBAN, and purchase order number are correct in the JSON.",
        "icon": "document_scanner"
      },
      {
        "label": "Matching and booking",
        "text": "Check whether the tolerance applies correctly and the right invoice actually gets booked.",
        "icon": "rule"
      },
      {
        "label": "Edge cases",
        "text": "Test poor scans, missing purchase order numbers, foreign currency, and duplicate submissions.",
        "icon": "warning"
      }
    ],
    "goLive": [
      {
        "label": "Approval",
        "text": "Activate the workflow only once extraction, matching, and booking are reliably correct.",
        "icon": "check_circle"
      },
      {
        "label": "Pilot",
        "text": "Start with a single top supplier and roll out step by step from there.",
        "icon": "store"
      },
      {
        "label": "Mapping and tolerance",
        "text": "Fine tune the account or cost center mapping and the tolerance value iteratively.",
        "icon": "tune"
      },
      {
        "label": "Expand",
        "text": "Add duplicate detection, a tiered approval workflow above a threshold, and reporting as a next step.",
        "icon": "rocket_launch"
      }
    ],
    "haeufigeFehler": [
      {
        "label": "Poor OCR quality",
        "text": "Use a stronger model or enforce a higher minimum scan resolution.",
        "icon": "broken_image"
      },
      {
        "label": "Tolerance value too narrow or too wide",
        "text": "Calibrate the value against real invoices from the past.",
        "icon": "straighten"
      },
      {
        "label": "Missing purchase order number",
        "text": "Use fallback matching by supplier, amount, and date.",
        "icon": "link_off"
      },
      {
        "label": "Duplicate booking",
        "text": "Check invoice number and supplier together as a unique key.",
        "icon": "content_copy"
      }
    ]
  },
  "arbeitsprompts": [
    {
      "titel": "Invoice Data Extraction",
      "beschreibung": "Reads the incoming invoice and returns all relevant fields as structured JSON.",
      "prompt": "You are an expert in invoice analysis. Analyze the following invoice and extract all relevant data into a structured JSON format. If a detail is not unambiguously stated in the invoice text, mark it as an assumption rather than presenting it as certain.\n\nINVOICE:\n[INVOICE_TEXT]\n\nExtract the following information:\n- Invoice number\n- Supplier/issuer (name and address)\n- Invoice date\n- Due date\n- Net amount\n- VAT rate and amount\n- Gross amount (total)\n- Description of goods or services/line items\n- Purchase order number (if available)\n- IBAN/bank details\n\nOUTPUT FORMAT (JSON):\n{\n  \"invoice_number\": \"...\",\n  \"supplier\": {\"name\": \"...\", \"address\": \"...\"},\n  \"invoice_date\": \"YYYY-MM-DD\",\n  \"due_date\": \"YYYY-MM-DD\",\n  \"net_amount\": 0.00,\n  \"vat_rate\": 0.00,\n  \"vat_amount\": 0.00,\n  \"gross_amount\": 0.00,\n  \"line_items\": [\"Item 1\", \"Item 2\"],\n  \"purchase_order_number\": \"...\",\n  \"iban\": \"...\"\n}\n\nIf information is not available, set the value to null. Use correct number formats with a period as the decimal separator."
    },
    {
      "titel": "Discrepancy Analysis",
      "beschreibung": "Compares the extracted invoice data with the purchase order data and returns a structured recommendation.",
      "prompt": "You are an expert in invoice auditing. Compare the extracted invoice data with the purchase order data and identify discrepancies. Explicitly mark any assessment for which relevant information is missing as an assumption.\n\nINVOICE DATA:\n[INVOICE_DATA_JSON]\n\nPURCHASE ORDER DATA:\n[PURCHASE_ORDER_DATA_JSON]\n\nCHECK CRITERIA:\n- Supplier matches\n- Amount deviates by no more than [TOLERANCE_PERCENT]%\n- Description of goods or services matches the purchase order\n- Purchase order number is correct (if available)\n\nOUTPUT:\nCreate a structured analysis in the following JSON format:\n{\n  \"discrepancies_found\": true/false,\n  \"details\": [\n    {\"category\": \"Amount/Supplier/Service\", \"description\": \"...\", \"severity\": \"critical/medium/low\"}\n  ],\n  \"recommendation\": \"book_automatically\" or \"manual_review_required\",\n  \"rationale\": \"...\"\n}\n\nBe precise and state concrete figures for discrepancies. Amounts with a deviation below [TOLERANCE_PERCENT]% are considered correct."
    }
  ],
  "prompt": "GOAL\nBuild a workflow that automatically extracts invoice data from incoming PDF invoices, matches it against purchase order data and goods receipt in the ERP, and triggers the booking in the accounting system on a match. On discrepancies, the workflow notifies the finance team with full details and flags the case for manual review instead of booking it through automatically.\n\nAdapt the structure to the concepts of your automation tool (for example nodes, steps, zaps, or agent actions). While doing so, preserve the trigger logic, the sequence, the branching, and the data flow.\n\nTRIGGER\nType: new email with a PDF attachment in the dedicated invoice inbox, for example invoices@company.com.\nFilter: only attachments of type PDF, other emails are ignored.\n\nSTEPS\n1. Read the PDF: obtain the text via OCR or extraction from the attachment.\n2. AI step: data extraction. Use exactly the Invoice Data Extraction working prompt (see the Working Prompts section). Output: JSON with all invoice fields.\n3. Duplicate check: check invoice number and supplier together as a unique key against already processed invoices. On a duplicate, jump directly to step 7 and flag the case as a duplicate.\n4. Load purchase order data: load the purchase order data via the purchase order number from the ERP (SAP, Dynamics, or Odoo). If the purchase order number is missing, use matching by supplier, amount, and date as a fallback.\n5. AI step: matching. Use exactly the Discrepancy Analysis working prompt (see the Working Prompts section) with the invoice JSON and the purchase order JSON as input. Output: JSON with a recommendation.\n6. Branch: if the recommendation is book_automatically, trigger the booking in the accounting system (DATEV, Lexoffice, or comparable) with cost center and account mapping.\n7. Otherwise, or on a duplicate or a missing purchase order: escalate to the finance team via ticket or a message in Slack or Teams, with invoice data, purchase order data, and all discrepancy details. Flag the case for manual review.\n8. Both branches: log the incoming email, the extracted JSON, the match result, and the final status in the audit log.\n\nPROMPTS\nTake over both working prompts from the section of the same name unchanged and in full. Do not alter the placeholders they contain, and map them as described in the data flow.\n\nDATA FLOW\nStep 1 to step 2: extracted invoice text.\nStep 2 to steps 3, 4, and 5: invoice JSON.\nStep 4 to step 5: purchase order data as purchase order JSON.\nStep 5 to steps 6 and 7: the recommendation, discrepancies found, details, and rationale fields from the match result.\n\nERROR HANDLING\nIncomplete extraction, for example a missing invoice number or gross amount: do not book, escalate instead, and state the cause in the review note.\nNo purchase order found, even with fallback matching: do not book, escalate instead.\nDuplicate detected: do not book, escalate as a duplicate instead.\nForeign currency or an unusual format: escalate for manual review.\nPrinciple: when in doubt, never book automatically, escalate instead.\n\nPLACEHOLDER CONVENTION\nAll placeholders in square brackets inside the two working prompts are mapped dynamically, as described in the data flow. The tolerance percentage in the matching prompt is not dynamic: you set it yourself before activation, calibrated against real invoices from the past. List all placeholders that require manual configuration separately at the end.\n\nSELF CHECK BEFORE COMPLETION\nCheck, before you report the workflow as finished:\n1. Are all steps connected correctly, in particular the branch between booking and escalation and the audit log in both branches?\n2. Are both working prompts inserted in full and unchanged, and is the tolerance percentage mapped?\n3. Do the duplicate check and the fallback matching work as described?\n4. Are all points listed that require manual configuration: invoice inbox, ERP and accounting system access, cost center and account mapping, tolerance percentage, and escalation channel?",
  "einrichtung": {
    "intro": "Two routes lead to the same result. Pick the one that fits your setup.",
    "varianten": [
      {
        "variante": "Builder-Prompt",
        "einleitung": "Suitable when you want to build the workflow in your own automation tool.",
        "schritte": [
          "Open your workflow tool, for example n8n, Make, Zapier or Langdock.",
          "Create a new workflow and give it a name.",
          "Choose the AI-assisted build option if your tool offers one.",
          "Paste the builder prompt from above in full.",
          "Check the result against the step sequence in this document, then add your access credentials and channels."
        ]
      },
      {
        "variante": "JSON-Import",
        "einleitung": "Suitable when you want to take the workflow over unchanged.",
        "schritte": [
          "Download the JSON file from the JSON export section.",
          "Open the workflow area of your tool and create a new workflow.",
          "Give it a name and confirm.",
          "Open the menu on the workflow name and choose to import a JSON file.",
          "Upload the file, then add your own access credentials.",
          "Run a test before you activate the workflow."
        ]
      }
    ]
  },
  "exportMeta": {
    "datei": "w21_rechnungs-strecke__workflow.json",
    "format": "voyage-workflow/1"
  },
  "download": {
    "schema": "voyage-workflow/1",
    "name": "Die Rechnungs-Strecke",
    "beschreibung": "Liest eingehende PDF-Rechnungen automatisch aus und gleicht sie gegen Bestelldaten aus dem ERP ab. Passt alles zusammen, bucht der Referenz-Export direkt im Buchhaltungssystem, bei einer Abweichung geht der Fall mit allen Details als Slack-Nachricht an das Buchhaltungsteam. Ein Duplikats-Check, ein Fallback-Matching ohne Bestellnummer und ein Audit-Log sind im Referenz-Export nicht als eigene Schritte angelegt, sie sind beim Nachbau als Ergänzung vorgesehen.",
    "trigger": {
      "typ": "E-Mail-Eingang über eine Gmail-Integration",
      "bedingung": "Der Lauf startet, sobald im verbundenen Gmail-Postfach eine E-Mail eintrifft, die den hinterlegten Suchfilter erfüllt, zum Beispiel Betreff enthält Rechnung mit Anhang, ein bestimmter Absender mit PDF-Anhang oder das Label rechnungen mit Anhang. Der Trigger-Knoten ist auf die Fehlerstrategie stop gesetzt, ein Fehler an dieser Stelle beendet den Lauf sofort."
    },
    "schritte": [
      {
        "nr": 1,
        "titel": "Trigger",
        "rolle": "mensch",
        "aktion": "Der Lauf startet, sobald im verbundenen Gmail-Postfach eine neue E-Mail eintrifft, die den hinterlegten Suchfilter erfüllt, zum Beispiel Betreff enthält Rechnung mit Anhang, ein bestimmter Absender mit PDF-Anhang oder das Label rechnungen mit Anhang. Andere E-Mails werden ignoriert. Der Trigger-Knoten ist auf die Fehlerstrategie stop gesetzt.",
        "prompt_ref": null,
        "eingang": [],
        "ausgang": [
          "PDF-Anhang",
          "Absender und Betreff der E-Mail"
        ]
      },
      {
        "nr": 2,
        "titel": "Daten extrahieren",
        "rolle": "automatisch",
        "aktion": "Ein KI-Knoten liest den PDF-Anhang direkt aus, inklusive automatisch aktivierter OCR für gescannte Rechnungen, und arbeitet dabei mit dem Arbeitsprompt Rechnungsdaten-Extraktion. Das hinterlegte Ausgabeschema liefert die strukturierten Felder invoice_number, supplier, amount_net, amount_gross, invoice_date, description, vat_rate und vat_amount, dazu output als Freitext-Zusammenfassung und success als Erfolgsflag. Bestellnummer, IBAN und Fälligkeitsdatum fragt der Arbeitsprompt zwar ab, sie sind im hinterlegten Ausgabeschema aber nicht als eigene Felder angelegt, wer damit strukturiert weiterarbeiten will, ergänzt sie dort. Auch dieser Knoten ist auf stop gesetzt.",
        "prompt_ref": "arbeitsprompt-1",
        "eingang": [
          "PDF-Anhang"
        ],
        "ausgang": [
          "invoice_number, supplier, amount_net, amount_gross, invoice_date, description, vat_rate, vat_amount, output, success"
        ]
      },
      {
        "nr": 3,
        "titel": "Abgleich gegen Bestellung",
        "rolle": "automatisch",
        "aktion": "Ein Code-Knoten vergleicht die extrahierten Daten mit den Bestelldaten aus dem ERP. Im Referenz-Export sind die ERP-Daten simuliert, produktiv ersetzt ein API-Call an das ERP-System, etwa SAP, Dynamics oder Odoo, diesen Teil. Geprüft werden Lieferant, Betrag innerhalb einer im Code fest hinterlegten Toleranz von 5 Prozent sowie die Leistungsbeschreibung, Abweichungen werden nach Schweregrad eingestuft: hoch für Lieferant oder Betrag, mittel für die Leistungsbeschreibung. Die Prüfung läuft als deterministischer Code, nicht als KI-Aufruf, der Arbeitsprompt Abweichungsanalyse dokumentiert die Alternative für Tools, die diesen Schritt lieber über ein Sprachmodell abbilden. Ein separater Duplikats-Check und ein Fallback-Matching ohne Bestellnummer sind im Referenz-Export nicht angelegt, beides steht dort nur als Erweiterungsoption. Auch dieser Knoten ist auf stop gesetzt.",
        "prompt_ref": "arbeitsprompt-2",
        "eingang": [
          "invoice_number, supplier, amount_net, amount_gross, invoice_date, description, vat_rate, vat_amount",
          "Bestelldaten aus dem ERP"
        ],
        "ausgang": [
          "has_discrepancies",
          "discrepancy_count",
          "discrepancies (Detailliste mit Kategorie, Beschreibung, Schweregrad)"
        ]
      },
      {
        "nr": 4,
        "titel": "Match-Entscheidung",
        "rolle": "automatisch",
        "aktion": "Ein Bedingungs-Knoten wertet has_discrepancies aus dem ERP-Abgleich aus: gleich true führt in den Zweig Abweichungen gefunden, gleich false in den Zweig Keine Abweichungen. Die Auswertung erfolgt direkt als Bedingung und nicht über einen weiteren KI-Aufruf, es wird immer genau ein Zweig ausgeführt. Auch dieser Knoten ist auf stop gesetzt.",
        "prompt_ref": null,
        "eingang": [
          "has_discrepancies"
        ],
        "ausgang": [
          "Zweig Abweichungen gefunden oder Zweig Keine Abweichungen"
        ]
      },
      {
        "nr": 5,
        "titel": "Automatisch buchen",
        "rolle": "ergebnis",
        "aktion": "Im Zweig Keine Abweichungen erstellt ein Code-Knoten den Buchungssatz: Debit auf Konto 4400 Wareneingang, Credit auf Konto 1600 Verbindlichkeiten, Vorsteuer auf Konto 1576, mit automatisch generierter Beleg-ID und Zeitstempel. Im Referenz-Export ist die Buchung simuliert, produktiv ersetzt ein API-Call an das Buchhaltungssystem, etwa DATEV oder Lexoffice, diesen Teil. Auch dieser Knoten ist auf stop gesetzt.",
        "prompt_ref": null,
        "eingang": [
          "Zweig Keine Abweichungen",
          "invoice_number, supplier, amount_net, amount_gross, vat_amount"
        ],
        "ausgang": [
          "Buchungssatz mit Beleg-ID"
        ]
      },
      {
        "nr": 6,
        "titel": "Eskalation",
        "rolle": "mensch",
        "aktion": "Im Zweig Abweichungen gefunden sendet ein Aktions-Knoten eine Slack-Nachricht an das Buchhaltungsteam. Gesetzt werden die Felder text und channelId: der Text zieht Rechnungsnummer, Lieferant, Rechnungsdatum und Bruttobetrag aus der Extraktion sowie die Anzahl und die Details der Abweichungen aus dem ERP-Abgleich, der Kanal wird je Lauf ausgewählt statt fest hinterlegt zu sein. Auch dieser Knoten ist auf stop gesetzt.",
        "prompt_ref": null,
        "eingang": [
          "Zweig Abweichungen gefunden",
          "invoice_number, supplier, invoice_date, amount_gross",
          "discrepancy_count, discrepancies"
        ],
        "ausgang": [
          "Slack-Nachricht an das Buchhaltungsteam"
        ]
      },
      {
        "nr": 7,
        "titel": "Audit-Log",
        "rolle": "ergebnis",
        "aktion": "Der Referenz-Export endet mit der Buchung beziehungsweise der Slack-Benachrichtigung, ein eigener Protokollierungs-Knoten ist dort nicht angelegt. Für ein lückenloses Audit-Log braucht es beim Nachbau einen zusätzlichen Schritt, der Eingangs-E-Mail, das extrahierte JSON, das Abgleichsergebnis und den finalen Status ablegt.",
        "prompt_ref": null,
        "eingang": [
          "Buchungssatz oder Slack-Nachricht"
        ],
        "ausgang": [
          "Audit-Log-Eintrag (beim Nachbau zu ergänzen)"
        ]
      }
    ],
    "prompts": {
      "arbeitsprompt-1": {
        "titel": "Rechnungsdaten-Extraktion",
        "text": "Sie sind ein Experte für Rechnungsanalyse. Analysieren Sie die folgende Rechnung und extrahieren Sie alle relevanten Daten in einem strukturierten JSON-Format. Wenn eine Angabe aus dem Rechnungstext nicht eindeutig hervorgeht, kennzeichnen Sie das als Annahme statt sie als gesichert darzustellen.\n\nRECHNUNG:\n[RECHNUNGS_TEXT]\n\nExtrahieren Sie folgende Informationen: Rechnungsnummer, Lieferant beziehungsweise Rechnungssteller mit Name und Adresse, Rechnungsdatum, Fälligkeitsdatum, Nettobetrag, Mehrwertsteuersatz und -betrag, Bruttobetrag, Leistungsbeschreibung beziehungsweise Positionen, Bestellnummer, falls vorhanden, sowie IBAN und Bankverbindung.\n\nAUSGABEFORMAT (JSON):\n{\n  \"rechnungsnummer\": \"...\",\n  \"lieferant\": {\"name\": \"...\", \"adresse\": \"...\"},\n  \"rechnungsdatum\": \"YYYY-MM-DD\",\n  \"faelligkeitsdatum\": \"YYYY-MM-DD\",\n  \"nettobetrag\": 0.00,\n  \"mwst_satz\": 0.00,\n  \"mwst_betrag\": 0.00,\n  \"bruttobetrag\": 0.00,\n  \"leistungen\": [\"Position 1\", \"Position 2\"],\n  \"bestellnummer\": \"...\",\n  \"iban\": \"...\"\n}\n\nWenn Informationen nicht vorhanden sind, setzen Sie den Wert auf null. Achten Sie auf korrekte Zahlenformate mit Punkt als Dezimaltrennzeichen."
      },
      "arbeitsprompt-2": {
        "titel": "Abweichungsanalyse",
        "text": "Sie sind ein Experte für Rechnungsprüfung. Vergleichen Sie die extrahierten Rechnungsdaten mit den Bestelldaten und identifizieren Sie Abweichungen. Kennzeichnen Sie jede Einschätzung, für die relevante Informationen fehlen, ausdrücklich als Annahme.\n\nRECHNUNGSDATEN:\n[RECHNUNGSDATEN_JSON]\n\nBESTELLDATEN:\n[BESTELLDATEN_JSON]\n\nPRÜFKRITERIEN: Lieferant stimmt überein, Betrag weicht maximal [TOLERANZ_PROZENT] Prozent ab, Leistungsbeschreibung passt zur Bestellung, Bestellnummer ist korrekt, falls vorhanden.\n\nAUSGABE:\nErstellen Sie eine strukturierte Analyse im folgenden JSON-Format:\n{\n  \"abweichungen_gefunden\": true/false,\n  \"details\": [\n    {\"kategorie\": \"Betrag/Lieferant/Leistung\", \"beschreibung\": \"...\", \"schweregrad\": \"kritisch/mittel/gering\"}\n  ],\n  \"empfehlung\": \"automatisch_buchen\" oder \"manuelle_prüfung_erforderlich\",\n  \"begruendung\": \"...\"\n}\n\nSeien Sie präzise und nennen Sie konkrete Zahlen bei Abweichungen. Bei Beträgen unter [TOLERANZ_PROZENT] Prozent Abweichung gilt die Rechnung als korrekt."
      }
    },
    "datenfluss": [
      {
        "von": 1,
        "nach": 2,
        "nutzlast": "PDF-Anhang, Kante output-success zu input-default"
      },
      {
        "von": 2,
        "nach": 3,
        "nutzlast": "invoice_number, supplier, amount_net, amount_gross, invoice_date, description, vat_rate, vat_amount, Kante output-success zu input-default"
      },
      {
        "von": 3,
        "nach": 4,
        "nutzlast": "has_discrepancies, discrepancy_count, discrepancies, Kante output-success zu input-default"
      },
      {
        "von": 4,
        "nach": 5,
        "nutzlast": "Zweig Keine Abweichungen, has_discrepancies gleich false, Kante output-condition zu input-default"
      },
      {
        "von": 4,
        "nach": 6,
        "nutzlast": "Zweig Abweichungen gefunden, has_discrepancies gleich true, Kante output-condition zu input-default"
      },
      {
        "von": 5,
        "nach": 7,
        "nutzlast": "Buchungssatz mit Beleg-ID. Kein Knoten im Referenz-Export vorhanden, Ergänzung beim Nachbau empfohlen."
      },
      {
        "von": 6,
        "nach": 7,
        "nutzlast": "Slack-Nachricht an das Buchhaltungsteam. Kein Knoten im Referenz-Export vorhanden, Ergänzung beim Nachbau empfohlen."
      }
    ],
    "voraussetzungen": [
      "Dediziertes Rechnungs-Postfach für eingehende PDFs, zum Beispiel rechnungen@firma.de",
      "ERP- oder Bestellsystem mit Bestelldaten und Wareneingängen, etwa SAP, Dynamics oder Odoo",
      "Buchhaltungssystem für die Buchung freigegebener Rechnungen, etwa DATEV oder Lexoffice",
      "LLM-Zugang für die Extraktion (OpenAI, Claude oder Gemini)",
      "Team-Chat oder Ticket-System für Eskalationen an das Finance-Team",
      "Kalibrierter Toleranzwert für den Betragsabgleich, festgelegt anhand echter Rechnungen aus der Vergangenheit"
    ],
    "fehlerbehandlung": [
      {
        "fall": "Ein beliebiger Knoten schlägt fehl, vom Trigger bis zur Buchung oder Benachrichtigung",
        "massnahme": "Jeder Knoten im Referenz-Export ist auf die Fehlerstrategie stop gesetzt. Der Lauf bricht komplett ab, es gibt weder einen automatischen Retry noch einen Fallback-Pfad."
      },
      {
        "fall": "OCR-Qualität schlecht",
        "massnahme": "Ein stärkeres Modell vorschalten oder eine höhere Mindestauflösung der Scans erzwingen."
      },
      {
        "fall": "Toleranzwert zu eng oder zu weit gefasst",
        "massnahme": "Den im Code fest hinterlegten Wert, im Referenz-Export 5 Prozent, anhand echter Rechnungen aus der Vergangenheit kalibrieren."
      },
      {
        "fall": "Bestellnummer fehlt",
        "massnahme": "Fallback-Matching über Lieferant, Betrag und Datum ergänzen. Im Referenz-Export ist das noch keine hinterlegte Logik, sondern eine Erweiterungsoption des ERP-Abgleichs."
      },
      {
        "fall": "Doppelbuchung",
        "massnahme": "Rechnungsnummer und Lieferant als eindeutigen Schlüssel prüfen, bevor gebucht wird. Auch das ist im Referenz-Export nicht angelegt."
      },
      {
        "fall": "Fehlendes Audit-Log",
        "massnahme": "Beim Nachbau ergänzen, da der Referenz-Export nach der Buchung beziehungsweise der Benachrichtigung endet."
      }
    ],
    "platzhalter": [
      {
        "name": "invoice_number",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "supplier",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "amount_net",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, Nettobetrag"
      },
      {
        "name": "amount_gross",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, Bruttobetrag, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "invoice_date",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "description",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, Leistungsbeschreibung"
      },
      {
        "name": "vat_rate",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, Mehrwertsteuersatz"
      },
      {
        "name": "vat_amount",
        "quelle": "Ausgabefeld des KI-Knotens Rechnungsdaten extrahieren, Mehrwertsteuerbetrag"
      },
      {
        "name": "output",
        "quelle": "Freitext-Zusammenfassung der Extraktion im Ausgabeschema des KI-Knotens"
      },
      {
        "name": "success",
        "quelle": "Erfolgsflag der Extraktion im Ausgabeschema des KI-Knotens"
      },
      {
        "name": "has_discrepancies",
        "quelle": "Boolesches Ergebnisfeld des ERP-Abgleichs, steuert die Verzweigung im Knoten Match-Entscheidung"
      },
      {
        "name": "discrepancy_count",
        "quelle": "Anzahl gefundener Abweichungen aus dem ERP-Abgleich, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "discrepancies",
        "quelle": "Detailliste der Abweichungen aus dem ERP-Abgleich, als Merge-Feld in der Slack-Nachricht referenziert"
      },
      {
        "name": "channelId",
        "quelle": "Zielkanal der Slack-Nachricht, im Referenz-Export je Lauf ausgewählt statt fest hinterlegt"
      },
      {
        "name": "TOLERANZWERT",
        "quelle": "Maximale Betragsabweichung in Prozent, im Code des ERP-Abgleichs fest hinterlegt, Referenzwert 5 Prozent, vor der Aktivierung zu kalibrieren"
      },
      {
        "name": "Konten 4400, 1600, 1576",
        "quelle": "Debit-, Credit- und Vorsteuerkonto im Buchungssatz, im Referenz-Export als Beispielwerte hinterlegt und an den eigenen Kontenplan anzupassen"
      },
      {
        "name": "ERP_API_ENDPUNKT",
        "quelle": "Platzhalter-URL und Bearer-Token für den produktiven ERP-Abruf, ersetzt im Referenz-Export den simulierten Datensatz"
      },
      {
        "name": "BUCHHALTUNGS_API_ENDPUNKT",
        "quelle": "Platzhalter-URL und Bearer-Token für die produktive Buchung, ersetzt im Referenz-Export die simulierte Buchung"
      },
      {
        "name": "GMAIL_SUCHFILTER",
        "quelle": "Suchausdruck des Trigger-Knotens, zum Beispiel Betreff, Absender oder Label mit Anhang"
      }
    ],
    "herausgeber": "Voyage Digital",
    "version": "2.0",
    "stand": "2026-07-26"
  },
  "itemIcon": "receipt",
  "recommended": [
    {
      "slug": "budget-geruest",
      "category": "skill",
      "name": "The Budget Blueprint",
      "teaser": "Builds a complete budget plan with three scenarios from a time period, a budget range and strategic priorities, not just a cost table.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "wallet"
    },
    {
      "slug": "umsatzprognose-schema",
      "category": "skill",
      "name": "The Revenue Forecast Framework",
      "teaser": "Analyzes your pipeline and historical sales data and delivers a revenue forecast with a best, base and worst case, transparent assumptions, and prioritized recommendations.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "line-chart"
    },
    {
      "slug": "budget-rechner",
      "category": "assistent",
      "name": "The Budget Calculator",
      "teaser": "The Budget Calculator compares planned and actual budgets, ranks the largest variances by cause, and turns them into quantified savings recommendations with a forecast for the next period.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "wallet"
    },
    {
      "slug": "kennzahlen-analyst",
      "category": "assistent",
      "name": "The Metrics Analyst",
      "teaser": "Takes an Excel or CSV file of performance data, analyzes it with statistical methods, and turns the result into clear visualizations and an impact-ranked list of possible actions.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "bar-chart-3"
    },
    {
      "slug": "szenario-rechner",
      "category": "assistent",
      "name": "The Scenario Planner",
      "teaser": "Builds a best case, base case and worst case model from historical financial data, with documented assumptions, sensitivity analysis and prioritized recommendations.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "calculator"
    },
    {
      "slug": "google-analytics",
      "category": "tool",
      "name": "Google Analytics",
      "teaser": "Google Analytics is Google's event-based web and app analytics tool (GA4) for evaluating traffic, user behavior, funnels, and campaigns, with a paid enterprise tier, Analytics 360.",
      "domaene": "Daten, Analytics & Finanzen",
      "logoFile": "google-analytics.svg",
      "logoEinzug": 1
    },
    {
      "slug": "posthog",
      "category": "tool",
      "name": "PostHog",
      "teaser": "PostHog is a product analytics platform that combines events, feature flags, session replay, experiments and error tracking through a shared event model, priced on usage with a generous free allowance.",
      "domaene": "Daten, Analytics & Finanzen",
      "logoFile": "posthog.svg",
      "logoEinzug": 0.78
    },
    {
      "slug": "feedback-sichter",
      "category": "assistent",
      "name": "The Feedback Sifter",
      "teaser": "Sifts through hundreds of customer feedback items from support, surveys and reviews, clusters them by topic with sentiment, and delivers prioritized action recommendations with an impact assessment.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "message-square-quote"
    },
    {
      "slug": "produktfeedback-analyst",
      "category": "assistent",
      "name": "The Product Feedback Analyst",
      "teaser": "Analyzes scattered customer feedback from reviews, support tickets and surveys, and turns it into a prioritized product action plan.",
      "domaene": "Daten, Analytics & Finanzen",
      "itemIcon": "package-search"
    },
    {
      "slug": "vertragsrisiko-kette",
      "category": "workflow",
      "name": "The Contract Risk Chain",
      "teaser": "An automation workflow that reads new contracts on arrival, extracts key terms, and files a structured high, medium and low risk assessment for the responsible team to review.",
      "domaene": "Recht & Compliance",
      "itemIcon": "file-warning"
    }
  ]
}