Skip to content

Human-in-the-loop automation: build a human approval workflow

Build a human approval workflow for automation. See a real workflow screenshot and learn how to handle approval, rejection, expiry, retries, and execution.

Human approval request connected to an automated workflow

A support team can use automation to draft a reply to a customer. Before that reply goes out, someone should check that it answers the question and makes no promise the team cannot keep. Human-in-the-loop automation puts that review inside the workflow: software prepares the work, waits for a person, and continues only according to their answer.

The difficult part is the wait. The reviewer may be away, the worker may restart, or the draft may change before anyone answers. A useful design accounts for those events before connecting the workflow to a system that sends a message, publishes content, or changes access.

This guide covers the workflow design. For AI agent tool boundaries, read the human-in-the-loop AI agents guide. For implementation code, use the n8n human-in-the-loop tutorial or LangGraph interrupt tutorial.

What human-in-the-loop automation means

A human-in-the-loop workflow includes a point where a person's input affects the result. That input could be approval, a correction, a choice between options, or missing information. It can be part of a conventional rules-based workflow or an AI system.

For an approval workflow, the protected operation waits until the person authorizes it. Sending a notification after the operation has finished is a different kind of oversight.

Consider these illustrative uses:

WorkflowSoftware preparesPerson decidesSoftware continues with
Refund exceptionInvoice, amount, and reasonWhether to issue the proposed refundThe approved payment request
Content publishingDraft and destinationWhether the exact draft is readyPublishing that version
Access requestResource, scope, and durationWhether the proposed access is appropriateGranting the approved scope
DeploymentRelease identifier and checksWhether to release that versionThe deployment job

These are design examples, not customer results or evidence that approval alone makes a workflow safe.

Choose which requests need a person

Start with a decision rule that an operator can explain. For customer replies, that might be a draft containing a commitment about timing or money. For publishing, it might be the first public release of a document. The rule should identify a reason for review that the request can show to the person answering.

Avoid routing every routine step to the same reviewer. A queue full of low-value requests consumes the time needed for difficult ones. Equally, a model's confidence score alone does not tell you the impact of a mistake. A confident request can still target the wrong account.

Write down the allowed automatic path, the review path, and the conditions that require stopping work. Choose thresholds from your own operating policy. A dollar amount copied from an example says nothing about your customers or risk tolerance.

Write the request before building the workflow

The reviewer needs to understand what will change and why their answer is needed. "Approve task 8472?" makes them investigate. "Send the proposed reply for support ticket 8472?" gives them a decision, provided the exact draft and recipient are visible.

Use this worksheet to define one review step. It is a planning template, not an API payload:

plaintext
Operation to review:
Exact record, version, or destination:
Proposed change:
Reason this request needs a person:
Evidence the reviewer can inspect:
Who is allowed to answer:
Deadline and reason for it:
What rejection does:
What happens if nobody answers:
What changes would require a new review:
How execution success or failure will be recorded:

Include enough context to judge the operation without copying credentials or entire customer records into the request. If a person needs information that you cannot safely include, provide an appropriate authenticated path to inspect it.

Human approval workflow example: review a customer reply

Here is the complete decision path for a draft reply. The draft is fictional, and the screenshot is from an actual n8n test workflow. Its Approved reply (demo only) node is a no-op; it does not send an email.

Actual n8n workflow canvas showing a sample customer reply, ActionBox Request Approval, approved demo branch, and hold-for-revision branch
Test workflow: review a customer reply before any send step

Open the 2,800-pixel workflow screenshot at full size.

  1. Prepare the draft. Save the customer request ID, the exact draft text or version, and the recipient in the system that owns the workflow. The example starts with a sample draft entered in n8n.
  2. Ask for a decision. Show the reviewer what will be sent and why review is needed. The ActionBox request holds the decision; the workflow retains the draft and its identifier.
  3. Wait and branch. Continue to the protected send step only when the returned decision is an explicit, verified approval for that draft. Rejection, expiry, cancellation, and timeout all stop the send. In the screenshot, the approved path runs a harmless demo node; the other path holds the draft for revision.
  4. Check again before sending. If the recipient or draft has changed during the wait, create a new request. After a valid approval, use the email provider's idempotency or reconciliation controls so a retry cannot send the same reply twice.
  5. Record what happened. Approval means the message may be sent; it does not mean delivery succeeded. Record the send result separately, including failures.

