Quickbooks/Intuit webhook API returning null body

Describe the problem/error/question

Hi!!
We currently have an integration with QB that’s working fine, with the old format. Starting on August, they will be enforcing a change to their new schema…
We’re running into an issue with the new CloudEvents payload format (schema v2.0) — the Webhook node returns an empty body ({}), both with Raw Body enabled and disabled :frowning:
Quick summary of the setup:

  • Webhook node (v2.1) receiving POST requests from Quic
  • With Raw Body = false: body is present but null ({})
  • With Raw Body = true: body is completely missing from the output
    Headers come through fine, so the request is definitely hitting the node — it just seems like n8n isn’t parsing the body content type correctly.
    Has anyone else dealt with QuickBooks’ new webhook payload format? Any workarounds to get the body parsed properly?
    Related GitHub issue for reference: Quickbooks API returning null body · Issue #28750 · n8n-io/n8n · GitHub

What is the error message (if any)? N/A

Please share your workflow

{
“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”
}
}

Share the output returned by the last node

{}

Information on your n8n setup

  • n8n version: 1.123.54
  • Running n8n via (Docker, npm, n8n cloud, desktop app): n8n cloud
1 Like

Welcome @Mathias_Viscardi!

The root cause is that n8n’s webhook node doesn’t recognize application/cloudevents+json as a content type it should auto-parse, so the body comes through as null. With Raw Body = true, the payload should land in the binary output. Try adding a Code node right after the webhook and extract it like this:

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

If binary.data is also empty, check $input.item.json - some n8n versions store the raw string under a rawBody key even when the UI shows null. This is a known gap tracked in the GitHub issue you linked, so worth adding a comment there too before August.

Welcome @Mathias_Viscardi!

This is the CloudEvents content type issue. QuickBooks’ v2 schema sends requests with application/cloudevents+json as the Content-Type header, which n8n’s Webhook node doesn’t parse as standard JSON - it either skips the body entirely or returns null for it.

With Raw Body = true (which you already have set), the raw bytes land in $binary.data as a base64-encoded string. Add a Code node right after the Webhook and parse it manually:

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

This gives you the full CloudEvents payload as a normal JSON object. You can then access the QuickBooks event data via $json.data (or whatever key QB uses in the new schema).

1 Like

Hi @nguyenthieutoan !

Thank you very much for your suggestion :smiley: I had to change it slightly to

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

but with that it seems to be working now!!

Thanks again!!

1 Like

Glad it worked! The .binary.data path is the right one for Intuit’s webhook payload since n8n stores raw binary there. Good catch on the adjustment.