Free PTO request form template (printable + spreadsheet log)
Time-off requests get lost in texts and hallway chats. A one-page form plus a log fixes that: everyone asks the same way and there's a record. Below: a copy-paste and printable PTO request form, an approval workflow for a small business, and a Google Sheets / Excel log that counts business days, flags overlaps and checks balances.
What a PTO request form should include
- Employee, department and approver.
- Date submitted, to check notice and settle who asked first.
- Type of leave, using the same types as your policy.
- First and last day off, half days (morning or afternoon), total workdays and date back. The return date catches weekend and holiday mistakes.
- Coverage: who handles the work.
- Employee signature and date.
- Manager section: decision, reason or changes, balance before and after, approver, decision date, and "entered in log".
Leave out medical details; dates are enough.
The PTO request form (copy and paste)
Paste this into a document or email template and replace [Company name] and the notice period. You can also download it as a plain text file or open the printable version (print it or save it as a PDF).
PTO / TIME-OFF REQUEST FORM
[Company name]
Submit at least [__] business days before the first day off (see the time-off policy).
EMPLOYEE
--------
Employee name: _____________________________________________________
Job title / department: ____________________________________________
Manager / approver: ________________________________________________
Date submitted: ____________________________________________________
TIME OFF REQUESTED
------------------
Type (circle one): Vacation Sick Personal Unpaid Other: ________
First day off: _____________________________________________________
Last day off: ______________________________________________________
Half day? No Yes, morning off Yes, afternoon off Date: ________
Total workdays requested: __________________________________________
Date back at work: _________________________________________________
COVERAGE
--------
Who covers my work while I'm out: __________________________________
Handover notes / where to find things: _____________________________
____________________________________________________________________
EMPLOYEE SIGNATURE
------------------
Signature: _________________________________________________________
Date: ______________________________________________________________
MANAGER USE ONLY
----------------
Decision (circle one): Approved Approved with changes Denied
Changes or reason for denial: ______________________________________
____________________________________________________________________
PTO balance before this request (days): ____________________________
Balance after this request (days): _________________________________
Approved by: _______________________________________________________
Signature: _________________________________________________________
Decision date: _____________________________________________________
Entered in time-off log (initials / date): _________________________
Keep the signed form with the employee's time-off records. Do not write medical details on this form.
A simple approval workflow
- The employee sends the form to one named approver.
- The approver logs it as Pending the same day.
- The approver checks the log for overlaps, the balance after the request, and notice.
- Decide within a set time, and record the decision and date on the form and in the log.
- Confirm to the employee in writing, even a one-line email.
- Mark changes as Cancelled or add a new row; don't delete.
Decide these in your written policy (the PTO policy template has fill-in wording):
- Who approves: usually the owner or direct manager. Name a backup, and send the approver's own requests to someone else.
- Notice period: your choice, often longer for longer absences, such as [X] business days for a day or two and [Y] for a week. Say how sick days and emergencies are reported instead.
- Conflicts: first come, first served, rotation for popular dates, or another rule, and how many people per role can be out at once.
- Blackout periods and coverage: any busy seasons, and who arranges cover.
Build the request log in a spreadsheet
Formulas use commas between arguments (US English default). If your spreadsheet uses semicolons as the list separator (common in Europe), swap them. Every formula on this page was checked in a test workbook; the example numbers below are the results it produced.
Three sheets: Settings, Requests (one row per request) and Balances (one row per employee).
Settings
B1 is the year start (2026-01-01), B2 the year end, B3 your minimum notice in business days (10 in the example) and D2:D20 your company holidays. B2:
=EDATE(B1,12)-1
Name D2:D20 Holidays: in Excel, type the name in the Name Box left of the formula bar; in Google Sheets, use Data > Named ranges.
Requests sheet columns
| A | B | C | D | E | F | G | H | I | J | K | L | M |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Request date | Employee | Type | Start | End | Half day | Days | Status | Approver | Decision date | Conflicts | Notice | Balance after |
You type A to F and H to J. G and K to M are formulas in row 2, copied down.
G2, days requested. NETWORKDAYS counts Monday to Friday between the two dates, including both, and skips holidays; Half day = Yes takes off half a day:
=IF(OR(D2="",E2=""),"",NETWORKDAYS(D2,E2,Holidays)-IF(F2="Yes",0.5,0))
K2, conflicts: how many other employees have approved time off overlapping these dates (each range starts on or before the other ends):
=IF(D2="","",COUNTIFS($B:$B,"<>"&B2,$D:$D,"<="&E2,$E:$E,">="&D2,$H:$H,"Approved"))
To include others' pending requests:
=IF(D2="","",COUNTIFS($B:$B,"<>"&B2,$D:$D,"<="&E2,$E:$E,">="&D2,$H:$H,"Approved")+COUNTIFS($B:$B,"<>"&B2,$D:$D,"<="&E2,$E:$E,">="&D2,$H:$H,"Pending"))
L2, notice given, in business days from the request date to the first day off:
=IF(OR(A2="",D2=""),"",NETWORKDAYS(A2,D2,Holidays)-1)
M2, the balance after this request, looked up from the Balances sheet (column 5 is "Left now"). Approved requests are already counted there, so only a request that isn't approved yet is subtracted. Unpaid, denied and cancelled rows stay blank:
=IF(OR(B2="",G2="",C2="Unpaid",H2="Denied",H2="Cancelled"),"",IFERROR(VLOOKUP(B2,Balances!$A:$F,5,FALSE)-IF(H2="Approved",0,G2),"Check name"))
It subtracts this request only; the Balances sheet shows the effect of all pending ones.
Status dropdown and other data validation
Select H2:H500. In Excel, open Data > Data Validation, set Allow to List and type the source Pending,Approved,Denied,Cancelled. In Google Sheets, use Data > Data validation > Add rule, choose Dropdown and add the four options. Do the same for Type (Vacation,Sick,Personal,Unpaid), Half day (Yes,No) and Employee, with the source =Balances!$A$2:$A$51 (in Sheets, "Dropdown (from a range)").
Balances sheet
Headers in A1:G1: Employee, PTO days for the year, Approved, Pending, Left now, Left if pending approved, Pending requests. Type names and each person's days for the year (allowance plus carryover) in A and B.
C2, approved days this year, excluding unpaid time:
=SUMIFS(Requests!$G:$G,Requests!$B:$B,A2,Requests!$H:$H,"Approved",Requests!$C:$C,"<>Unpaid",Requests!$D:$D,">="&Settings!$B$1,Requests!$D:$D,"<="&Settings!$B$2)
D2, pending days, the same with "Pending":
=SUMIFS(Requests!$G:$G,Requests!$B:$B,A2,Requests!$H:$H,"Pending",Requests!$C:$C,"<>Unpaid",Requests!$D:$D,">="&Settings!$B$1,Requests!$D:$D,"<="&Settings!$B$2)
E2, left now, and F2, left if everything pending were approved:
=B2-C2
=E2-D2
G2, pending requests for this person:
=COUNTIFS(Requests!$B:$B,A2,Requests!$H:$H,"Pending")
J1 counts all pending requests; J2 shows the oldest one still waiting:
=COUNTIFS(Requests!$H:$H,"Pending")
=IF(COUNTIFS(Requests!$H:$H,"Pending")=0,"",MINIFS(Requests!$A:$A,Requests!$H:$H,"Pending"))
Format J2 as a date. MINIFS needs Excel 2019 or later (or Google Sheets). For coverage, type a date in J4; J5 counts who's off:
=COUNTIFS(Requests!$D:$D,"<="&J4,Requests!$E:$E,">="&J4,Requests!$H:$H,"Approved")
This assumes one PTO bank. If sick time is separate, add a "<>Sick" condition to C2 and D2 (see the sick leave tracker guide):
=SUMIFS(Requests!$G:$G,Requests!$B:$B,A2,Requests!$H:$H,"Approved",Requests!$C:$C,"<>Unpaid",Requests!$C:$C,"<>Sick",Requests!$D:$D,">="&Settings!$B$1,Requests!$D:$D,"<="&Settings!$B$2)
Highlight the rows that need a look
Select A2:M500 on Requests. In Excel use Home > Conditional Formatting > New Rule > Use a formula; in Google Sheets, Format > Conditional formatting > Custom formula is. One rule per check:
Overlaps someone's approved time off (amber):
=AND(ISNUMBER($K2),$K2>0)
Less notice than the policy asks for, ignoring sick time (amber):
=AND(ISNUMBER($L2),$L2<Settings!$B$3,$C2<>"Sick")
Sheets' conditional formatting can't reference another sheet directly, so use INDIRECT:
=AND(ISNUMBER($L2),$L2<INDIRECT("Settings!B3"),$C2<>"Sick")
Balance would go negative (red):
=AND(ISNUMBER($M2),$M2<0)
Decided but no decision date (gray):
=AND(OR($H2="Approved",$H2="Denied"),$J2="")
End date before start date (red):
=AND($D2<>"",$E2<$D2)
Keep the ISNUMBER checks: Excel treats text, including a blank formula result, as larger than any number, so $K2>0 alone would color empty rows.
Worked example
Year 2026, 10 business days' notice required, holidays including September 7 and November 26. Dana has 15 PTO days for the year, Luis 10 and Priya 12.
| Requested | Employee | Type | Dates | Days | Status | Decided | Conflicts | Notice | Balance after |
|---|---|---|---|---|---|---|---|---|---|
| Sep 1 | Dana | Vacation | Oct 5–9 | 5 | Approved | Sep 2 | 1 | 23 | 10 |
| Sep 15 | Luis | Vacation | Nov 23–27 | 4 | Approved | Sep 16 | 0 | 49 | 5 |
| Oct 1 | Priya | Personal | Oct 16 (half) | 0.5 | Approved | 0 | 11 | 11.5 | |
| Oct 6 | Luis | Sick | Oct 6 | 1 | Approved | Oct 6 | 1 | 0 | 5 |
| Oct 12 | Dana | Vacation | Nov 25–30 | 3 | Pending | 1 | 32 | 7 | |
| Oct 14 | Priya | Vacation | Oct 19–20 | 2 | Pending | 0 | 3 | 9.5 | |
| Oct 15 | Luis | Unpaid | Dec 28–31 | 4 | Pending | 0 | 50 | ||
| Oct 16 | Luis | Vacation | Dec 14–22 | 7 | Pending | 0 | 40 | −2 | |
| Aug 20 | Luis | Vacation | Sep 8–9 | 2 | Denied | Aug 21 | 0 | 12 |
What the log shows:
- Luis's Thanksgiving week is 4 days (November 26 is a holiday); Dana's November 25–30 is 3.
- Dana's pending request shows 1 conflict: Luis is already approved for overlapping days. Luis's row shows 0, or 1 with the pending version. First come, first served, Luis keeps his week.
- Dana's October vacation and Luis's sick day overlap too; J5 shows 2 people off on October 6.
- Priya's October 19–20 request gave 3 business days' notice, so it turns amber. Luis's sick day is exempt.
- Luis's December request would take him to −2, so it turns red. Unpaid days don't touch his balance.
- Priya's approved half day has no decision date, so it's gray.
| Employee | PTO for year | Approved | Pending | Left now | Left if pending approved | Pending requests |
|---|---|---|---|---|---|---|
| Dana | 15 | 5 | 3 | 10 | 7 | 1 |
| Luis | 10 | 5 | 7 | 5 | −2 | 2 |
| Priya | 12 | 0.5 | 2 | 11.5 | 9.5 | 1 |
J1 shows 4 pending requests; J2 shows October 12 (Dana's) as the oldest. Luis's sick day counts against PTO because this example uses one bank. A December 2025 row for Dana is left out of the 2026 totals.
Google Sheets and Excel notes
- Every formula here works in both, and whole-column ranges like
$B:$Bpick up new rows. - In Excel, a table (Ctrl+T) fills formulas into new rows automatically.
- If you collect requests with Google Forms, responses land on their own sheet; copy them into the log rather than adding formulas there.
- For a six-day week, use
NETWORKDAYS.INTL.
Not legal advice. Rules on notice, sick leave, record keeping and denying time off vary by state and sometimes by city. The notice period, approval rules and example numbers here are policy choices to show the process, not requirements or recommendations. Check the rules where your employees work.
Want the log and balances already built?
Simple PTO Tracker is a ready-made Google Sheets / Excel file. Its Requests tab has a submitted date, dropdowns for employee, leave type and status (Pending, Approved, Denied, Cancelled), an "Approved by" column, and working-day counts that skip weekends and holidays, with a days override for half days. Balances show approved, pending and available days per person, and a monthly calendar shows approved and pending time off, so overlaps are easy to spot. It has no printable form or notice and conflict flags; use this page for those. The free Lite version handles up to 5 employees; the full version ($14) handles up to 100.
Related: PTO policy template · How to track PTO in Google Sheets · How to track PTO in Excel · Sick leave tracker spreadsheet