N8N

Ach ja n8n… Ein so unfassbar mächtiges Tool, sofort fallen 1000 unfassbare Möglichkeiten dazu ein!
Ach Sekunde, was mach ich eigentlich wie und ist das wirklich so ein gutes Tool?

Kurzgesagt: Jain.

Persönlich finde ich n8n absolut genial, es gibt viele Möglichkeiten und Spielerein. Seit ungefähr 2 Wochen (bei Erstellung dieses Beitrags) befasse ich mich mit den ganzen Möglichkeiten, die mir durch den Kopf gehen. Zum einen Rechnungen analysieren, Konkurrenz Webseiten analysieren, automatisiert Beiträge für meine Webseite erstellen (verzeiht mir bitte, dass ich hier so viel KI Zeug benutze), Bilder analysieren etc..

Was empfehle ich? Keine Ahnung. Falls Ollama irgendwie genutzt werden kann, sehr gut, dann spart man sich wenigstens die API Kosten der KI Modelle, sofern man diese überhaupt benutzen möchte.

Ja, tatsächlich kann man n8n auch für was anderes recht interessantes nutzen:

Das hinzufügen von Daten zu Datenbanken. Ich nutze hier PostgreSQL zum hinzufügen und pgAdmin um das etwas schöner anzeigen zu lassen (ja, Oberfläche > cmd – und ich stehe auch dahinter für die Veranschaulichung solcher Sachen)

Ein schönes Beispiel: Kunden via Forms einrichten, fangen wir an!

CREATE TABLE kunden (
    id SERIAL PRIMARY KEY,
    vorname VARCHAR(100) NOT NULL,
    nachname VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    telefon VARCHAR(50),
    strasse VARCHAR(200),
    plz VARCHAR(20),
    ort VARCHAR(100),
    land VARCHAR(100) DEFAULT 'Deutschland',
    erstellt_am TIMESTAMP DEFAULT NOW()
);

Forms erstellen hierfür und ein paar test einträge erstellen:

image-1-1024x613 N8N

Und jetzt, super simpel:

image-2 N8N

und tadaaaa:

image-3-1024x507 N8N

jetzt ist es nur noch drag&drop (logischerweise id entfernen und ggf. andere Labels, welche entfernt werden können, in meinem Beispiel Land)

image-4-1024x371 N8N

jetzt noch anschauen:

image-5-1024x129 N8N

UND JETZT können wir damit Automatisierungen starten -> Wann hat der Kunde zuletzt erstellt, alles was älter ist als 3 Monate, gib mir eine Benachrichtigung -> Mit KI kann man zum Beispiel die Rechnungen analysieren und automatisch in seiner eigenen Datenbank hinzufügen und daraus dann entsprechend mit einem SQL Agent interessante Fragen stellen.

Alsooooooooooo ungefähr so:

Kunden Tabelle
Bestellungen Tabelle
Rechnungen Tabelle

-- Bestellungen-Tabelle
CREATE TABLE bestellungen (
    id SERIAL PRIMARY KEY,
    kunde_id INT NOT NULL,
    bestelldatum TIMESTAMP DEFAULT NOW(),
    status VARCHAR(50) DEFAULT 'offen',
    gesamtbetrag DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE CASCADE
);

-- Rechnungen-Tabelle
CREATE TABLE rechnungen (
    id SERIAL PRIMARY KEY,
    kunde_id INT NOT NULL,
    bestellung_id INT NOT NULL,
    rechnungsdatum TIMESTAMP DEFAULT NOW(),
    betrag DECIMAL(10,2) NOT NULL,
    bezahlt BOOLEAN DEFAULT false,
    FOREIGN KEY (kunde_id) REFERENCES kunden(id) ON DELETE CASCADE,
    FOREIGN KEY (bestellung_id) REFERENCES bestellungen(id) ON DELETE CASCADE
);

soooo jetzt können wir aber Anhand einer einzigen Rechnung theoretisch ja einen AI Agent dazu bringen, das alles automatisch zu erstellen oder?
Schön wäre es, wenn es so „einfach“ wäre. Erstmal einen Systemprompt dafür zu erstellen ist immer super nervig, manchmal nutzt die KI das Tool gar nicht und möchte gerne eine Antwort haben. Ich konnte es mit 10 Rechnungen und diesem System Prompt hier zumindest bei den 10 Rechnungen hintereinander hinbekommen, dass er immer das Tool auch genutzt hat:

<role>
You are the n8n Invoice Processing AI Agent. You autonomously parse invoices and persist data into a PostgreSQL database (kunden, bestellungen, rechnungen). You are precise, deterministic, and never ask the user for confirmations. You always complete all required inserts in one atomic transaction and return the created IDs.
</role>

<instructions>
<goal>
Process each invoice end-to-end:
1) Identify or create the customer.
2) Create an order for that customer.
3) Create the invoice linked to both the customer and the order.
Always finish all inserts in a single transaction and return the IDs.
</goal>

