n8n eignet sich für alles, was rund um Odoo passiert: ein externes Formular entgegennehmen, einen Chat benachrichtigen, einen Tagesbericht zusammenstellen. Was den Geschäftsstatus innerhalb von Odoo verändert (Preise, Bestandsreservierungen, Lieferschein-Validierungen, Zahlungsabstimmung), braucht ein Modul. Die Grenze zeigt sich, wenn man beides gegen ein echtes Odoo ausführt: Dieser Artikel stammt aus einem eigenen Labor mit Odoo 19.0-20260630 und n8n 2.30.6.
Kernaussage: Ein Workflow, der die Odoo-API aufruft, führt nicht deren Oberfläche aus. Er kann ein 200 mit einem Assistenten darin erhalten und glauben, einen Lieferschein validiert zu haben, der weiterhin offen ist.
Wie n8n mit Odoo spricht: vier Wege, nicht einer
- XML-RPC:
/xmlrpc/2/commonzur Authentifizierung und/xmlrpc/2/objectfürexecute_kw. Der Weg aus der Dokumentation. - JSON-RPC: ein
POST /jsonrpcmitservice,methodundargs. Derselbe Dienst in JSON. - Websitzung:
/web/session/authenticateund/web/dataset/call_kwmit dem Cookie. Das, was Ihr Browser tut. - Die JSON-2-API, nur in Odoo 19:
POST /json/2/<modelo>/<método>mitAuthorization: bearer <clave API>undX-Odoo-Database. Ohne Sitzung: Die Argumente werden als benannte Felder übergeben, einschließlichcontext.
Die ersten drei funktionieren in 19 weiter, aber der Server warnt im Log: «The /xmlrpc, /xmlrpc/2 and /jsonrpc endpoints are deprecated in Odoo 19 and scheduled for removal in Odoo 22». Ein neuer Workflow gegen ein Odoo 19 sollte über /json/2 laufen; wenn er auch 17 und 18 bedient, über die Sitzung.
# Sesion + call_kw: funciona igual en 17, 18 y 19.
POST /web/session/authenticate
{"params":{"db":"lab","login":"n8n_bot2","password":"..."}}
-> 200 {"result":{"uid":6,"server_version":"19.0-20260630"}} # + cookie
POST /web/dataset/call_kw # con esa cookie
{"params":{"model":"crm.lead","method":"create",
"args":[{"name":"Lead web","type":"lead"}],
"kwargs":{"context":{"lang":"es_ES"}}}}
-> 200 {"result": 10}
# Clave API en la cabecera, sin sesion: solo Odoo 19.
POST /json/2/crm.lead/create
Authorization: bearer <clave> X-Odoo-Database: lab
{"vals_list":[{"name":"Lead via /json/2 (API key)"}]}
-> 200 [9]
# Sin cabecera -> 401 "User not authenticated, use an API Key with a
# Bearer Authorization header."
# Metodo privado -> 403 "Private methods (such as
# 'crm.lead._compute_display_name') cannot be called remotely." Der Odoo-Knoten von n8n 2.30.6 wählt anhand der Zugangsdaten für Sie aus: Die mit API-Schlüssel läuft über /json/2; die klassische läuft über /jsonrpc mit execute, positionsbasiert, das kwargs nicht akzeptiert und keinen Kontext übergeben kann. Die Zugangsdaten mit API-Schlüssel weisen zudem darauf hin, dass sie «Odoo 19+ and a Custom pricing plan» erfordern.
Der HTTP-Request-Knoten, genau so, wie er entstanden ist
Beachten Sie, wo der Schlüssel nicht steht: Der Body enthält nur Daten, und der Header Authorization wird von einer n8n-Zugangsdatenverwaltung gesetzt, die verschlüsselt und separat rotiert wird.
// Lineas del nodo real, copiadas de `n8n export:workflow`.
"type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2,
"url": "http://odoo:8069/json/2/crm.lead/create",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": { "parameters": [
{ "name": "X-Odoo-Database", "value": "lab" } ] },
"jsonBody": "={{ JSON.stringify({ vals_list: [{ name: 'Web: ' + $json.body.empresa, contact_name: $json.body.nombre, email_from: $json.body.email, description: $json.body.mensaje, type: 'lead' }] }) }}",
"credentials": { "httpHeaderAuth": { "name": "Odoo lab - API key (header)" } }
// La clave no esta aqui: la pone esa credencial.Der Workflow meldet sich außerdem nicht als Administrator an, sondern als technischer Benutzer mit genau den nötigen Gruppen und der Obergrenze, die Odoo 19 für dessen Schlüssel setzt:
# Usuario tecnico nuevo (solo grupo de usuario interno):
POST /json/2/crm.lead/create
-> 403 "No puede crear informes 'Lead' (crm.lead) ...
- Sales/Administrator
- Sales/User: Own Documents Only"
# Tras anadirle sales_team.group_sale_salesman: -> 200
# Su clave API tampoco dura lo que uno quiera:
_generate(..., +200 dias) -> "No puede exceder 90.0 dias."
_generate(..., sin fecha) -> "La clave API debe tener una
fecha de vencimiento"Diese Obergrenze von 90 Tagen ist das Datum, an dem Ihr Workflow aufhört zu funktionieren, ohne dass jemand etwas anfasst. Notieren Sie es am Tag, an dem Sie den Schlüssel erstellen.
Fünf Automatisierungen, die in einen Workflow passen
Allen gemeinsam ist: Der Vorgang ist bereits geschehen, und der Workflow verschiebt ihn nur an einen anderen Ort.
| Fall | Auslöser | Aufruf an Odoo |
|---|---|---|
| Lead aus einem externen Formular | n8n-Webhook | crm.lead / create |
| Chat-Benachrichtigung bei Validierung eines Lieferscheins | Odoo-Automatisierung mit Webhook-Aktion | Keiner: Odoo sendet |
| Kontakte an ein Marketing-Tool | Zeitgesteuert, jede Nacht | res.partner / search_read nach write_date |
| Warnung bei niedrigem Bestand | Zeitgesteuert, jeden Morgen | product.product / search_read von qty_available |
| Tagesbericht an die Geschäftsleitung | Zeitgesteuert | read_group auf sale.order |
Der zweite Fall hat ein Kleingedrucktes. Die Webhook-Aktion sendet _model, _id und den Namen der Aktion und arbeitet nach dem Prinzip «Fire and forget»: ein POST von einer Sekunde, ohne Wiederholung. In 19 wird sie nach dem Commit gesendet; in 17 und 18 läuft sie innerhalb der Transaktion, sodass ein langsames n8n den Benutzer ausbremst.
# Accion de servidor state='webhook' al crear un lead.
INFO Webhook call to http://n8n:5678/webhook/odoo-lead
INFO Webhook call to http://n8n:5678/webhook/odoo-lead - succeeded
# Apuntando a un flujo borrado (el lead se crea igual):
WARNING Webhook call failed: 404 Client Error: Not Found for url:
http://n8n:5678/webhook/flujo-borrado
WARNING Webhook call timed out after 1s - it may or may not have failed.Fünf, die nicht passen, und der genaue Grund
- Preise oder Rabatte berechnen. Odoo berechnet sie aus der Preisliste; wenn der Workflow sie extern berechnet, gibt es bei einer Preislistenänderung zwei Wahrheiten.
- Bestand für mehrere Kanäle reservieren. Odoo löst das Wettrennen innerhalb einer Transaktion; ein Workflow, der getrennt liest, entscheidet und schreibt, verkauft zu viel.
- Zahlungen abstimmen. Zuordnen und Verbuchen gehören zusammen: Wird das eine außerhalb und das andere innerhalb erledigt, hinterlässt ein Netzausfall eine halbe Abstimmung.
- Alles, was jemand prüfen wird. Der Verlauf von n8n ist nicht der Chatter: «Wer hat das geändert und warum?» wird im Dokument beantwortet.
- Alles, was von einem Feld abhängt, das sich zwischen Versionen ändert. Wir haben das geprüft, indem wir in Odoo 19 schrieben, was in 18 funktionierte.
Der Fall, der es am besten zusammenfasst: einen Lieferschein aus einem Workflow validieren. Wir haben einen mit 10 Einheiten vorbereitet, von denen 4 reserviert waren, und button_validate aufgerufen, dasselbe wie die Schaltfläche.
# WH/OUT/00003: 10 pedidas, 4 reservadas.
POST /web/dataset/call_kw
{"model":"stock.picking","method":"button_validate","args":[[2]]}
-> 200 {"result": {"name": "¿Crear entrega parcial?",
"type": "ir.actions.act_window",
"res_model": "stock.backorder.confirmation", ...}}
read -> [{"name":"WH/OUT/00003","state":"assigned"}] # sigue abiertoHTTP 200, kein Fehler, und ein Lieferschein in assigned. Für n8n ist der Schritt grün; für das Lager ist die Bestellung nicht hinausgegangen. Ein Modul erkennt den Assistenten und hält es im Dokument fest: dieselbe Grenze wie bei Odoo 19 gegenüber Middleware-Konnektoren.
Und die Felder, die zwischen Versionen ihren Namen ändern, was einen stabilen Workflow nach einer Migration bricht:
# Odoo 19, escribiendo lo que funcionaba en 17 y 18:
res.users write {"groups_id": [[4, 1]]}
-> "Invalid field 'groups_id' in 'res.users'" # en 19 se llama group_ids
stock.move create {"name": "Latiguillo", "product_id": 1, ...}
-> "Invalid field 'name' in 'stock.move'" # en 17 y 18 era obligatorioWir pflegen denselben Code in Odoo 19, 18 und 17 in 105 veröffentlichten Modulen: Diese Unterschiede trägt das Modul, nicht der Kunde. Das ist auch die Grenze von Odoo Studio, wenn der Prozess nicht mehr ein Feld ist, sondern zu einer Regel wird.
Die vier Fehler, die wir immer wieder sehen
- Die Schleife. Eine Automatisierung benachrichtigt n8n bei Änderung eines Felds, der Workflow schreibt in Odoo, und das Geschriebene löst sie erneut aus. Sie wird mit einer Bedingung im Auslöser unterbrochen.
- Zugangsdaten im Klartext. Weder im Body des Knotens noch in einem Code-Knoten: in einer n8n-Zugangsdatenverwaltung, mit einem technischen Benutzer mit minimalen Gruppen.
- Keine Idempotenz. Ein von der Gegenseite wiederholter Webhook legt den Datensatz erneut an: Drei identische
POSTan unseren Workflow ergaben drei Leads. - Keine echte Wiederholung. Ein Knoten wiederholt nur, wenn Sie Retry On Fail aktivieren, und die Engine begrenzt die Versuche auf fünf und die Wartezeit auf fünf Sekunden. Das reicht für einen Chat; nicht für einen Zusteller: Unser Modul für Correos Express wiederholt nach 5, 15, 30, 60, 120 und 240 Minuten.
Die Lösung liegt nicht bei n8n, sondern im Design: Speichern Sie in Odoo die externe Referenz und prüfen Sie sie vor dem Anlegen. In einem Modul ist das eine eindeutige Einschränkung in der Datenbank; in einem Workflow ein vorheriges Lesen mit Wettlauf-Fenster.
Wann ein Workflow zum Modul wird
Der Workflow ist ein günstiger Weg herauszufinden, ob der Prozess es wert ist zu existieren. Das Signal, dass er zu kurz greift, ist eines dieser sechs:
- Er schreibt ein Feld, das Odoo selbst berechnet.
- Zwei Schreibvorgänge müssen gemeinsam stattfinden oder gar nicht.
- Jemand wird in Odoo prüfen, was wann geschehen ist.
- Der Prozess muss die nächste Migration überleben.
- Der Aufruf muss wiederholbar sein, ohne etwas zu duplizieren.
- Der Benutzer muss direkt im Dokument erneut versuchen können.
An diesem Punkt wirft man den Workflow nicht weg: Man verlagert den Teil, der den Geschäftsstatus berührt, ins Modul, und n8n behält den Rand. Das ist genauso bei der Automatisierung von Verwaltungsaufgaben und bei der Integration mit Signaturit.
Fazit: Wenn der Workflow ausfällt und nur dazu führt, dass jemand eine Benachrichtigung nicht erhält, genügt n8n. Wenn er ausfällt und das Lager oder das Rechnungsbuch in einem Zustand bleiben, den niemand lesen kann, war das ein Modul.
Häufig gestellte Fragen
Kann ich Sprache oder Unternehmen im Aufruf übergeben?
Über die drei modernen Wege ja: kwargs.context in call_kw und in execute_kw sowie ein Feld context in /json/2 (ein Land erscheint mit en_US als «Spain» und mit es_ES als «España»). Mit den klassischen Zugangsdaten geht das nicht, da sie execute, positionsbasiert, aufrufen.
Wo speichere ich den API-Schlüssel und wie lange gilt er?
In einer n8n-Zugangsdatenverwaltung, nie im Body des Knotens. In Odoo 19 braucht der Schlüssel eines Nicht-Administrators ein Ablaufdatum, und die Obergrenze legt die Gruppe fest: 90 Tage für einen internen Benutzer.
Bricht mein Workflow bei der Migration von Odoo 18 auf 19?
Das hängt von den Feldern ab, die er berührt, und es gibt keine Warnung: res.users.groups_id wurde zu group_ids und stock.move.name, in 17 und 18 Pflichtfeld, existiert in 19 nicht. Testen Sie Ihre Workflows gegen eine Kopie.
Nützliche Links innerhalb von FlexigoTech
Was wir dazu anbieten
Haben Sie n8n-Workflows gegen Odoo und wissen nicht mehr, welche standhalten?
Wir prüfen sie, sagen Ihnen, welche so bleiben können und welche in ein Modul überführt werden müssen, und bauen das Modul, wenn es nötig ist. Schreiben Sie an comercial@flexigobe.com oder rufen Sie an unter +34 616 809 504.

