Hey everyone, I’m facing a strange issue with my n8n workflow and I’d like to know if anyone has seen something similar.
I’m using a Webhook node that receives events from Plane (a project/task management tool).
Whenever a task is created, updated, or commented, Plane sends a webhook to my n8n workflow.
Inside the workflow:
-
I check what type of event it is (comment, creation, etc).
-
I query my MySQL database to check if that task already exists.
-
If it doesn’t, I create a thread on Discord and insert the task info into the database.
The problem:
Even though the workflow shows only 1 item in the output of every node, the workflow:
-
Creates 2 identical Discord threads, and
-
Inserts 2 identical rows in MySQL (only the thread_id differs).
Things I’ve already checked:
-
Webhook is set to Respond: Immediately.
-
No duplicated connections or extra branches in the workflow.
-
Plane is sending only one webhook (confirmed in logs).
-
No retry or split nodes configured.
Yet it seems like n8n is somehow executing the same workflow twice in parallel, even though only one item shows in the run data.
Has anyone experienced this behavior before? Any ideas what might cause this kind of silent duplication?
Workflow
{
"name": "Plane to Discord",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "plane-to-discord",
"options": {
"rawBody": false
}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [-1376, 400],
"id": "ea149c9f-a492-4273-8039-4775105b3e0e",
"name": "Webhook",
"webhookId": "<REDACTED>",
"executeOnce": false,
"alwaysOutputData": false
},
{
"parameters": {
"method": "POST",
"url": "https://discord.com/api/webhooks/<REDACTED>?wait=true",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ ... }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-432, 688],
"id": "899ac229-c0aa-4f2d-9d8c-7ee20b8ff7b0",
"name": "Create Thread",
"executeOnce": true
},
{
"parameters": {
"method": "PATCH",
"url": "=https://discord.com/api/webhooks/<REDACTED>/messages/{{ $json.discord_first_message_id }}?thread_id={{ $json.discord_thread_id }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ ... }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-432, 320],
"id": "85f6534f-d06b-419c-97b3-07840276b302",
"name": "Update Thread",
"executeOnce": true
},
{
"parameters": {
"method": "POST",
"url": "=https://discord.com/api/webhooks/<REDACTED>?thread_id={{ $json.discord_thread_id }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ ... }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-704, 304],
"id": "6099c337-348a-4ea3-92c6-05b0a3dd17cf",
"name": "Add Comment",
"executeOnce": true
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.sequence_id }}",
"operator": { "type": "number", "operation": "exists" }
}
],
"combinator": "or"
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-704, 496],
"id": "6d1991f2-1dfb-4e77-953e-014895b8ca86",
"name": "Exist in DB?",
"executeOnce": true
},
{
"parameters": {
"table": "issue_threads",
"dataMode": "defineBelow",
"valuesToSend": {
"values": [
{ "column": "issue_id", "value": "={{ $('Webhook').item.json.body.data.id }}" },
{ "column": "project_id", "value": "={{ $('Webhook').item.json.body.data.project }}" },
{ "column": "discord_thread_id", "value": "={{ $json.channel_id }}" },
{ "column": "discord_first_message_id", "value": "={{ $json.id }}" },
{ "column": "sequence_id", "value": "={{ $('Webhook').item.json.body.data.sequence_id }}" }
]
}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-208, 688],
"id": "829d69e4-f13d-46f7-b588-fb91128f836e",
"name": "Insert rows in a table",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"operation": "select",
"table": "issue_threads",
"limit": 1,
"where": { "values": [{ "column": "issue_id", "value": "={{ $json.body.data.issue }}" }] }
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 304],
"id": "a1efd0b4-7ae4-4e3a-abee-599ad83fbcee",
"name": "Find Thread",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"operation": "select",
"table": "issue_threads",
"limit": 1,
"where": { "values": [{ "column": "sequence_id", "value": "={{ $json.body.data.sequence_id }}" }] }
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 496],
"id": "53496686-8f9f-4ca4-9672-2ef8dd4cf36c",
"name": "Verify Thread",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"conditions": {
"options": { "caseSensitive": true, "typeValidation": "strict", "version": 2 },
"conditions": [
{
"leftValue": "={{ $json.body.event }}",
"rightValue": "issue_comment",
"operator": { "type": "string", "operation": "equals" }
}
],
"combinator": "and"
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-1152, 400],
"id": "2b3a908d-eae8-445e-98bd-a12f3ea6bd21",
"name": "is Comment?",
"executeOnce": true
}
],
"connections": {
"Webhook": { "main": [[{ "node": "is Comment?", "type": "main", "index": 0 }]] },
"Create Thread": { "main": [[{ "node": "Insert rows in a table", "type": "main", "index": 0 }]] },
"Exist in DB?": {
"main": [
[{ "node": "Update Thread", "type": "main", "index": 0 }],
[{ "node": "Create Thread", "type": "main", "index": 0 }]
]
},
"Find Thread": { "main": [[{ "node": "Add Comment", "type": "main", "index": 0 }]] },
"Verify Thread": { "main": [[{ "node": "Exist in DB?", "type": "main", "index": 0 }], []] },
"is Comment?": {
"main": [
[{ "node": "Find Thread", "type": "main", "index": 0 }],
[{ "node": "Verify Thread", "type": "main", "index": 0 }]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1",
"timezone": "America/Sao_Paulo"
},
"versionId": "<REDACTED>",
"meta": { "instanceId": "<REDACTED>" },
"id": "FEwf8ESrIyaWOvNw",
"tags": []
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-432, 688],
"id": "899ac229-c0aa-4f2d-9d8c-7ee20b8ff7b0",
"name": "Create Thread",
"executeOnce": true
},
{
"parameters": {
"method": "PATCH",
"url": "=https://discord.com/api/webhooks/<REDACTED>/messages/{{ $json.discord_first_message_id }}?thread_id={{ $json.discord_thread_id }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ ... }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-432, 320],
"id": "85f6534f-d06b-419c-97b3-07840276b302",
"name": "Update Thread",
"executeOnce": true
},
{
"parameters": {
"method": "POST",
"url": "=https://discord.com/api/webhooks/<REDACTED>?thread_id={{ $json.discord_thread_id }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ ... }",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-704, 304],
"id": "6099c337-348a-4ea3-92c6-05b0a3dd17cf",
"name": "Add Comment",
"executeOnce": true
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.sequence_id }}",
"operator": { "type": "number", "operation": "exists" }
}
],
"combinator": "or"
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-704, 496],
"id": "6d1991f2-1dfb-4e77-953e-014895b8ca86",
"name": "Exist in DB?",
"executeOnce": true
},
{
"parameters": {
"table": "issue_threads",
"dataMode": "defineBelow",
"valuesToSend": {
"values": [
{ "column": "issue_id", "value": "={{ $('Webhook').item.json.body.data.id }}" },
{ "column": "project_id", "value": "={{ $('Webhook').item.json.body.data.project }}" },
{ "column": "discord_thread_id", "value": "={{ $json.channel_id }}" },
{ "column": "discord_first_message_id", "value": "={{ $json.id }}" },
{ "column": "sequence_id", "value": "={{ $('Webhook').item.json.body.data.sequence_id }}" }
]
}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-208, 688],
"id": "829d69e4-f13d-46f7-b588-fb91128f836e",
"name": "Insert rows in a table",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"operation": "select",
"table": "issue_threads",
"limit": 1,
"where": { "values": [{ "column": "issue_id", "value": "={{ $json.body.data.issue }}" }] }
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 304],
"id": "a1efd0b4-7ae4-4e3a-abee-599ad83fbcee",
"name": "Find Thread",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"operation": "select",
"table": "issue_threads",
"limit": 1,
"where": { "values": [{ "column": "sequence_id", "value": "={{ $json.body.data.sequence_id }}" }] }
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 496],
"id": "53496686-8f9f-4ca4-9672-2ef8dd4cf36c",
"name": "Verify Thread",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": { "id": "<REDACTED>", "name": "<REDACTED>" }
}
},
{
"parameters": {
"conditions": {
"options": { "caseSensitive": true, "typeValidation": "strict", "version": 2 },
"conditions": [
{
"leftValue": "={{ $json.body.event }}",
"rightValue": "issue_comment",
"operator": { "type": "string", "operation": "equals" }
}
],
"combinator": "and"
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-1152, 400],
"id": "2b3a908d-eae8-445e-98bd-a12f3ea6bd21",
"name": "is Comment?",
"executeOnce": true
}
],
"connections": {
"Webhook": { "main": [[{ "node": "is Comment?", "type": "main", "index": 0 }]] },
"Create Thread": { "main": [[{ "node": "Insert rows in a table", "type": "main", "index": 0 }]] },
"Exist in DB?": {
"main": [
[{ "node": "Update Thread", "type": "main", "index": 0 }],
[{ "node": "Create Thread", "type": "main", "index": 0 }]
]
},
"Find Thread": { "main": [[{ "node": "Add Comment", "type": "main", "index": 0 }]] },
"Verify Thread": { "main": [[{ "node": "Exist in DB?", "type": "main", "index": 0 }], []] },
"is Comment?": {
"main": [
[{ "node": "Find Thread", "type": "main", "index": 0 }],
[{ "node": "Verify Thread", "type": "main", "index": 0 }]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1",
"timezone": "America/Sao_Paulo"
},
"versionId": "<REDACTED>",
"meta": { "instanceId": "<REDACTED>" },
"id": "FEwf8ESrIyaWOvNw",
"tags": []
}
Output returned by the last node
{
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "plane-to-discord",
"options": {
"rawBody": false
}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [-1376, 400],
"id": "ea149c9f-a492-4273-8039-4775105b3e0e",
"name": "Webhook",
"webhookId": "<REDACTED_WEBHOOK_ID>",
"executeOnce": false,
"alwaysOutputData": false
},
{
"parameters": {
"method": "POST",
"url": "https://discord.com/api/webhooks/<REDACTED_DISCORD_WEBHOOK>?wait=true",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"content\": \"🧩 Nova task criada no Plane por {{$('Webhook').item.json.body.activity.actor.display_name}}\",\n \"thread_name\": \"WYZAR-{{$('Webhook').item.json.body.data.sequence_id}} · {{$('Webhook').item.json.body.data.name}}\",\n \"embeds\": [\n {\n \"title\": \"{{$('Webhook').item.json.body.data.name}}\",\n \"description\": \"{{$('Webhook').item.json.body.data.description_stripped || 'Sem descrição'}}\",\n \"fields\": [\n { \"name\": \"Status\", \"value\": \"{{$('Webhook').item.json.body.data.state.name}}\", \"inline\": true },\n { \"name\": \"Prioridade\", \"value\": \"{{$('Webhook').item.json.body.data.priority}}\", \"inline\": true },\n { \"name\": \"Início\", \"value\": \"{{$('Webhook').item.json.body.data.start_date || '—'}}\", \"inline\": true },\n { \"name\": \"Entrega\", \"value\": \"{{$('Webhook').item.json.body.data.target_date || '—'}}\", \"inline\": true },\n { \"name\": \"Responsáveis\", \"value\": \"{{( $('Webhook').item.json.body.data.assignees || [] ).map(a => a.display_name || ((a.first_name || '') + ' ' + (a.last_name || ''))).filter(Boolean).join(', ') || '—'}}\", \"inline\": false },\n { \"name\": \"Labels\", \"value\": \"{{( $('Webhook').item.json.body.data.labels || [] ).map(l => l.name).join(', ') || '—'}}\", \"inline\": false }\n ],\n \"timestamp\": \"{{$('Webhook').item.json.body.data.created_at}}\"\n }\n ],\n \"allowed_mentions\": { \"parse\": [] },\n \"username\": \"Plane\"\n}\n",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-480, 592],
"id": "899ac229-c0aa-4f2d-9d8c-7ee20b8ff7b0",
"name": "Create Thread",
"executeOnce": true,
"alwaysOutputData": false
},
{
"parameters": {
"method": "PATCH",
"url": "=https://discord.com/api/webhooks/<REDACTED_DISCORD_WEBHOOK>/messages/{{ $json.discord_first_message_id }}?thread_id={{ $json.discord_thread_id }}\n",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"content\": \"🧩 Task atualizada por {{ $('Webhook').item.json.body.activity.actor.display_name }}\",\n \"embeds\": [\n {\n \"title\": \"{{ $('Webhook').item.json.body.activity.new_value }}\",\n \"description\": \"{{ $('Webhook').item.json.body.data.description_stripped }}\",\n \"fields\": [\n { \"name\": \"Status\", \"value\": \"{{ $('Webhook').item.json.body.data.state.name }}\", \"inline\": true },\n { \"name\": \"Prioridade\", \"value\": \"{{ $('Webhook').item.json.body.data.priority }}\", \"inline\": true },\n { \"name\": \"Início\", \"value\": \"{{ $('Webhook').item.json.body.data.start_date }}\", \"inline\": true },\n { \"name\": \"Entrega\", \"value\": \"{{ $('Webhook').item.json.body.data.target_date }}\", \"inline\": true },\n { \"name\": \"Responsáveis\", \"value\": \"{{ ( ($('Webhook').item.json.body.data.assignees || []) .map(a => a.display_name || ((a.first_name || '') + ' ' + (a.last_name || ''))).filter(Boolean).join(', ') ) || '—' }}\", \"inline\": false},\n { \"name\": \"Labels\", \"value\": \"{{ ( ($('Webhook').item.json.body.data.labels || []).map(l => l.name).join(', ') ) || '—' }}\", \"inline\": false}\n ],\n \"timestamp\": \"{{ $('Webhook').item.json.body.data.updated_at }}\"\n }\n ],\n \"allowed_mentions\": { \"parse\": [] },\n \"username\": \"{{ $('Webhook').item.json.body.activity.actor.display_name }}\"\n}\n",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-480, 400],
"id": "85f6534f-d06b-419c-97b3-07840276b302",
"name": "Update Thread",
"executeOnce": true
},
{
"parameters": {
"method": "POST",
"url": "=https://discord.com/api/webhooks/<REDACTED_DISCORD_WEBHOOK>?thread_id={{ $json.discord_thread_id }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"content\": \"{{ (() => { \n const src = $('Webhook').item.json;\n if (!(src.body?.event === 'issue_comment' && src.body?.action === 'created')) {\n return '[evento não é comentário]';\n }\n const raw = src.body?.data?.comment_html || src.body?.activity?.new_value || '';\n const text = raw\n .replace(/<br\\s*\\/?>/gi, '\\\\n')\n .replace(/<\\/p>\\s*<p/gi, '\\\\n<p')\n .replace(/<[^>]*>/g, '')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .trim();\n return text || '[sem texto]';\n })() }}\",\n \"allowed_mentions\": { \"parse\": [] },\n \"username\": \"{{ $('Webhook').item.json.body?.activity?.actor?.display_name || 'Plane' }}\"\n}\n",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [-704, 304],
"id": "6099c337-348a-4ea3-92c6-05b0a3dd17cf",
"name": "Add Comment",
"executeOnce": true
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "18d37090-acf0-49b3-a658-a8bd39401c97",
"leftValue": "={{ $json.sequence_id }}",
"rightValue": "",
"operator": {
"type": "number",
"operation": "exists",
"singleValue": true
}
}
],
"combinator": "or"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-704, 496],
"id": "6d1991f2-1dfb-4e77-953e-014895b8ca86",
"name": "Exist in DB?",
"executeOnce": true,
"alwaysOutputData": false,
"onError": "continueRegularOutput"
},
{
"parameters": {
"table": {
"__rl": true,
"value": "issue_threads",
"mode": "list",
"cachedResultName": "issue_threads"
},
"dataMode": "defineBelow",
"valuesToSend": {
"values": [
{ "column": "issue_id", "value": "={{ $('Webhook').item.json.body.data.id }}" },
{ "column": "project_id", "value": "={{ $('Webhook').item.json.body.data.project }}" },
{ "column": "discord_thread_id", "value": "={{ $json.channel_id }}" },
{ "column": "discord_first_message_id", "value": "={{ $json.id }}" },
{ "column": "sequence_id", "value": "={{ $('Webhook').item.json.body.data.sequence_id }}" }
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-256, 592],
"id": "829d69e4-f13d-46f7-b588-fb91128f836e",
"name": "Insert rows in a table",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": {
"id": "<REDACTED_MYSQL_CRED_ID>",
"name": "<REDACTED_MYSQL_CRED_NAME>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "select",
"table": {
"__rl": true,
"value": "issue_threads",
"mode": "list",
"cachedResultName": "issue_threads"
},
"limit": 1,
"where": {
"values": [
{ "column": "issue_id", "value": "={{ $json.body.data.issue }}" }
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 304],
"id": "a1efd0b4-7ae4-4e3a-abee-599ad83fbcee",
"name": "Find Thread",
"executeOnce": true,
"alwaysOutputData": true,
"credentials": {
"mySql": {
"id": "<REDACTED_MYSQL_CRED_ID>",
"name": "<REDACTED_MYSQL_CRED_NAME>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "select",
"table": {
"__rl": true,
"value": "issue_threads",
"mode": "list",
"cachedResultName": "issue_threads"
},
"limit": 1,
"where": {
"values": [
{ "column": "sequence_id", "value": "={{ $json.body.data.sequence_id }}" }
]
},
"options": {}
},
"type": "n8n-nodes-base.mySql",
"typeVersion": 2.5,
"position": [-928, 496],
"id": "53496686-8f9f-4ca4-9672-2ef8dd4cf36c",
"name": "Verify Thread",
"executeOnce": true,
"alwaysOutputData": true,
"notesInFlow": false,
"retryOnFail": false,
"credentials": {
"mySql": {
"id": "<REDACTED_MYSQL_CRED_ID>",
"name": "<REDACTED_MYSQL_CRED_NAME>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "570753cd-d3f2-4749-805d-06b50d427483",
"leftValue": "={{ $json.body.event }}",
"rightValue": "issue_comment",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [-1152, 400],
"id": "2b3a908d-eae8-445e-98bd-a12f3ea6bd21",
"name": "is Comment?",
"executeOnce": true
}
],
"connections": {
"Webhook": { "main": [[{ "node": "is Comment?", "type": "main", "index": 0 }]] },
"Create Thread": { "main": [[{ "node": "Insert rows in a table", "type": "main", "index": 0 }]] },
"Add Comment": { "main": [[ ]] },
"Exist in DB?": { "main": [[ ], [{ "node": "Create Thread", "type": "main", "index": 0 }]] },
"Find Thread": { "main": [[{ "node": "Add Comment", "type": "main", "index": 0 }]] },
"Verify Thread": { "main": [[{ "node": "Exist in DB?", "type": "main", "index": 0 }], []] },
"is Comment?": {
"main": [
[{ "node": "Find Thread", "type": "main", "index": 0 }],
[{ "node": "Verify Thread", "type": "main", "index": 0 }]
]
}
],
"pinData": {},
"meta": { "instanceId": "<REDACTED_INSTANCE_ID>" }
}
Information
- n8n version: 1.114.4
- Database (default: SQLite): MySQL
- Running n8n via (Docker, npm, n8n cloud, desktop app): EasyPanel (Docker)
- Operating system: Linux