The n8n human-in-the-loop walkthrough shows the node settings and the comparison with n8n's built-in review. For a safe importable starter, download the approval workflow template. Replace its demo operation only after you have tested both branches.

Separate waiting from deciding and executing

Your workflow needs to remember the proposed operation while the person considers it. The approval record and the execution record have different jobs: one records permission, and the other records what the software actually did.

StageWhat the workflow must retain
PreparedExact proposed operation and business request identifier
WaitingApproval identifier, reviewed version, and deadline
ApprovedVerified answer linked to the same proposal
Rejected or expiredReason to stop the protected operation
ExecutingDownstream request identity and execution state
Finished or failedActual result and any recovery work

Store this information in the system responsible for running the workflow. An approval service does not automatically preserve a worker's local variables or reconstruct a lost execution.

In ActionBox, the hosted service stores the human request and decision. Your integration owns the job and performs the approved operation. The integration architecture explains that boundary.

Decide what happens when nobody answers

A deadline should reflect how long the proposal remains useful. A deployment window can close. A customer can cancel their request. Leaving an approval open indefinitely may produce an answer to a question that no longer applies.

For an operation that requires explicit permission, reaching the deadline should stop execution. Assign responsibility for checking the unresolved business request separately. Expiration is not proof that someone handled the underlying problem.

ActionBox supports an expiration time on a request. Follow the expiration and timeout documentation when configuring it. Your workflow must still handle network failures and local timeouts without treating them as approval.

If a reviewer asks for a change, compare the revised proposal with what they originally saw. A different amount, destination, or document version may require a new decision. Do not apply permission for one operation to another.

Make retries safe on both sides of approval

Suppose the workflow creates a request but loses the HTTP response. Retrying should recover that logical request instead of asking a second person the same question. ActionBox supports idempotency for this purpose; keep the request identity and payload stable when retrying, and respect the documented retention window. Persist the returned Action ID so recovery can read the existing request. See idempotency and dedupe.

There is a separate retry problem after approval. An email provider might accept a send before your worker loses its connection. Retrying blindly can send the same reply twice even though the human approved only once. Use the downstream system's idempotency mechanism when available, or reconcile its result before retrying.

If you receive decisions through ActionBox callbacks, verify the signature and deduplicate deliveries. Delivery is at least once. A callback that arrives twice must not cause the protected operation to run twice. The callback documentation describes verification and the decision binding to check before continuing.

Choose an implementation that fits the existing workflow

Start with the system that already owns the work. A native review step may be enough when it reaches the right people and retains the decision where you need it.

If you're deciding whether each sensitive operation must wait for approval or a person can supervise bounded automation, the HITL versus HOTL comparison helps define that boundary before you choose a tool.

For example, n8n documents Gmail approval messages and human review for AI tool calls. LangGraph provides interrupts and checkpoint-based resume for graphs. These solve different parts of the problem.

An external approval service is useful when several workflows need a shared place for people to answer. ActionBox supplies that request and decision layer while your existing workflow continues to own execution. Use the n8n guide for an HTTP workflow, the LangGraph guide for graph interrupts, or the webhook integration guide for an application receiving callbacks.

Apply the pattern to operational exceptions

The same review boundary appears in several operational systems. The surrounding records and response choices change, but the integration still needs to preserve the proposal, wait for an authorized answer, reject stale decisions, and apply the result once.

Each guide includes an API example, failure cases, and a high-resolution mobile review example using fictional data.

Test the paths that happen after the demo

Before connecting a real side effect, test rejection, no response, a changed proposal, a worker restart, and duplicate delivery. Also test approval followed by a downstream failure. A green approval screen should not hide a failed operation.

Measure how many requests need clarification, how long they wait, and how often they expire. If people repeatedly ask for the same missing field, improve the request. If requests expire because nobody owns the queue, change the assignment process before shortening the timer.

Start with one operation and a reviewer who can explain the decision. Create a free Source, then follow the ActionBox quickstart to connect the request to your workflow.

If you would like help choosing the first review step or setting up a test, email info@actionbox.cloud with a short description of the workflow.

About the author

Suson Sapkota

Suson founded ActionBox and works in software and data engineering. He writes about approval workflows, background jobs, and how to verify what happened after a human decision.

Turn the next risky operation into a reviewable decision.

Create a free Source, run the example from this guide, and keep the decision and execution outcome connected.