Describe the problem/error/question
¡¡Hola!!
Actualmente tenemos una integración con QB que funciona correctamente con el formato antiguo. A partir de agosto, estarán aplicando un cambio a su nuevo esquema…
Nos estamos encontrando con un problema con el nuevo formato de carga útil CloudEvents (esquema v2.0) — el nodo Webhook devuelve un cuerpo vacío ({}), tanto con Raw Body habilitado como deshabilitado 
Resumen rápido de la configuración:
- Nodo Webhook (v2.1) recibiendo solicitudes POST de QuickBooks
- Con Raw Body = false: el cuerpo está presente pero es nulo (
{})
- Con Raw Body = true: el cuerpo está completamente ausente en la salida
Los encabezados llegan correctamente, así que la solicitud definitivamente está llegando al nodo — parece que simplemente n8n no está analizando correctamente el tipo de contenido del cuerpo.
¿Alguien más ha tratado con el nuevo formato de carga útil del webhook de QuickBooks? ¿Alguna solución alternativa para que el cuerpo se analice correctamente?
Problema relacionado en GitHub para referencia: 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 me gusta
¡Bienvenido @Mathias_Viscardi!
La causa raíz es que el nodo webhook de n8n no reconoce application/cloudevents+json como un tipo de contenido que deba analizar automáticamente, por lo que el body llega como null. Con Raw Body = true, el payload debería llegar a la salida binaria. Intenta añadir un nodo Code justo después del webhook y extráelo así:
const raw = $input.item.binary?.data
? Buffer.from($input.item.binary.data, 'base64').toString('utf8')
: $input.item.json.rawBody;
return [{ json: JSON.parse(raw) }];
Si binary.data también está vacío, comprueba $input.item.json - algunas versiones de n8n almacenan la cadena sin procesar bajo una clave rawBody incluso cuando la interfaz gráfica muestra null. Esta es una limitación conocida registrada en el issue de GitHub que vinculaste, así que vale la pena añadir un comentario allí también antes de agosto.
¡Bienvenido @Mathias_Viscardi!
Este es el problema del tipo de contenido CloudEvents. El esquema v2 de QuickBooks envía solicitudes con application/cloudevents+json como encabezado Content-Type, que el nodo Webhook de n8n no analiza como JSON estándar: omite el cuerpo por completo o devuelve null para él.
Con Raw Body = true (que ya tienes configurado), los bytes sin procesar llegan a $binary.data como una cadena codificada en base64. Añade un nodo Code justo después del Webhook y analízalo manualmente:
const rawData = $input.first().binary.data;
const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');
return [{ json: JSON.parse(decoded) }];
Esto te proporciona la carga completa de CloudEvents como un objeto JSON normal. Entonces puedes acceder a los datos del evento de QuickBooks a través de $json.data (o cualquier clave que QB use en el nuevo esquema).
1 me gusta
¡Hola @nguyenthieutoan !
¡Muchas gracias por tu sugerencia!
Tuve que cambiarla un poco a
const rawData = $input.first().binary.data;const decoded = Buffer.from(rawData.data, 'base64').toString('utf8');const parsed = JSON.parse(decoded);return [{ parsed }];
¡pero con eso parece estar funcionando ahora!
¡Gracias de nuevo!
1 me gusta
¡Me alegra que haya funcionado! La ruta .binary.data es la correcta para la carga de webhook de Intuit ya que n8n almacena los datos binarios sin procesar allí. Buen trabajo al hacer el ajuste.