Skip to content

How do I let a client approve an n8n AI agent's action without giving them n8n access?

Answer: Send the approval to the client, not to yourself. Pause before the step that sends, pays or changes something, send the client a preview with a one-time link, continue only on an explicit approve, and treat silence as a no. n8n's Wait node resumes from a link that is unique to each execution, so the client needs the link, not an n8n account.

What n8n does natively

The AI Agent node has a Human review step for tool calls. The reviewer sees which tool the agent wants to use and with which parameters, and the tool only runs on approval. Channels include Gmail, Microsoft Outlook, Slack, Microsoft Teams, Telegram and Chat [1]. Outside the agent, send-and-wait operations in nodes such as Slack and Gmail pause a workflow until someone responds [2][3], and the Wait node can resume on a webhook call or a form submission [4].

That covers one approver. With clients you usually also need the right approver per client across many workflows, a preview a non-technical person understands, an expiry, and a record you can show later.

Step by step

  1. One approval sub-workflow. Every risky step calls it with Execute Sub-workflow [5], passing the client ID, the action type and the exact payload.
  2. Look up the approver per client (email address, name, your agency's branding) in a table.
  3. Send a preview with approve and reject options: a Wait node set to On Webhook Call with $execution.resumeUrl in the email, or On Form Submitted so the client confirms on a page [4].
  4. Protect the link. The resume URL is unique to each execution, the webhook can require Basic, Header or JWT authentication, and Ignore Bots keeps link previewers and crawlers from triggering it [4].
  5. Set an expiry. With Limit Wait Time, the workflow resumes by itself when time runs out [4]. Check that an explicit approval arrived, and treat anything else as a rejection.
  6. Bind the approval to the payload. Store a hash of what was approved and compare it right before the action runs. If anything changed, ask again.
  7. Record the decision (who, what, when, payload hash) in a table the workflow can insert into but not update. n8n's execution data is pruned: on self-hosted instances after 336 hours by default [6].

What the client should see

Recipient, amount, the exact text or change, which workflow asked, and when the request expires. No node names, no JSON, no jargon.

FAQ

Does the client need an n8n account?

Not for a Wait-node link or form. They need the link. By contrast, Zapier's Request Approval action requires reviewers to have a Zapier account [7].

What if the client doesn't answer?

Decide it up front. An expiry that ends in "rejected" is safer than a workflow that waits forever or carries on by default.

Can anyone who gets the link approve?

With authentication set to None, yes. If that matters, require webhook authentication [4], and keep links short-lived.

Can I use n8n's built-in Human review for this?

Yes, if the client is reachable on one of its channels, such as Gmail or Outlook [1]. Per-client routing, the expiry and the record in steps 2, 5 and 7 still apply.

Sources

  1. n8n, Human-in-the-loop for tools: https://docs.n8n.io/build/integrate-ai/ai-examples/human-in-the-loop-for-tools
  2. n8n, Slack node: https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack
  3. n8n, Gmail message operations: https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/message-operations
  4. n8n, Wait node: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/
  5. n8n, Execute Sub-workflow node: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflow/
  6. n8n, Executions environment variables: https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/executions
  7. Zapier, Request approval: https://help.zapier.com/hc/en-us/articles/38731463206029-Request-approval-to-keep-your-workflow-running-with-Human-in-the-Loop

Disclosure: this page is written by the team building Keelstamp, a tool for client approvals. It isn't released yet, and everything above works without it.

Client approval for n8n AI agents, without n8n access · Keelstamp