PTODesk

Leave tracker for teams of 10 to 200

Every balance is backed by a ledger entry, so "why is my balance 12.5?" always has an answer.

Free for teams up to 5 · No credit card

Balances you can audit

Accrued

12.5

+0.63 this period

Available

8.5

4.0 pending

Used

6.0

this year

31 Jul Accrual · semi-monthly +0.63 12.50
19 Jul Usage · 1 day, approved −1.00 11.87
15 Jul Accrual · semi-monthly +0.63 12.87
15 Jun Opening · prorated first year +10.96 10.96

Every number is a sum of ledger entries — nothing stored that can drift.

A ledger, not a number in a column

Running balances drift. Ours is derived by summing immutable entries, so it can be recomputed from scratch at any time and every change has a date, an amount and a reason attached to it.

Balances you can audit

Accrued

12.5

+0.63 this period

Available

8.5

4.0 pending

Used

6.0

this year

31 Jul Accrual · semi-monthly +0.63 12.50
19 Jul Usage · 1 day, approved −1.00 11.87
15 Jul Accrual · semi-monthly +0.63 12.87
15 Jun Opening · prorated first year +10.96 10.96

Every number is a sum of ledger entries — nothing stored that can drift.

Accrual that shows its working

Fifteen days across twenty-four semi-monthly periods is 0.625 a cheque. The schedule is visible, the arithmetic is printed, and the nightly run is idempotent — running it three times produces exactly the same ledger.

Accrual that shows its working

Vacation · semi-monthly

24 periods / year

15 days ÷ 24 pay periods = 0.625 per cheque

1 Jantoday · 9.38 accrued31 Dec

Tenure tiers step up on the service anniversary

0–2 yrs

10 days

3–5 yrs

15 days

6+ yrs

20 days

Hired in June, correct on day one

Twenty days times two hundred days present divided by three hundred and sixty-five is 10.96. That calculation is automatic and shown in the interface. The market leader's own users report doing it by hand.

Hired mid-year, correct on day one

SM

Sara Malik

Hired 15 June 2026

prorated

10.96

days opening balance

How that is worked out

20 × 200 days present ÷ 365 = 10.96

The market leader's own users report this as broken and calculated by hand. Here it is automatic, and the working is printed under the balance.

Carryover and expiry, both on the record

At year end the balance is capped and carried, and the difference is written as an explicit expiry entry rather than quietly disappearing. Carried days can expire after N days if your policy says so.

Year end, settled and shown

31 December closing

cap 5 days
closing
12.0
carried
5.0
expired
7.0

Both entries hit the ledger

31 Dec Expiry · above the cap −7.00
1 Jan Carryover into 2027 5.00

Nothing vanishes silently — "where did my days go?" has an answer.

How this compares

The honest version. We are not the simplest tool in this category and we do not try to be.

Leave trackerTypicalPTODesk
How the balance is stored A running total Summed ledger entries
Recomputable from history No Yes, at any time
Mid-year proration Often manual Automatic, arithmetic shown
Expired days Silently removed Explicit expiry entry
Re-running the accrual job Risks double-credit Idempotent by design

Questions

Why does it matter how the balance is stored?

Because when it is wrong you need to find out why. A stored total can only tell you what it is now. A ledger tells you every event that produced it, which is the difference between answering an employee and guessing.

What happens if the nightly accrual runs twice?

Nothing. Every posting carries a period key with a unique constraint behind it, so a second run for the same period is skipped rather than double-credited.

Can we set opening balances when we migrate?

Yes — they are posted as an opening-balance entry with a note, so the ledger starts with an explicit, auditable statement of where each person stood on day one.

Plans

Free

$0 /mo

Up to 5 employees

Start free

Starter

$29 /mo

Up to 25 employees

Start free trial

Team

$59 /mo

Up to 75 employees

Start free trial

Business

$99 /mo

Up to 200 employees

Start free trial

Retire the PTO spreadsheet this week

Import your team from a CSV and go live in under an hour.

Try for free