n8n PTO Request Automation: Approvals That Check the Balance
Build n8n PTO request automation that checks the leave balance, routes multi-approver sign-off, logs an audit trail, and handles a manager who's out.
Someone requests three days off. The request lands in a manager's inbox, sits behind forty other emails, and gets approved on a phone screen without anyone checking whether the person has the days left or whether two teammates already booked the same week. That's how a "Tuesday's fine" turns into a coverage gap nobody planned for.
n8n PTO request automation fixes the part that gets skipped: the checking. Not the notification, not the calendar block. The boring middle where a balance gets verified, an overlap gets caught, and a decision gets recorded somewhere an auditor can find it later.
Most tutorials stop at "form fires a Slack message with approve and reject buttons." That's the easy 20%. This guide builds the rest. It runs the same on self-hosted n8n or n8n Cloud.
What a PTO workflow should actually check
A request form plus an approve button is a glorified email. The work that makes the automation worth running happens before the manager ever sees the request:
- Read the requester's remaining leave balance and subtract the requested days
- Catch overlaps with teammates already booked for the same dates
- Route to the correct manager, with a backup if the primary is out
- Post a Slack message with approve and reject buttons and a denial-reason field
- Block the dates on a shared calendar once approved
- Write every request and decision to an audit log
The first version most people build does the form and the Slack message. The other four lines are where the workflow earns trust, and they're cheap to add once the trigger's wired.
Why "approve and reject buttons" isn't enough
Here's the opinionated take. A PTO workflow that routes a request to Slack without checking the balance first has automated the wrong half. The interactive Slack approval template that ranks for this query is a fine starting point, but it's a generic submit-and-decide shell with no quota logic, no overlap check, and no audit trail. It moves the decision faster without making it better.
The expensive mistakes in leave management aren't slow approvals. They're approved requests that shouldn't have been: someone goes negative on their balance, or three people on a four-person team take the same Friday. A human eyeballing a Slack card at 9pm won't catch either. A Code node will, every time, in the same 200 milliseconds. So push the checking upstream of the human, and let the manager decide on a request that's already known to be in-policy.
The PTO pipeline
PTO request form (Typeform / Tally / Google Form)
│
▼
Read balance + team calendar (Google Sheets / HTTP)
│
▼
Validate: enough days? any overlap? ──► reject early if not
│
▼
Route to manager (backup if OOO) — Slack approve/reject
│
▼
On approve: block calendar + decrement balance + notify
│
▼
Log request + decision (Google Sheets audit trail)
1. Capture the request
A form is the cleanest trigger. Typeform or Tally posts to a Webhook node; a Google Form writes a row a Schedule trigger polls. Capture the employee, the dates, the type (vacation, sick, personal), and a half-day flag. Validate the date range here: a Code node that rejects an end date before the start date saves you a confused manager later.
2. Read the balance and the calendar
Before anything routes, a Google Sheets node (or an HTTP Request node against your HRIS) reads two things: the requester's remaining balance and the dates already booked by their team. A Code node computes the requested working days, subtracts them, and counts overlapping bookings. This is the step every ranking page leaves out.
3. Validate and branch early
An If node now has real data to work with. If the balance can't cover the request, the workflow rejects it with a clear message ("This would put you 2 days over your balance") before a manager wastes a thought on it. If teammates already cover the same dates, flag it for the manager rather than hiding it. Clean requests pass through.
A common bug: subtracting the requested days the moment the form fires. Then a rejected or cancelled request leaves the balance wrong, and nobody notices until year-end. Read the balance to validate, but only write the new number back inside the approval branch, after the manager says yes. Treat the balance like a bank transaction, not a hold.
4. Route to a manager (with a backup)
Look up the requester's manager from the same sheet, plus a backup approver. The Slack node posts an interactive message with approve and reject buttons and a short reason field on reject. A Wait node holds the workflow for the response. If nothing comes back inside 48 hours, an If node reroutes to the backup and notes it. The lowcode.agency PTO guide gets this right with its out-of-office fallback; the n8n templates that rank usually don't.
5. Act and log
On approve: a Google Calendar node blocks the dates, a Google Sheets node decrements the balance and writes the decision, and a Slack or Gmail node tells the requester. On reject: log the reason, notify the requester, leave the balance untouched. Either way, the audit row gets written. Who asked, what dates, who decided, when, and why.
Implementation patterns worth stealing
Pattern 1 — the early-reject gate. Run the balance and overlap checks before routing, and reject out-of-policy requests automatically. Managers only ever see decisions worth making.
Validate node → If (balance OK AND no hard overlap)
true → route to manager
false → auto-reject with reason → log
Pattern 2 — half-day handling. PTO isn't always whole days. Capture an AM/PM flag and map it in a Code node (9am–1pm versus 1pm–5pm) so the calendar block and the balance math both use 0.5, not 1. Skip this and your balances drift by a day every few requests.
Pattern 3 — the reroute clock. A Wait node plus a timeout If node turns a silent stall into an automatic handoff. Manager's on leave themselves? The backup gets it, and the log shows the handoff happened.
n8n nodes you'll use most
| Node | Purpose |
|---|---|
| Webhook / Google Form trigger | Capture the PTO request |
| Google Sheets | Read and write balance, audit log |
| Code | Compute working days, detect overlaps, half-day math |
| If | Early-reject gate and the reroute timeout |
| Slack | Approve and reject buttons, denial reason |
| Wait | Hold for the manager's response |
| Google Calendar | Block approved dates |
Getting started
- List your employees with their manager, backup approver, and starting balance in one Google Sheet
- Build the form (Typeform, Tally, or Google Form) and wire its trigger
- Add the Google Sheets read for balance and existing bookings
- Write the Code node for working-day math and overlap detection
- Add the If gate and the Slack approval message with a reject reason
- Wire the approve branch: calendar block, balance write-back, notification
- Add the audit-log row on every path, then test the five cases (in-policy, over-balance, overlap, reject, manager-OOO)
For broader context on routing decisions through Slack, the n8n Slack automation guide covers the interactive-message pattern, and n8n employee onboarding shows the same form-triggered HR shape from the hiring side. You can wire the whole thing by hand from the catalog's HR templates, like the Shift Fill & Compliance Engine.
Browse the n8n HR template catalog →The Shift Fill & Compliance Engine ships the coverage-and-compliance half of this end-to-end: it routes coverage requests, logs every compliance record to Google Sheets, and notifies the right people over Slack and SMS, which is the audit-trail backbone a PTO workflow needs. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to the whole catalog plus every template added later, worth it if you run more than one of these HR automations.
A PTO workflow that checks before it routes pays for itself the first time it catches a negative balance nobody else would've noticed. Start with the balance read and the audit log; everything else is decoration on top of those two. For the next HR job in the sequence, see n8n employee offboarding, and to wire the request form once and reuse it, the Shift Fill & Compliance Engine is the closest starting point in the catalog.
See all HR automation templates →Common questions
Can n8n approve PTO requests automatically?
How do you check a leave balance inside an n8n workflow?
What happens if the approving manager is out of office?
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

n8n Scheduled Cleanup Jobs That Delete Safely, Not Just Fast
The Cleanup Job That Deletes the Wrong Thing Has No Undo The point of n8n scheduled cleanup jobs is to keep data stores lean without ever deleting something you needed. That second clause is where it…

n8n API Health Check Monitoring Beyond the 200 OK
A 200 OK Can Be the Quietest Outage You'll Ever Have The point of n8n API health check monitoring is to catch the failure a status code hides. A endpoint that returns with a body of is an outage your…

n8n Incident Status Page Updates That Read Like a Human Wrote Them
A Red Dot Tells Nobody What's Happening The point of n8n incident status page updates is to tell people three things during an outage: that you know, that you're working on it, and roughly when it'll…