Quickbooks/Intuit Webhook-API gibt null body zurück

Beschreiben Sie das Problem/den Fehler/die Frage

Hi!!
Wir haben derzeit eine Integration mit QB, die mit dem alten Format gut funktioniert. Ab August werden sie eine Änderung zu ihrem neuen Schema erzwingen…
Wir haben ein Problem mit dem neuen CloudEvents-Payload-Format (Schema v2.0) — der Webhook-Node gibt einen leeren Body ({}) zurück, sowohl mit aktiviertem Raw Body als auch deaktiviert :frowning:
Kurze Zusammenfassung des Setups:

  • Webhook-Node (v2.1) empfängt POST-Anfragen von Quic
  • Mit Raw Body = false: Body ist vorhanden, aber null ({})
  • Mit Raw Body = true: Body fehlt komplett in der Ausgabe
    Header kommen gut durch, also die Anfrage trifft den Node definitiv — es sieht nur so aus, als würde n8n den Body-Content-Type nicht korrekt parsen.
    Hat jemand anderes mit QuickBooks’ neuem Webhook-Payload-Format zu tun gehabt? Irgendwelche Workarounds, um den Body korrekt zu parsen?
    Zugehöriges GitHub-Issue als Referenz: Quickbooks API returning null body · Issue #28750 · n8n-io/n8n · GitHub

Wie lautet die Fehlermeldung (falls vorhanden)? N/A

Bitte geben Sie Ihren Workflow frei

{
“nodes”: [
{
“parameters”: {
“httpMethod”: “POST”,
“path”: “qb-invoice-created”,
“options”: {
“binaryPropertyName”: “data”,
“rawBody”: true
}
},
“type”: “n8n-nodes-base.webhook”,
“typeVersion”: 2.1,
“position”: [
-384,
96
],
“id”: “e4f54943-e131-42a2-99f5-43ec3e7cc314”,
“name”: “Webhook”,
“webhookId”: “9b2ef218-1f57-46b0-99ba-1d1929ccb5f4”
}
],
“connections”: {
“Webhook”: {
“main”: [

]
}
},
“pinData”: {},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “b45ee928b826ee03de7f50699776b5bbce13dfef5ed3d12709796e32a0102f85”
}
}

Geben Sie die vom letzten Node zurückgegebene Ausgabe an

{}

Informationen zu Ihrem n8n-Setup

  • n8n-Version: 1.123.54
  • Führen Sie n8n aus über (Docker, npm, n8n cloud, Desktop-App): n8n cloud
1 „Gefällt mir“

Willkommen @Mathias_Viscardi!

Die Grundursache ist, dass der Webhook-Knoten von n8n application/cloudevents+json nicht als Content-Type erkennt, den er automatisch parsen sollte, daher kommt der Body als null durch. Mit Raw Body = true sollte die Payload in der binären Ausgabe landen. Versuche, direkt nach dem Webhook einen Code-Knoten hinzuzufügen und extrahiere es so:

const raw = $input.item.binary?.data
  ? Buffer.from($input.item.binary.data, 'base64').toString('utf8')
  : $input.item.json.rawBody;
return [{ json: JSON.parse(raw) }];

Wenn binary.data auch leer ist, überprüfe $input.item.json – einige n8n-Versionen speichern den Raw-String unter einem rawBody-Schlüssel, auch wenn die UI null anzeigt. Dies ist eine bekannte Lücke, die in dem GitHub-Issue verfolgt wird, das du verlinkt hast, also lohnt es sich, dort vorher noch einen Kommentar zu hinterlassen.

Willkommen @Mathias_Viscardi!

Das ist das CloudEvents Content-Type Problem. Das v2 Schema von QuickBooks sendet Anfragen mit application/cloudevents+json als Content-Type Header, was n8ns Webhook Node nicht als Standard JSON parst – es überspringt entweder den Body komplett oder gibt null dafür zurück.

Mit Raw Body = true (was du bereits gesetzt hast), landen die rohen Bytes in $binary.data als Base64-kodierte Zeichenkette. Füge gleich nach dem Webhook einen Code Node hinzu und parse es manuell:

const rawData = $input.first().binary.data;
const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');
return [{ json: JSON.parse(decoded) }];

Das gibt dir das gesamte CloudEvents Payload als normales JSON Objekt. Du kannst dann auf die QuickBooks Event Daten über $json.data zugreifen (oder welchen Key QB im neuen Schema auch nutzt).

1 „Gefällt mir“

Hallo @nguyenthieutoan !

Vielen Dank für deinen Vorschlag :smiley: Ich musste ihn leicht anpassen zu

const rawData = $input.first().binary.data;const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');const parsed = JSON.parse(decoded);return [{ parsed }];

aber damit funktioniert es jetzt!!

Danke nochmal!!

1 „Gefällt mir“

Freut mich, dass es funktioniert hat! Der .binary.data-Pfad ist der richtige für Intuits Webhook-Payload, da n8n dort die Rohdaten speichert. Gut erkannt bei der Anpassung.