Can someone help me? Production webhook does not execute workflow (HTTP 500, reading 'execute')

n8n Bug Report – Production Webhook Not Executing
##Describe the problem/error/question
When using the test webhook, the workflow executes correctly.

However, when switching to the production webhook, the workflow does not execute at all. No nodes run and no execution appears in the UI.

Testing the production webhook endpoint via ReqBin returns an HTTP 500 error. Recreating the workflow from scratch did not resolve the issue.
##What is the error message (if any)?
HTTP/1.1 500 Internal Server Error
{ “code”: 0, “message”: “Cannot read properties of undefined (reading ‘execute’)” }

I also did a test of creating workflows from scratch and testing the webhook, but when I added an HTTP request node, the workflow stopped working; it didn’t execute, it didn’t do anything, and no error message appeared.

No additional error is shown in the n8n UI.
Workflow
I can’t attach the file here because I’m a new user, so I’ll paste the workflow’s JSON code instead.
All credentials, API keys, private URLs and IDs have been removed.
Output of the last node
There is no output when the production webhook is triggered because the workflow does not start execution.

When using the test webhook, the workflow executes normally and returns the expected outputs.
Debug Info
n8nVersion: 2.2.4
Platform: Docker (self-hosted)
Node.js: 22.21.0
Execution mode: scaling (single-main)
Database: Postgres
License: Community

