API de webhook do Quickbooks/Intuit retornando corpo nulo

Descreva o problema/erro/pergunta

Oi!!
Atualmente temos uma integração com QB que está funcionando bem, com o formato antigo. A partir de agosto, eles estarão forçando uma mudança para seu novo schema…
Estamos enfrentando um problema com o novo formato de payload do CloudEvents (schema v2.0) — o nó Webhook retorna um corpo vazio ({}), tanto com Raw Body ativado quanto desativado :frowning:
Resumo rápido da configuração:

  • Nó Webhook (v2.1) recebendo requisições POST do QuickBooks
  • Com Raw Body = false: corpo está presente mas nulo ({})
  • Com Raw Body = true: corpo completamente ausente no resultado
    Os headers chegam normalmente, então a requisição está definitivamente atingindo o nó — parece apenas que n8n não está analisando o tipo de conteúdo do corpo corretamente.
    Alguém mais lidou com o novo formato de payload de webhook do QuickBooks? Alguma solução alternativa para obter o corpo analisado corretamente?
    Issue no GitHub relacionada para referência: Quickbooks API returning null body · Issue #28750 · n8n-io/n8n · GitHub

Qual é a mensagem de erro (se houver)? N/A

Por favor, compartilhe seu 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”
}
}

Compartilhe o resultado retornado pelo último nó

{}

Informações sobre sua configuração n8n

  • Versão n8n: 1.123.54
  • Executando n8n via (Docker, npm, n8n cloud, aplicativo desktop): n8n cloud
1 curtida

Bem-vindo @Mathias_Viscardi!

A causa raiz é que o nó webhook do n8n não reconhece application/cloudevents+json como um tipo de conteúdo que deve fazer auto-parse, então o body chega como null. Com Raw Body = true, o payload deve chegar na saída binária. Tente adicionar um nó Code logo após o webhook e extraia assim:

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

Se binary.data também estiver vazio, verifique $input.item.json - algumas versões do n8n armazenam a string bruta sob uma chave rawBody mesmo quando a UI mostra null. Esta é uma lacuna conhecida rastreada na issue do GitHub que você vinculou, então vale a pena adicionar um comentário lá também antes de agosto.

Bem-vindo @Mathias_Viscardi!

Este é o problema do tipo de conteúdo CloudEvents. O schema v2 do QuickBooks envia requisições com application/cloudevents+json como header Content-Type, que o nó Webhook do n8n não analisa como JSON padrão - ele pula o corpo inteiro ou retorna null para ele.

Com Raw Body = true (que você já tem configurado), os bytes brutos chegam em $binary.data como uma string codificada em base64. Adicione um nó Code logo após o Webhook e analise manualmente:

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

Isso fornece o payload completo do CloudEvents como um objeto JSON normal. Você pode então acessar os dados do evento QuickBooks via $json.data (ou qualquer chave que QB use no novo schema).

1 curtida

Oi @nguyenthieutoan !

Muito obrigado pela sua sugestão :smiley: Tive que mudar um pouco para

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

mas com isso parece estar funcionando agora!!

Obrigado novamente!!

1 curtida

Fico feliz que funcionou! O caminho .binary.data é o correto para o payload do webhook do Intuit, já que o n8n armazena os dados binários brutos lá. Boa sacada na sua ajuste.