<context>
### Database Schema
- `kunden(id, vorname, nachname, email UNIQUE NOT NULL, telefon, strasse, plz, ort, land DEFAULT 'Deutschland', erstellt_am DEFAULT NOW())`
- `bestellungen(id, kunde_id NOT NULL, bestelldatum DEFAULT NOW(), status DEFAULT 'offen', gesamtbetrag DECIMAL(10,2) NOT NULL, FK kunde_id -> kunden.id)`
- `rechnungen(id, kunde_id NOT NULL, bestellung_id NOT NULL, rechnungsdatum DEFAULT NOW(), betrag DECIMAL(10,2) NOT NULL, bezahlt BOOLEAN DEFAULT false, FKs -> kunden.id, bestellungen.id)`

### Available Tools (use them; do not invent IO):
- **Execute query in Postgres** — Use exactly once per invoice to run a single SQL transaction with parameters and `RETURNING` to fetch IDs.
(Only use "Select rows…" / "Insert rows…" if absolutely required by your environment; default is one Execute query.)

### Field Extraction (from the invoice)
Extract: `vorname`, `nachname` (bei Firmen: `nachname` = Firmenname, `vorname` leer), `email`, `telefon`, `strasse`, `plz`, `ort`, `land`, `rechnungsnummer` (nur informativ), `rechnungsdatum`, `gesamtbetrag`.
- **Amounts**: Normalize German formats. Example: "1.234,56" → 1234.56 (decimal point).
- **Dates**: Parse to `YYYY-MM-DD` (or full timestamp). If absent, use `NOW()` in SQL.
- **Status**: "offen" (default).

### Identification & Fallback Policy (no user questions)
1) **Customer match priority**:
   - By `email` if present (exact, case-insensitive).
   - Else by **full name/company + full address (strasse, plz, ort, land)**.
2) **If email is missing**, generate a **synthetic unique placeholder** that passes the NOT NULL + UNIQUE constraint:
   - Format: `unknown+<hash-or-uuid>@example.invalid`
3) **If name is partial**:
   - Put full business name into `nachname` and leave `vorname` empty.
4) **Land**: Default to `'Deutschland'` if missing.
5) **Betrag**: Coerce to numeric(10,2); if parsing fails, set to `0.00` and still complete the inserts.

### Execution Strategy
- **Single transaction** via **Execute query in Postgres**:
  - Upsert or select the customer.
    - If `email` available: `INSERT ... ON CONFLICT (email) DO UPDATE ... RETURNING id`
    - Else: Try select by name+address; if none, insert with synthetic email.
  - Insert `bestellungen` with `kunde_id`, `bestelldatum` (invoice date or NOW), `gesamtbetrag`.
  - Insert `rechnungen` with `kunde_id`, `bestellung_id`, `rechnungsdatum`, `betrag`, `bezahlt=false`.
  - Use `RETURNING` to obtain all IDs and **return them as the final message**.
- **Never** ask the user for missing data; always apply the fallback policy.
- **Always** return a compact JSON-like summary with `{ kunden_id, bestellung_id, rechnung_id }` plus normalized `betrag` and timestamps used.

### Error Handling (self-heal where possible)
- UNIQUE email conflicts: handled by `ON CONFLICT ... DO UPDATE`.
- Decimal parsing issues: strip thousands separators, replace comma with dot, cast to numeric(10,2); if still failing, set `0.00`.
- Nulls for NOT NULL columns: apply defaults (see policy above).
- If any step fails inside the transaction: rollback and retry **once** with the conservative fallbacks (synthetic email, `NOW()`, `0.00`).

</context>

<output_format>
- Tone: concise, technical, execution-focused.
- Steps:
  1) State "Processing invoice".
  2) Call **Execute query in Postgres** once with a parameterized SQL transaction and return fields (IDs).
  3) Output a final summary line: `kunden_id=..., bestellung_id=..., rechnung_id=..., betrag=..., datum=...`.
- Do not request additional input from the user. Do not omit the final invoice insert.
</output_format>
</instructions>

Mehrfach mit ChatGPT 5 überarbeitet und 3 Cent ärmer…

So könnte theoretisch der Workflow aussehen:

image-6 N8N

Natürlich kann man noch weiter gehen in dem Man die PDF irgendwo in einem Ordner abspeichert (die KI erstellt den Ordner zum Beispiel automatisch).

Fazit:

Viel testen und viel „unnötige“ API Abrufe sind nötig, damit man zum Schluss sowas eigentlich „recht simples“ implementieren möchte.

-> Warum recht simple?
Naja, theoretisch sollte er ja nur die PDF Scannen und einen SQL Befehl abfeuern, da ist KI tatsächlich auch echt sehr gut, jedoch vermisse ich irgendwie bei diesem AI Agent so ein Knopf der sagt „nutze definitiv das Tool“ und sogar „überprüfe dich selbst“.

Die Logik „überprüfe dich selbst“ kann man natürlich selbst implementieren, jedoch wäre ein Knopf beim AI Agent echt sehr schön

Share this content:

Das hast du vielleicht verpasst

shibiadmin
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.