Rezept: Eingangsrechnungen automatisch verbuchen
Rechnungs-PDFs per Mail rein → Daten extrahieren, in Dropbox archivieren, Buchungssatz vorbereiten.
Eingangsrechnungen sind ein perfekter Email-Task: kommen per Mail rein, haben PDF-Anhang, müssen klassifiziert, archiviert und verbucht werden. Komplette Automation in 4 Tools + 1 Email-Prompt.
Ziel
- Lieferant schickt Rechnung an
mein-workspace@taskmonkey-mails.de - Plattform extrahiert Lieferant, Datum, Betrag, USt
- PDF wandert in Dropbox unter
/Eingangsrechnungen/<JJJJ-MM>/ - Buchungssatz mit Vorschlag landet im Buchhaltungs-Tool
- Bestätigung per Mail an die Buchhaltung
Voraussetzungen
- Eine eigene Workspace-Email-Adresse (Betreiber einrichten lassen)
- Dropbox-OAuth-Verbindung (
/manage/o-auth-connections) - Optional: Tool/API zur Buchhaltungs-Software (DATEV, lexoffice, sevDesk)
1. Tool: PDF-Daten extrahieren
tools/buchhaltung/extractInvoice.php:
<?php
return [
'tools' => [
'extractInvoice' => [
'description' => 'Extrahiert Rechnungs-Stammdaten aus dem Text einer PDF-Rechnung.',
'parameters' => [
'type' => 'object',
'properties' => [
'pdfText' => [
'type' => 'string',
'description' => 'Volltext der Rechnung. Kann <PDF:key> sein.',
],
],
'required' => ['pdfText'],
],
'handler' => function (array $results, array $args, array $ctx): array {
$logger = $ctx['logger'];
$text = $args['pdfText'];
$supplier = preg_match('/(?:Lieferant|Absender|Von):?\s*(.+)/i', $text, $m) ? trim($m[1]) : null;
$date = preg_match('/(?:Rechnungsdatum|Datum):?\s*(\d{2}\.\d{2}\.\d{4})/i', $text, $m) ? $m[1] : null;
$invoiceNo = preg_match('/Rechnung(?:s\s*-?\s*nummer|s\s*-?\s*nr\.?)?:?\s*([A-Z0-9\-\/]+)/i', $text, $m) ? $m[1] : null;
$gross = preg_match('/(?:Gesamtbetrag|Brutto|Summe):?\s*([\d.,]+)\s*€?/i', $text, $m) ? $m[1] : null;
$logger->info("Extrahiert: {$supplier}, {$date}, {$gross} €");
return [
'supplier' => $supplier,
'invoice_date' => $date,
'invoice_number' => $invoiceNo,
'gross_amount' => $gross,
];
},
],
],
];
(Pragmatische Regex-Variante. Für robustere Extraktion: das Modell die PDF direkt lesen lassen oder eine spezialisierte API einbinden.)
2. Tool: in Dropbox archivieren
tools/buchhaltung/archiveInvoice.php:
<?php
return [
'tools' => [
'archiveInvoice' => [
'description' => 'Speichert die Original-Rechnungs-PDF in Dropbox unter /Eingangsrechnungen/<JJJJ-MM>/.',
'parameters' => [
'type' => 'object',
'properties' => [
'fileName' => ['type' => 'string'],
'pdfBase64' => ['type' => 'string', 'description' => 'PDF als Base64'],
'invoiceDate' => ['type' => 'string', 'description' => 'YYYY-MM-DD oder DD.MM.YYYY'],
'supplier' => ['type' => 'string'],
],
'required' => ['fileName', 'pdfBase64', 'invoiceDate', 'supplier'],
],
'handler' => function (array $results, array $args, array $ctx): array {
$date = strtotime(str_replace('.', '-', $args['invoiceDate'])) ?: time();
$month = date('Y-m', $date);
$supplier = preg_replace('/[^a-z0-9_-]/i', '_', $args['supplier']);
$path = "/Eingangsrechnungen/{$month}/{$supplier}_{$args['fileName']}";
return $ctx['runTool']('uploadToDropbox', [
'path' => $path,
'content' => base64_decode($args['pdfBase64']),
]);
},
],
],
];
3. Tool: Buchungssatz anlegen
tools/buchhaltung/createBookingEntry.php:
<?php
return [
'tools' => [
'createBookingEntry' => [
'description' => 'Legt einen Buchungssatz im Buchhaltungssystem an.',
'parameters' => [
'type' => 'object',
'properties' => [
'supplier' => ['type' => 'string'],
'invoiceNumber' => ['type' => 'string'],
'invoiceDate' => ['type' => 'string'],
'grossAmount' => ['type' => 'number'],
'category' => ['type' => 'string', 'description' => 'Kostenstelle/Konto, z. B. "Bürobedarf"'],
'archiveUrl' => ['type' => 'string'],
],
'required' => ['supplier', 'invoiceDate', 'grossAmount'],
],
'api' => 'buchhaltung',
'method' => 'POST',
'path' => 'entries',
'body' => [
'supplier' => '{supplier}',
'document_no' => '{invoiceNumber}',
'date' => '{invoiceDate}',
'amount' => '{grossAmount}',
'category' => '{category}',
'archive_link' => '{archiveUrl}',
],
],
],
];
4. Email-Prompt
email.php:
<?php
return [
'email.prompt' => <<<PROMPT
Du bist der Eingangsrechnungs-Assistent.
Bei jeder eingehenden Mail prüfst du, ob ein PDF-Anhang vorhanden
ist, der eine Rechnung sein könnte (Stichworte: "Rechnung",
"Invoice", "Bill" im Body oder Anhang-Namen).
Ablauf bei Rechnungs-Mails:
1. extractInvoice mit dem PDF-Text aufrufen
2. archiveInvoice — PDF in Dropbox ablegen
3. createBookingEntry mit den extrahierten Daten und einer
sinnvollen Kategorie anlegen (basierend auf Lieferant und
Rechnungstext: Bürobedarf, IT-Dienstleistungen, Telekom,
Reisekosten, etc.)
Bei nicht-Rechnungs-Mails: kurze Zusammenfassung — kein Tool-Aufruf.
Antworte am Ende mit einer kurzen Notiz, was du gemacht hast.
Keine Bestätigungsmail an den Absender — das passiert nicht.
PROMPT,
];
5. Tool-Allowlist
Ergänze in derselben email.php:
<?php
return [
'email.tools' => [
'extractInvoice',
'archiveInvoice',
'createBookingEntry',
'uploadToDropbox',
],
];
6. Testen
- Mit einer Test-Rechnung an die Workspace-Adresse senden
tm monitorzeigt:MAIL extractInvoice → archiveInvoice → createBookingEntry- Dropbox prüfen: PDF liegt unter
/Eingangsrechnungen/2026-04/ - Buchhaltungs-System: neuer Eintrag mit Vorschlag
Erweiterungen
- Doppelt-Erkennung: vor
createBookingEntryein ToolfindExistingEntry, das nachinvoice_numbersucht - Eskalation bei Unsicherheit: wenn extractInvoice keinen Betrag findet → Mail an Buchhaltung statt automatisch verbuchen
- OCR für Bild-Rechnungen: PDF mit eingescanntem Text — das Modell direkt sehen lassen, ohne Regex
- Genehmigungs-Workflow: bei Beträgen > X: erst Slack-Nachricht an GL, Verbuchung erst nach Bestätigung