N8N Sub Workflow HITL Issues (Called by AI Agent)

Describe the problem/error/question

In version 2.23.4 I had a main workflow that would use an AI Agent call a sub-workflow in which the sub workflow would call an AI Agent that is connected to a review step (slack) and tools (google calendar). The sub workflow would call a tool and send a user a confirmation message before executing an action. The user would confirm or deny action details and that would be a response given to sub workflow and the sub workflow would send it to the main workflow. However in version 2.33.4 and 2.34.5 the main workflow always fails when the sub workflow gets to the review step. The sub workflow always says no response despite it running correctly after the confirmation step.
I am curious why this was able to work in an older version of N8N but once it updated to new version it starts failing. I am hoping to get some insights on if it is a N8N limitation or a configuration issue on my end. I am also open to suggestions on how to my improve my workflow architecture. Any insight is appreciated.

What is the error message (if any)? Problem in node [Sub Workflow]

There was an error: “The workflow did not return a response”

Please share your workflow

Main Workflow:Slack Trigger -> AI Agent { Calls Sub workflow } -> Slack Response

Sub Workflow: Triggered by other workflow -> AI Agent {Calls Slack Review Step-> If confirmed continue to execute tools (google calendar) If declined output: Action was canceled.} -> Set Field (response: AI output)

Share the output returned by the last node

In the main workflow no output is given. It halts the main workflow and errors and says no output is given. It stops prematurely before the sub workflow is done running.

Information on your n8n setup

  • n8n version: 2.33.4 and 2.34.5
  • Database (default: SQLite):
  • n8n EXECUTIONS_PROCESS setting (default: own, main): default
  • Running n8n via (Docker, npm, n8n cloud, desktop app): Docker
  • Operating system: Ubuntu 26.04 LTS

@Ethan0034

This sounds like a regression. Maybe file a bug report?

@kjooleng @Ethan0034 This is a bug on github and it was fixed so I think it’s a relapse

and

Hi @Ethan0034 Welcome!
The sub-execution goes into a waiting state at the Slack review node, and the parent’s tool call resolves right there instead of at the end of the sub-workflow, which is what produces the empty response. Since 2.6 the review can sit on the tool connection in the main workflow instead, so nothing inside the sub-workflow ever waits.
On the connection from the AI Agent to the tool you want confirmed, click the + icon and choose “Add human review step”, then pick Slack and set the approver and message. Put this in the message so the user sees the action details before approving:

The AI wants to use {{ $tool.name }} with:
{{ JSON.stringify($tool.parameters, null, 2) }}

Then take the sendAndWait node out of the sub-workflow. Approve runs the tool with the AI’s parameters, Deny cancels it and reports the rejection back to the agent. List the gated tools and what a denial means in your system prompt so the agent handles a rejection cleanly.

@Ethan0034
It is recommended to use the stable version 2.31.4

I’d +1 this architecture.

The small thing I’d add is to make the step before review return a plain review payload instead of letting the sub-workflow feel like a mini conversation on its own.

Something like:

```

status: needs_review

tool_name: create_calendar_event

summary: plain language summary for Slack

proposed_payload: the exact data that will be sent

on_approve: run calendar action

on_deny: stop and return a clean denial message

```

That gives the human reviewer something concrete to approve, and it gives the parent workflow a clean object to log/debug. In my experience, HITL flows get fragile fast when the approval step, action execution, and final agent response are all hidden inside the same nested tool call.

New version n8n@2.39.0 got released which includes the GitHub PR 37087.

New version n8n@2.39.8 got released which includes the GitHub PR 38949.