json code:
{
“name”: “Transcribe - Audio”,
“nodes”: [
{
“parameters”: {
“httpMethod”: “POST”,
“path”: “audioTR”,
“options”: {}
},
“type”: “n8n-nodes-base.webhook”,
“typeVersion”: 2.1,
“position”: [
-2192,
192
],
“id”: “07cc861f-d59a-441d-ba6e-6e788e04481b”,
“name”: “Webhook”,
“webhookId”: “a736cbef-6bea-4b15-bff4-ddf763efec9a”
},
{
“parameters”: {
“jsCode”: “// Obtém o primeiro item e acessa o caminho exato para o remoteJid\nconst input = $input.first().json;\nlet result = {};\n\ntry {\n // Verifica se o caminho completo existe\n if (input && input.body && input.body.data && input.body.data.key && input.body.data.key.remoteJid) {\n // Extrai apenas o número de telefone removendo “@s.whatsapp.net”\n const remoteJid = input.body.data.key.remoteJid;\n const phoneNumber = remoteJid.split(‘@’)[0];\n \n // Retorna apenas o número de telefone\n result = { phoneNumber };\n } else {\n result = { error: “Caminho para remoteJid não encontrado” };\n }\n} catch (error) {\n result = { error: Erro ao processar: ${error.message} };\n}\n\nreturn [{ json: result }];\n\nreturn [{\n …$json,\n instancia: $json.body?.instance || null,\n numero: $json.body?.data?.key?.remoteJid || null\n}];”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-2064,
192
],
“id”: “6d8c4c8f-2404-4e32-96ea-f7d208ba7f97”,
“name”: “Code”
},
{
“parameters”: {
“assignments”: {
“assignments”: [
{
“id”: “6d80c877-6b6b-483f-925f-5ff802b73f0e”,
“name”: “body.data.key.id”,
“value”: “={{ $(‘Webhook’).item.json.body.data.key.id }}”,
“type”: “string”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.set”,
“typeVersion”: 3.4,
“position”: [
-1920,
192
],
“id”: “a18962c9-72b5-46c0-be54-fffb017c59ba”,
“name”: “Obter ID”
},
{
“parameters”: {
“method”: “POST”,
“url”: “<REDACTED_SERVER_URL>”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “apikey”,
“value”: “<REDACTED_API_KEY>”
}
]
},
“sendBody”: true,
“specifyBody”: “json”,
“jsonBody”: “={\n “message”: {\n “key”: {\n “id”: “{{ $json.body.data.key.id }}”\n }\n },\n “convertToMp4”: false\n} “,
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
-1776,
192
],
“id”: “b0c77a99-bae5-487f-b2db-ac65ee90b3f9”,
“name”: “Puxar áudio”
},
{
“parameters”: {
“assignments”: {
“assignments”: [
{
“id”: “3d05bf95-147c-404d-942d-9c598c63b673”,
“name”: “base64”,
“value”: “={{ $json.base64 }}”,
“type”: “string”
},
{
“id”: “68aff43f-8f4d-455c-b431-e899e390ea72”,
“name”: “Numero”,
“value”: “={{ $(‘Code’).item.json.phoneNumber }}”,
“type”: “string”
},
{
“id”: “20282750-b46f-4896-9bdf-cf91e122f41a”,
“name”: “instancia”,
“value”: “={{ $(‘Webhook’).item.json.body.instance }}”,
“type”: “string”
},
{
“id”: “712433ee-5ad6-4e0a-94c2-88ea43da522e”,
“name”: “api_key_evolution”,
“value”: “={{ $(‘Webhook’).item.json.body.apikey }}”,
“type”: “string”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.set”,
“typeVersion”: 3.4,
“position”: [
-1632,
192
],
“id”: “7218ab50-fff7-4d4f-8c0c-35d89426a28b”,
“name”: “Global”
},
{
“parameters”: {
“rules”: {
“values”: [
{
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“leftValue”: “={{ $(‘Webhook’).item.json.body.data.messageType }}”,
“rightValue”: “extendedTextMessage”,
“operator”: {
“type”: “string”,
“operation”: “equals”
},
“id”: “ada87cb4-7398-4349-99f9-42db3bf29c87”
}
],
“combinator”: “and”
},
“renameOutput”: true,
“outputKey”: “Texto”
},
{
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“id”: “bc52dac7-63af-4115-94fb-86e70377624d”,
“leftValue”: “={{ $(‘Webhook’).item.json.body.data.messageType }}”,
“rightValue”: “audioMessage”,
“operator”: {
“type”: “string”,
“operation”: “equals”,
“name”: “filter.operator.equals”
}
}
],
“combinator”: “and”
},
“renameOutput”: true,
“outputKey”: “Áudio”
},
{
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“id”: “a71a3f73-5251-471d-8ab9-a2c1e76d1de7”,
“leftValue”: “={{ $(‘Webhook’).item.json.body.data.messageType }}”,
“rightValue”: “imageMessage”,
“operator”: {
“type”: “string”,
“operation”: “equals”,
“name”: “filter.operator.equals”
}
}
],
“combinator”: “and”
},
“renameOutput”: true,
“outputKey”: “Imagem”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.switch”,
“typeVersion”: 3.3,
“position”: [
-1504,
176
],
“id”: “dbedc607-8e22-43c6-8f34-d661135d3907”,
“name”: “Switch”
},
{
“parameters”: {
“operation”: “toBinary”,
“sourceProperty”: “base64”,
“options”: {
“fileName”: “audio.mp3”,
“mimeType”: “audio/mpeg”
}
},
“type”: “n8n-nodes-base.convertToFile”,
“typeVersion”: 1.1,
“position”: [
-1328,
192
],
“id”: “a33c69cd-2901-4a50-a75e-2b3e1dcfc24f”,
“name”: “Convert to File”
},
{
“parameters”: {
“resource”: “audio”,
“operation”: “transcribe”,
“options”: {}
},
“type”: “@n8n/n8n-nodes-langchain.openAi”,
“typeVersion”: 2,
“position”: [
-1168,
192
],
“id”: “27d65666-bf6e-456e-b5ed-7aeeaf221f21”,
“name”: “Transcribe a recording”,
“credentials”: {}
},
{
“parameters”: {
“modelId”: {
“__rl”: true,
“value”: “gpt-4.1-mini”,
“mode”: “list”,
“cachedResultName”: “GPT-4.1-MINI”
},
“responses”: {
“values”: [
{
“content”: “=A partir do texto abaixo, extraia as informações e retorne SOMENTE um JSON válido.\n\nCampos obrigatórios:\n- paciente (string)\n- procedimento (string)\n- codigo (string ou null)\n- data (YYYY-MM-DD ou null)\n- hora (HH:mm ou null)\n\nRegras IMPORTANTES:\n- Datas em português devem ser convertidas corretamente.\n Exemplo:\n “10 de outubro” → 2026-10-10\n “amanhã” → data atual + 1 dia\n- Considere o fuso America/Sao_Paulo\n- NÃO escreva texto fora do JSON\n- NÃO use ```json\n- Se algo não existir, retorne null\n- Procedimento deve ser curto (ex: “limpeza”, “tratamento periodontal”)\n\nTexto:\n{{$json.text}}\n”
},
{
“role”: “system”,
“content”: “Você é um agente de agendamento odontológico.\n\nREGRAS ABSOLUTAS:\n1. CÓDIGO DE PROCEDIMENTO NUNCA É HORÁRIO.\n2. HORÁRIO SEMPRE vem acompanhado de palavras como:\n - horas\n - da manhã / da tarde / da noite\n - h\n3. CÓDIGO DE PROCEDIMENTO é SEMPRE um NÚMERO ISOLADO, geralmente com 3 ou 4 dígitos.\n4. NUNCA converta código em horário.\n5. NUNCA converta horário em código.\n6. Se houver ambiguidade entre código e horário, PRIORIZE:\n - Horário → contexto de tempo\n - Código → contexto de procedimento\n\nSe o usuário disser algo como:\n"doze e trinta”\n→ isso É HORÁRIO, NÃO código.\n\nSe o usuário disser:\n"código do procedimento é 1230”\n→ isso É CÓDIGO, NÃO horário.\n\nSe houver dúvida:\n- NÃO invente\n- Marque o campo como null\n- Peça confirmação educadamente.\n”
}
]
},
“builtInTools”: {},
“options”: {}
},
“type”: “@n8n/n8n-nodes-langchain.openAi”,
“typeVersion”: 2,
“position”: [
-1040,
192
],
“id”: “c752d58c-5a2e-47f2-a7b7-591d3bbf32c7”,
“name”: “Message a model”,
“credentials”: {}
},
{
“parameters”: {
“jsCode”: “if ($json.codigo) {\n return [{\n json: {\n tipoBusca: “codigo”,\n valorBusca: $json.codigo\n }\n }];\n}\n\nreturn [{\n json: {\n tipoBusca: “nome”,\n valorBusca: $json.procedimento\n }\n}];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-384,
96
],
“id”: “411353ac-23d9-497f-901e-7e073d80b60c”,
“name”: “Preparar busca?”
},
{
“parameters”: {
“jsCode”: “const contexto = $json;\n\nconst paciente = contexto.paciente ?? “paciente”;\n\nconst message = \n⚠️ *Informações incompletas*\n\nOi ${paciente}! \nPara continuar a anotaçãoo, preciso que você informe:\n\n📅 *Data* \n⏰ *Horário* \n🦷 *Procedimento ou código*\n\nPode me enviar esses dados novamente? 😊;\n\nreturn [\n {\n json: {\n message\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-384,
288
],
“id”: “d2d78dad-50e0-4154-98d2-428b123cbe09”,
“name”: “Code in JavaScript2”
},
{
“parameters”: {
“method”: “POST”,
“url”: “<REDACTED_SERVER_URL>”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “apikey”,
“value”: “<REDACTED_API_KEY>”
},
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “number”,
“value”: “={{ $(‘Webhook’).item.json.body.data.key.remoteJidAlt }}”
},
{
“name”: “text”,
“value”: “={{ $json.message }}”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
-192,
288
],
“id”: “71bcef06-746f-4005-ac5d-c393ae4bd4dd”,
“name”: “HTTP Request”
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“id”: “83ec7aed-1531-490c-b0ad-040f4b54dc53”,
“leftValue”: “={{ $json.tipoBusca }}”,
“rightValue”: “codigo”,
“operator”: {
“type”: “string”,
“operation”: “equals”,
“name”: “filter.operator.equals”
}
}
],
“combinator”: “and”
},
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.2,
“position”: [
-208,
96
],
“id”: “535d01e3-9fc8-4790-80a6-eee42416a1e6”,
“name”: “If1”
},
{
“parameters”: {
“operation”: “getAll”,
“tableId”: “procedimentos”,
“limit”: 1,
“filters”: {
“conditions”: [
{
“keyName”: “codigo”,
“condition”: “eq”,
“keyValue”: “={{ $json.valorBusca }}”
}
]
}
},
“type”: “n8n-nodes-base.supabase”,
“typeVersion”: 1,
“position”: [
0,
0
],
“id”: “feec8255-7ae6-483e-b2bb-9d54193feb47”,
“name”: “Get many rows - código”,
“credentials”: {}
},
{
“parameters”: {
“operation”: “getAll”,
“tableId”: “procedimentos”,
“limit”: 1,
“filters”: {
“conditions”: [
{
“keyName”: “nome”,
“condition”: “like”,
“keyValue”: “=%{{ $json.valorBusca }}%”
}
]
}
},
“type”: “n8n-nodes-base.supabase”,
“typeVersion”: 1,
“position”: [
0,
160
],
“id”: “e98c7c32-0106-4c76-b6f7-e1cb0a747f39”,
“name”: “Get many rows - nome”,
“credentials”: {}
},
{
“parameters”: {
“jsCode”: “let raw =\n $json.message?.content ||\n $json.content ||\n $json.text;\n\nif (!raw) {\n return [{\n json: {\n paciente: null,\n procedimento: null,\n codigo: null,\n data: null,\n hora: null,\n erro: “Resposta vazia do OpenAI”\n }\n }];\n}\n\nraw = raw.replace(/```json|```/g, ‘’).trim();\n\ntry {\n const parsed = JSON.parse(raw);\n return [{\n json: {\n paciente: parsed.paciente ?? null,\n procedimento: parsed.procedimento ?? null,\n codigo: parsed.codigo ?? null,\n data: parsed.data ?? null,\n hora: parsed.hora ?? null\n }\n }];\n} catch (e) {\n return [{\n json: {\n paciente: null,\n procedimento: null,\n codigo: null,\n data: null,\n hora: null,\n erro: “JSON inválido”\n }\n }];\n}\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
-752,
192
],
“id”: “5feb70df-9642-402f-a8cb-3e2735e04cb9”,
“name”: “Code in JavaScript1”
},
{
“parameters”: {
“jsCode”: “// :small_blue_diamond: Procedimento vindo do Supabase\nconst procedimento = $json;\n\n// :small_blue_diamond: Contexto ORIGINAL vindo do OpenAI\nconst contexto = $items(“If - dados completos?”)[0]?.json;\n\nif (!contexto) {\n throw new Error(“Contexto original não encontrado”);\n}\n\nlet { paciente, data, hora } = contexto;\n\nif (!data || !hora) {\n throw new Error(“Data ou hora ausentes para criar evento”);\n}\n\n/\n * ===============================\n * :one: CORRIGE O ANO AUTOMATICAMENTE\n * ===============================\n */\nconst hoje = new Date();\nconst anoAtual = hoje.getFullYear();\n\n// data vem no formato YYYY-MM-DD\nconst [, mes, dia] = data.split(“-”);\nconst dataCorrigida = ${anoAtual}-${mes}-${dia};\n\n/\n * ===============================\n * :two: CRIA DATE LOCAL (SEM OFFSET)\n * ===============================\n */\nconst startLocal = new Date(${dataCorrigida}T${hora}:00);\n\n/**\n * ===============================\n * :three: CONVERTE PARA UTC (ISO)\n * ===============================\n */\nconst start = startLocal.toISOString();\n\n// End fictício (+1h só para o Google Calendar aceitar)\nconst end = new Date(startLocal.getTime() + 60 * 60 * 1000).toISOString();\n\nreturn [\n {\n json: {\n paciente,\n procedimento: procedimento.nome,\n codigo: procedimento.codigo,\n especialidade: procedimento.especialidade,\n sessoes: procedimento.sessoes ?? 1,\n valor: procedimento.valor,\n\n // :white_check_mark: FORMATO CORRETO PARA O GOOGLE\n start,\n end\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
432,
0
],
“id”: “de9279e8-2f97-4937-b1af-f21324d4b185”,
“name”: “Code in JavaScript”
},
{
“parameters”: {
“jsCode”: “const contexto = $json;\n\nconst paciente = contexto.paciente ?? “paciente”;\nconst procedimentoInformado = contexto.procedimento ?? “o procedimento informado”;\n\nconst message =\n❌ *Procedimento não encontrado*\n\nOi ${paciente}! \nNão encontrei *${procedimentoInformado}* no nosso sistema 😕\n\n📋 Você pode:\n• Informar o *nome correto* do procedimento \n• Ou enviar o *código do procedimento*\n\nFico no aguardo 😊;\n\nreturn [\n {\n json: {\n message\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
432,
192
],
“id”: “ca2226a2-b7b3-4633-b2a6-0cdeceaf419c”,
“name”: “Code in JavaScript3”
},
{
“parameters”: {
“calendar”: {
“__rl”: true,
“value”: “<REDACTED_CALENDAR_ID>”,
“mode”: “list”,
“cachedResultName”: “ORÇAMENTOS ODONTO”
},
“start”: “={{ $json.start }}”,
“end”: “={{ $json.end }}”,
“additionalFields”: {
“description”: “=Paciente: {{ $json.paciente }}\nProcedimento: {{ $json.procedimento }}\nCódigo: {{ $json.codigo }}\nValor: R$ {{ $json.valor }}\nSessões: {{ $json.sessoes }}”,
“summary”: “={{ $json.paciente }} - {{ $json.procedimento }}”
}
},
“type”: “n8n-nodes-base.googleCalendar”,
“typeVersion”: 1.3,
“position”: [
592,
0
],
“id”: “cca438ea-7666-4dfc-80d6-ca8ed8c96d5c”,
“name”: “Create an event”,
“credentials”: {}
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“id”: “d6630518-7658-4a58-b760-16e6a6d47849”,
“leftValue”: “={{ $json.paciente }}”,
“rightValue”: “”,
“operator”: {
“type”: “string”,
“operation”: “notEmpty”,
“singleValue”: true
}
},
{
“id”: “15af8a26-c266-4290-ba80-04c8c8819ca3”,
“leftValue”: “={{ $json.data }}”,
“rightValue”: “”,
“operator”: {
“type”: “string”,
“operation”: “notEmpty”,
“singleValue”: true
}
},
{
“id”: “967f8f0f-3274-46b4-9a39-bc129a7ce34b”,
“leftValue”: “={{ $json.hora }}”,
“rightValue”: “”,
“operator”: {
“type”: “string”,
“operation”: “notEmpty”,
“singleValue”: true
}
},
{
“id”: “e3f552d1-69a7-42da-9e33-ec86d06bbf3f”,
“leftValue”: “={{ $json.procedimento }}”,
“rightValue”: “”,
“operator”: {
“type”: “string”,
“operation”: “notEmpty”,
“singleValue”: true
}
}
],
“combinator”: “and”
},
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.2,
“position”: [
-592,
192
],
“id”: “d90ba6f6-0840-4bd7-a481-eaba033e83fe”,
“name”: “If - dados completos?”
},
{
“parameters”: {
“method”: “POST”,
“url”: “<REDACTED_SERVER_URL>”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “apikey”,
“value”: “<REDACTED_API_KEY>”
},
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “number”,
“value”: “={{ $(‘Webhook’).item.json.body.data.key.remoteJidAlt }}”
},
{
“name”: “text”,
“value”: “={{ $json.mensagem_whatsapp }}”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
880,
0
],
“id”: “f5dfcb92-1d78-4fab-aaea-d8f070d5a08e”,
“name”: “HTTP Request1”
},
{
“parameters”: {
“method”: “POST”,
“url”: “<REDACTED_SERVER_URL>”,
“sendHeaders”: true,
“headerParameters”: {
“parameters”: [
{
“name”: “apikey”,
“value”: “<REDACTED_API_KEY>”
},
{
“name”: “Content-Type”,
“value”: “application/json”
}
]
},
“sendBody”: true,
“bodyParameters”: {
“parameters”: [
{
“name”: “number”,
“value”: “={{ $(‘Webhook’).item.json.body.data.key.remoteJidAlt }}”
},
{
“name”: “text”,
“value”: “={{ $json.mensagem_whatsapp }}”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.httpRequest”,
“typeVersion”: 4.3,
“position”: [
608,
192
],
“id”: “5da49cba-8d7e-4d6a-bb40-e6b28101b4ed”,
“name”: “HTTP Request2”
},
{
“parameters”: {
“conditions”: {
“options”: {
“caseSensitive”: true,
“leftValue”: “”,
“typeValidation”: “strict”,
“version”: 2
},
“conditions”: [
{
“id”: “8765b1cd-e452-4a14-8ec4-25375328a28b”,
“leftValue”: “={{ $items().length }}”,
“rightValue”: 0,
“operator”: {
“type”: “number”,
“operation”: “gt”
}
}
],
“combinator”: “and”
},
“options”: {}
},
“type”: “n8n-nodes-base.if”,
“typeVersion”: 2.2,
“position”: [
224,
96
],
“id”: “f1aafe66-d4ef-4221-8857-36d8ef4b3b81”,
“name”: “IF – procedimento encontrado?”
},
{
“parameters”: {
“jsCode”: “// :small_blue_diamond: Dados corretos vindos do node que criou o agendamento\nconst dados = $items(“Code in JavaScript”)[0].json;\n// ↑ TROQUE o nome pelo nome exato do seu node\n\nconst {\n paciente,\n procedimento,\n start,\n end\n} = dados;\n\n// :small_blue_diamond: Converte datas ISO corretamente\nconst startDate = new Date(start);\nconst endDate = new Date(end);\n\n// :small_blue_diamond: Formata para PT-BR\nconst data = startDate.toLocaleDateString(“pt-BR”);\n\nconst horaInicio = startDate.toLocaleTimeString(“pt-BR”, {\n hour: “2-digit”,\n minute: “2-digit”\n});\n\nconst horaFim = endDate.toLocaleTimeString(“pt-BR”, {\n hour: “2-digit”,\n minute: “2-digit”\n});\n\n// :small_blue_diamond: Texto final do WhatsApp\nconst mensagem = \n✅ *Agendamento confirmado*\n\n👤 *Paciente:* ${paciente}\n🦷 *Procedimento:* ${procedimento}\n📅 *Data:* ${data}\n⏰ *Horário:* ${horaInicio} às ${horaFim}\n\nQualquer dúvida é só responder 😊;\n\nreturn [\n {\n json: {\n mensagem_whatsapp: mensagem\n }\n }\n];\n”
},
“type”: “n8n-nodes-base.code”,
“typeVersion”: 2,
“position”: [
736,
0
],
“id”: “64e96bea-dee9-4954-8d8d-c5edae57962f”,
“name”: “Code in JavaScript4”
}
],
“pinData”: {},
“connections”: {
“Webhook”: {
“main”: [
[
{
“node”: “Code”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code”: {
“main”: [
[
{
“node”: “Obter ID”,
“type”: “main”,
“index”: 0
}
]
]
},
“Obter ID”: {
“main”: [
[
{
“node”: “Puxar áudio”,
“type”: “main”,
“index”: 0
}
]
]
},
“Puxar áudio”: {
“main”: [
[
{
“node”: “Global”,
“type”: “main”,
“index”: 0
}
]
]
},
“Global”: {
“main”: [
[
{
“node”: “Switch”,
“type”: “main”,
“index”: 0
}
]
]
},
“Switch”: {
“main”: [
,
[
{
“node”: “Convert to File”,
“type”: “main”,
“index”: 0
}
]
]
},
“Convert to File”: {
“main”: [
[
{
“node”: “Transcribe a recording”,
“type”: “main”,
“index”: 0
}
]
]
},
“Transcribe a recording”: {
“main”: [
[
{
“node”: “Message a model”,
“type”: “main”,
“index”: 0
}
]
]
},
“Message a model”: {
“main”: [
[
{
“node”: “Code in JavaScript1”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript2”: {
“main”: [
[
{
“node”: “HTTP Request”,
“type”: “main”,
“index”: 0
}
]
]
},
“Preparar busca?”: {
“main”: [
[
{
“node”: “If1”,
“type”: “main”,
“index”: 0
}
]
]
},
“If1”: {
“main”: [
[
{
“node”: “Get many rows - código”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Get many rows - nome”,
“type”: “main”,
“index”: 0
}
]
]
},
“Get many rows - nome”: {
“main”: [
[
{
“node”: “IF – procedimento encontrado?”,
“type”: “main”,
“index”: 0
}
]
]
},
“Get many rows - código”: {
“main”: [
[
{
“node”: “IF – procedimento encontrado?”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript1”: {
“main”: [
[
{
“node”: “If - dados completos?”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript3”: {
“main”: [
[
{
“node”: “HTTP Request2”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript”: {
“main”: [
[
{
“node”: “Create an event”,
“type”: “main”,
“index”: 0
}
]
]
},
“Create an event”: {
“main”: [
[
{
“node”: “Code in JavaScript4”,
“type”: “main”,
“index”: 0
}
]
]
},
“If - dados completos?”: {
“main”: [
[
{
“node”: “Preparar busca?”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Code in JavaScript2”,
“type”: “main”,
“index”: 0
}
]
]
},
“IF – procedimento encontrado?”: {
“main”: [
[
{
“node”: “Code in JavaScript”,
“type”: “main”,
“index”: 0
}
],
[
{
“node”: “Code in JavaScript3”,
“type”: “main”,
“index”: 0
}
]
]
},
“Code in JavaScript4”: {
“main”: [
[
{
“node”: “HTTP Request1”,
“type”: “main”,
“index”: 0
}
]
]
}
},
“active”: false,
“settings”: {
“executionOrder”: “v1”
},
“versionId”: “feca734e-75df-4f52-b960-dee67b2e5ca1”,
“meta”: {
“instanceId”: “be1d5ebbea0c486bb7f5c07998d48d2c2924aaf76e8b41f436914215efa468f5”
},
“id”: “LidnEX98OiUsgNAo”,
“tags”:
}

Hi @Daniel_Matos

Please make sure you put the workflow json inside a code block else we are unable to use it.

Can you also please share your docker compose file or the command you used to start up your instance? Remember to REDACT any sensitive values like passwords and keys

1 Like

Hi! I’m running n8n on Easypanel (Docker) with separate services: n8n_editor, n8n_webhook, n8n_worker, postgres and redis.

n8n version / image

  • n8n image: n8nio/n8n:2.2.4
  • execution mode: queue

n8n_editor (Environment) - REDACTED

DB_POSTGRESDB_DATABASE=$(PROJECT_NAME)
DB_POSTGRESDB_HOST=$(PROJECT_NAME)_n8n_postgres
DB_POSTGRESDB_PASSWORD=<REDACTED>
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=postgres
DB_TYPE=postgresdb

QUEUE_BULL_REDIS_HOST=$(PROJECT_NAME)_redis_n8n
QUEUE_BULL_REDIS_PASSWORD=<REDACTED>
QUEUE_BULL_REDIS_PORT=6379

EXECUTIONS_MODE=queue
EXECUTIONS_DATA_MAX_AGE=336
EXECUTIONS_DATA_PRUNE=true

GENERIC_TIMEZONE=America/Sao_Paulo
N8N_DIAGNOSTICS_ENABLED=false

N8N_EDITOR_BASE_URL=https://n8neditor.aureonvps.site
N8N_ENCRYPTION_KEY=<REDACTED>
N8N_HOST=n8neditor.aureonvps.site
N8N_PROTOCOL=https

NODE_ENV=production
NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash,moment-with-locales
N8N_LOG_LEVEL=debug
N8N_LOG_OUTPUT=file,console

Okay, if you need anything else, let me know!

I also need the docker compose or docker commands you used to start up your services.

I’m running n8n on Easypanel (Docker). Easypanel manages the containers, so I don’t have a single docker-compose.yml file. Below are the docker start commands and the equivalent service details (secrets redacted).

Images

  • n8n_editor: n8nio/n8n:2.2.4
  • n8n_webhook: n8nio/n8n:2.2.4
  • n8n_worker: n8nio/n8n:2.2.4

Start commands (as configured in Easypanel)

# n8n_editor
n8n start

# n8n_webhook
n8n webhook

# n8n_worker
n8n worker --concurrency=5

Domain / Proxy (Easypanel)

  • n8n_editor: https://n8neditor.aureonvps.site → http://n8n_n8n_editor:5678
    n8n_webhook domain is the same thing that n8n_editor on easypanel
    n8n_worker doesn’t have domain on easypanel

Storage / Mounts (Easypanel)

  • volume “data” mounted to: /home/node/.n8n

It’t very difficult to see what the actual configuration is you’re using. What I am trying to establish is whether your different containers are actually talking to each other.

Is there is a specific reason you’re using separate webhook processor containers?

Setting webhook processors is optional unless you’re planning to scale

You’re right — env vars alone don’t prove connectivity. I ran internal DNS + TCP checks from the n8n_editor container console and confirmed the services can reach Postgres and Redis.

Hostnames from env

DB_HOST=n8n_n8n_postgres
DB_PORT=5432
REDIS_HOST=n8n_redis_n8n
REDIS_PORT=6379

DNS resolution (internal)

getent hosts n8n_n8n_postgres
# 10.11.0.8  n8n_n8n_postgres

getent hosts n8n_redis_n8n
# 10.11.0.9  n8n_redis_n8n

TCP connectivity (ports open)

nc -zvw3 n8n_n8n_postgres 5432
# ... open

nc -zvw3 n8n_redis_n8n 6379
# ... open

Why separate webhook/worker?

I’m using queue mode and set up separate services following the scaling pattern:

  • n8n_editor: n8n start

  • n8n_webhook: n8n webhook

  • n8n_worker: n8n worker --concurrency=5

Domain/Proxy currently points to editor:

any updates?