How to Build n8n Approval Workflow Automation That Auto-Approves and Escalates
Build n8n approval workflow automation that auto-approves low-risk requests, escalates the rest to Slack, and logs every decision. See the rule-engine pattern.
A finance lead approves the same refunds every morning. Under $100, customer in good standing, clear reason. Approved, approved, approved. The decision was never hard. It just never got automated, so it eats the first hour of every day.
That's the exact job n8n approval workflow automation is built for. Not replacing judgment on the requests that actually need it, but clearing the ones that don't so a person only sees the edge cases. The pattern is old; the trick is wiring auto-approve and escalation into the same flow with a clean audit trail behind both.
Most guides stop at the human-in-the-loop gate. They show you the Wait node and call it done. The harder, more useful half is the rule engine in front of the gate, the part that decides whether a human ever needs to look.
What you can automate
A request comes in, gets scored, and either clears itself or lands in front of the right person. Common jobs that fit:
- Refund and discount approvals: clear small amounts, escalate anything over a dollar threshold
- Purchase orders and expense reports: auto-approve within budget, route overages to a manager
- Time-off and overtime requests: green-light standard requests, flag ones that breach coverage rules
- Vendor and supplier changes: auto-approve known vendors, escalate new ones for review
- Content or campaign sign-offs: pass routine posts, hold anything touching legal or pricing
- New-customer credit terms: approve low-risk tiers, send high-risk applications to a human
Each one shares the same shape. A rule decides the easy cases; a person decides the rest; everything gets logged.
The approval pipeline
Webhook (request) → Code (score + classify) → IF (under threshold?)
├── yes → Set decision = approved → Sheets log → respond
└── no → Slack escalation (approve/reject) → Wait (resume webhook)
→ Set decision → Sheets log → respond
The split happens at the n8n-nodes-base.if v2 node. Everything before it is mechanical: collect context, compute a risk score, classify the request. Everything after the human branch is mechanical too. The person only touches the one decision in the middle.
1. Collect the request
A n8n-nodes-base.webhook node receives the request payload — amount, type, customer tier, requester. If the source is a form or another system, normalize the fields here so the scoring step reads a predictable shape. Inconsistent field names are the quiet killer of rule engines; a customerTier that's sometimes tier breaks the comparison silently.
2. Score and classify
A n8n-nodes-base.code v2 node with jsCode computes a risk score. Plain arithmetic, no AI needed for most cases:
const r = $input.first().json;
let score = 0;
if (r.amount > 1000) score += 40;
if (r.amount > 5000) score += 30;
if (r.customerTier === 'new') score += 25;
if (r.type === 'refund') score += 10;
return [{ json: { ...r, riskScore: score } }];
Keep the math readable. The person who tunes this in six months shouldn't need to reverse-engineer a nested ternary.
3. Route on the threshold
The n8n-nodes-base.if v2 node compares riskScore against your ceiling. Pull the ceiling from a Config node rather than hardcoding it, so the number lives in one place:
Condition: {{ $json.riskScore }} < {{ $('Config').first().json.autoApproveThreshold }}
True branch clears the request. False branch escalates. That's the whole decision engine — one comparison, fed by a score you control.
4. Escalate the rest
On the false branch, a Slack message goes to the approver with the full request context and approve/reject buttons. The n8n-nodes-base.wait node then pauses the execution on a resume webhook until someone clicks. This is the part the other guides cover well. It's also the part you'll use least, if the rule engine is doing its job.
5. Log everything
Both branches converge on a Google Sheets append. Every decision gets a row: request ID, amount, score, the branch it took, who approved it (or "auto"), and a timestamp. Logging the auto-approved path matters as much as the escalated one. An auditor asking "who approved this $80 refund?" needs an answer, even when the answer is "the rule did, at this score, on this date."
A common mistake is logging only the requests that hit a human. Then a quarter later, nobody can explain the 4,000 auto-approved decisions. Append a Sheets row on the approved branch too. The audit trail is only worth something if it's complete.
Why the rule engine matters more than the gate
Here's an opinionated take: the Wait node is the easy 20% of approval automation, and most tutorials spend 80% of their words on it. The part that actually saves time is the scoring logic in front of it. A gate with no rule engine just relocates the bottleneck — now a human approves everything through Slack instead of email. Faster, sure. But you haven't removed the work, you've reskinned it.
The payoff is in the threshold. Tune it so 80% of requests clear themselves and a person only sees the 20% that genuinely need a brain. That ratio is where the hours come back.
Implementation patterns
Pattern 1: Threshold split with a Config node
Put every tunable number in an n8n-nodes-base.set v3.4 Config node at the top of the workflow — auto-approve ceiling, escalation channel, the customer tiers that always escalate. Reference them downstream:
{{ $('Config').first().json.autoApproveThreshold }}
Ops changes the policy by editing one field. No branching logic gets touched, which means no broken workflow at 5pm on a Friday.
Pattern 2: Timeout fallback on the Wait node
A human gate that waits forever is a liability. If a refund sits unapproved for 24 hours because the approver's on leave, the customer's still waiting. Set a timeout on the Wait node and decide the default: auto-reject and notify, or escalate to a backup approver. Make the choice explicit. Silence isn't a decision.
Pattern 3: Quorum for high-stakes requests
For requests above a second, higher threshold, require two approvals instead of one. A second IF node checks the score; above the high mark, the flow fans out two Slack messages and waits for both resume webhooks before clearing. Most teams don't need this. The ones moving real money do.
n8n nodes you'll use most
| Node | Purpose |
|---|---|
n8n-nodes-base.webhook | Receive the incoming request payload |
n8n-nodes-base.set v3.4 | Config node holding thresholds and policy |
n8n-nodes-base.code v2 | Score and classify the request with jsCode |
n8n-nodes-base.if v2 | Split auto-approve from escalate on the threshold |
n8n-nodes-base.slack | Send the escalation with approve/reject buttons |
n8n-nodes-base.wait | Pause for the human decision via resume webhook |
n8n-nodes-base.googleSheets | Append the audit-trail row on every branch |
Getting started
- Map your decisions. Write down the five requests you re-approve most and the rule each one actually follows.
- Build the Config node first. List your thresholds and channels as fields.
- Add the Webhook trigger and normalize the incoming fields.
- Write the scoring Code node. Start simple: amount and customer tier cover most cases.
- Add the IF node and wire the two branches.
- On the escalate branch, add Slack plus the Wait node with a timeout.
- Converge both branches on a Google Sheets append, then return a response.
If you'd rather not build the scoring and audit logic from scratch, the Routine Decision Rule Engine ships the whole pattern ready to configure.
Browse the automation templates →The Routine Decision Rule Engine & Approval Bot ships this end-to-end — the Webhook trigger, a Config node for your thresholds, the IF-node split that auto-approves within budget, Slack escalation for the rest, and a Google Sheets append on every decision for the audit trail. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to the whole catalog (plus every template added later) if you run more than one of these automations.
Approvals are one slice of a bigger pattern: codifying the small decisions you make on repeat. The same scoring-and-route shape drives the structured analysis in n8n decision support automation, and it pairs naturally with the intake side covered in n8n Google Forms automation. Build the rule engine once, and the requests that used to eat your morning clear themselves before you're at your desk. The ones that need you still find you. That's the whole point.
See the Data Entry Automation Hub →Common questions
How do I auto-approve low-risk requests in n8n without a human?
Does n8n have a native approval node?
How do I keep an audit trail of every approval decision?
Can I change approval thresholds without editing the workflow logic?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
Get 3 tested n8n templates, free
The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Built through the same live-instance release process as everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.
- 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
- 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
- 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14
More automation guides

How to Build n8n Decision Support Automation with AI Frameworks
A founder spends a week circling a pricing decision. Not because the information's missing. It's all there. The hold-up is that there's no process to run it through. The pros and cons live in three ha…

How to Build n8n Employee Wellness Automation with AI Risk Scoring
Two people resign in the same month, both citing burnout. Nothing in the 1:1 notes flagged it. Nothing in their Slack activity looked off. The signals were there, in the throwaway comments, the slippi…

n8n Shift Scheduling Automation: Fill a Gap Without the Phone Tree
A nurse calls in sick at 5am. The scheduler spends the next two hours texting people one at a time, hoping someone sees it before the shift starts, and missing labour-rule checks under the pressure. T…