Buggy unused Respond to Webhook node validation

Describe the problem/error/question

Hello, I have the following workflow, where the webhook responds immediately, and then I have a wait node. After a request to this node is sent, I first do some other things (in this minimal example i make a GET to example.com) and then respond success to the wait node. Obviously, my webhook is configured to respond immediately, and my wait node is configured to respond using a respond to webhook node. For some reason, n8n wrongfully tells me that the a respond to webhook node is unused (BTW, an ID or any sort of information would be nice but I cant find it). The workflow proceeds normally if i remove all the respond to webhook nodes, which I dont want to do. Is this an issue with n8n or is there something wrong with the workflow?

What is the error message (if any)?

I see an error message immediately on the webhook node: Unused Respond to Webhook node found in the workflow.

Please share your workflow

Share the output returned by the last node

No crash

Information on your n8n setup

  • n8n version: 2.23.1
  • Database (default: SQLite): Probalby default, i didnt configure anything
  • n8n EXECUTIONS_PROCESS setting (default: own, main):
  • Running n8n via (Docker, npm, n8n cloud, desktop app): Docker
  • Operating system: LInus (or WSL to be specific)

Hi @JammasterCap Welcome !

Your issue is not caused by the Wait node but by the Webhook response configuration.

a Respond to Webhook node is only valid when the Webhook trigger is set to “Respond using Respond to Webhook node.” In your workflow, the Webhook is not configured that way (it uses immediate/default response), so n8n correctly flags the Respond to Webhook node as unused even if you intended it for the Wait resume path.

Fix: either set the Webhook node response mode to “Using Respond to Webhook node” or remove the Respond to Webhook node (since Wait-resumed executions cannot respond to the original webhook request anyway).

Let me know if this helps 1

Thank you for the quick answer. I am aware that my webhook is configured to respond immediately. The respond to webhook node belongs to the wait node. Wait nodes can also be configured to respond using a respond to webhook node, and that is what I have done in my workflow.

Welcome to the n8n community @JammasterCap
I need your complete workflow to confirm, I created the minimal scenario to test and wasn’t able to confirm a bug.

Welcome @JammasterCap!

I totally get what you’re trying to do here, using the Respond to Webhook as a “callback” for the Wait resume rather than for the initial webhook, and the warning makes it feel like n8n doesn’t understand that pattern even though the flow itself works

In your current flow Webhook → Request2 → Wait → Request → Respond success, the Respond to Webhook node (“Respond success”) is logically in the wrong place for how n8n expects this pattern to work. According to the docs, a Respond to Webhook node is only considered valid when it belongs to a Webhook trigger that is explicitly set to “Respond using ‘Respond to Webhook’ Node”, and the Respond to Webhook has to live in the execution path that starts from that Webhook trigger.

In your workflow the Webhook trigger does not declare responseMode: responseNode (it responds immediately), so it does not “own” the Respond success node. Instead, the Wait node is configured with responseMode: responseNode, which means it wants to use a Respond to Webhook node to answer the resume webhook call (the one hitting $execution.resumeUrl), not the original Webhook trigger request.

So effectively this workflow is trying to use a single Respond to Webhook node for two different HTTP connections: one for the initial /webhook/bug_minimal call, and one for the Wait resume call, but those are two separate requests and cannot share the same Respond to Webhook in the way the validator expects. From n8n’s perspective there is no Webhook trigger configured with “Using ‘Respond to Webhook’ Node” that matches your Respond success node, so the “Unused Respond to Webhook node” warning is not a bug – it’s correctly telling you that no Webhook trigger actually owns that Respond to Webhook.

Instead of using a separate Respond to Webhook node at the very end, let the Wait node handle the HTTP response directly when it gets called.
Open your Wait node,
Change the Response Mode from Using Respond to Webhook Node to On Received Response Text (or Json).
Type your success response payload directly into the Wait node (e.g., {“status”: “success”}).
Delete the Respond success node from your canvas.
This keeps your logic exactly the same, but validation will pass perfectly because the response is contained entirely inside the Wait node.
This should fix it, I think, if there are further questions, I will be happy to help.

I’m sorry, I understand your responses and I’m aware that this is not the way it works and not what the docs say, but to me its very logical that this is an issue and not just something that has to be accepted the way it is.

According to the docs, a Respond to Webhook node is only considered valid when it belongs to a Webhook trigger that is explicitly set to “Respond using ‘Respond to Webhook’ Node”

If this statement was true, there is no reason for a wait node to have an option to respond using RWH, because it immediately violates the rule in your statement. This means either the docs and RWH validation are wrong, or the wait node option RWH is wrong.

Change the Response Mode from Using Respond to Webhook Node to On Received Response Text (or Json).
Type your success response payload directly into the Wait node (e.g., {“status”: “success”}).
Delete the Respond success node from your canvas.
This keeps your logic exactly the same, but validation will pass perfectly because the response is contained entirely inside the Wait node.

This solution will not keep the logic the same. In my actual workflow, I send the body received in the Wait node using REST to a validator, i perform If statements, I may even save things in a database. I want to respond 200 only when all of those things successfully completed. If i change my wait node to always respond 200, the workflow will always give me a success, even if for example the validation fails.

This is why I think the way I described it is the intended way:

  • Both the webhook node and and wait node have the option to answer using a respond to webhook node (i will call it RWH from now on because its a mouthful). Logically, there is not much difference between them except for the fact that a webhook must be used to start a workflow.
  • At any point, there is only one wait/webhook active, waiting for a request, meaning there is no logical ambiguity to which wait/webhook node a RWH responds.
  • Its an absolutely necessary feature to be able to receive a request in a workflow, do some actions and then respond positively/negatively based on the outcome of those actions

In my opinion, n8n should perform a proper graph analysis to find orphaned RWHs.

Moreover, if I trick the validation into letting my workflow run by changing the Webhook to respond using an unnecessary RWH (unnecessary because it might as well have been an immediate response) that returns 200, the workflow behaves exactly as i described. Below you can see a modified version of the workflow, in which i first start it normally, and then send a JSON body to the wait node with a single boolean property- stuff. When stuff is true, a GET request is made and then i respond using the status code that i received from the GET request (see the code of the RWH node). If stuff is false, the request triggering my Wait node will receive 400 as a response

This trick is probably what I will use from now on (I didnt know about it when writing the post), but the fact remains, there is a clear issue here.

@JammasterCap By adding a dummy Webhook → RWH and setting it to ‘respond immediately’ to bypass the validator, you have confirmed it is a validator bug and not a usage error. The validator is simply checking ownership and is asking, ‘does this RWH belong to a Webhook with responseMode: responseNode?’, instead of doing a proper graph traversal which would allow the validator to identify Wait nodes with the same configuration. If you have not already, you can file one on GitHub: Issues · n8n-io/n8n · GitHub