Every company I've worked at handled leave tracking differently. Spreadsheets, a shared calendar, a "post in #general before you go" convention. I've seen all of them. The shared Google Sheet is usually where it starts. It's free, everyone already has it, and a junior dev can set one up in ten minutes.

Six months later something breaks. A leave request gets missed, two people book the same week, or a colleague keeps getting DMs because nothing tells anyone they're away. At that point the spreadsheet isn't solving the problem anymore. It's just a place where problems happen. This post is about what that looks like, and what I ended up building instead.

Where the Google Sheets leave tracker stops working

Most of these I've either seen myself or had described to me almost word-for-word by other engineering managers.

Someone submits a request and the manager never notices. There's no notification when a row is added: no flag, no alert, no email. The leave happens anyway. The manager finds out on Monday when they ask where their teammate is.

Two people book the same week because nobody checks the sheet before requesting. The conflict only surfaces when both are gone and the team is suddenly short-staffed in the middle of a release.

A row gets deleted or overwritten. Anyone with edit access can change anything: no audit trail, no approval-locked record. Someone edits a date field by mistake and a week later you're trying to reconstruct what happened from a history that doesn't exist.

No Slack status, no calendar block. Someone on PTO keeps getting DMs from people expecting a reply. The only source of truth is a sheet that nobody remembers to open.

Public holidays get counted inconsistently. Different rows treat them differently (some subtract from the annual allowance, some don't) because the sheet has no concept of a rule.

Remote teams add timezone confusion on top. Half-days are listed as "AM" or "PM" with no standard. Dates are ambiguous. The sheet doesn't know what timezone anyone is in, and neither does the person reading it.

None of these are hypothetical. Every team I've talked to that outgrew a spreadsheet can name one of these specifically.

The part no spreadsheet can do

The single feature that made me stop refining another sheet and actually build something was Slack status sync. When a colleague is on leave, their status shows "On leave" to anyone who DMs or @-mentions them. It's ambient, so nobody has to check anything. On the approved leave days the status gets set automatically, and it gets cleared at midnight on the last day.

A shared calendar can get you partway there. A spreadsheet can't do it at all. That's the piece I'd want in any tool I used, and it's the reason the post you're reading exists.

How Who's OOO handles it

The workflow in Who's OOO looks like this:

  1. An employee submits a leave request through the web UI.
  2. The manager gets a Slack notification with approve and reject buttons, no browser required.
  3. On approval, the team calendar updates automatically.
  4. On the approved leave days, the employee's Slack status is set to "On leave" and cleared at midnight on the last day.
  5. A weekly digest goes out every Monday showing who's out that week.

Slack leave approval notification from the Absences Bot showing a new sick leave request with Approve and Reject buttons

That's the approval message managers get. One tap, no context switch, no browser tab.

The moment a request is approved, the shared team calendar updates automatically. It shows everyone at once: current month, filterable by leave type or employee, and it's the same view everyone on the team sees. Nothing to refresh, nothing to merge.

Team Calendar view in Who's OOO showing approved leaves across multiple team members for April 2026 with colour-coded entries per employee

The Monday digest is the other half of the pattern: a single message posted to your team channel listing everyone out that week, grouped by leave type and with date ranges. It lands in the same place people already read announcements, so nobody has to open another tool.

Slack weekly digest message from Absences Bot listing team members out this week with their leave types and date ranges

Nobody has to remember to check anything. The information comes to the team.

Public holidays are imported from the Nager.Date API: 100+ countries, no manual entry. The iCal feed means Google Calendar, Outlook, and Apple Calendar pick up absences automatically once a team member subscribes.

A note on the stack

I built Who's OOO with Symfony 7.4 and PHP 8.5 because that's what I've been working with since 2015 and I wanted something I could maintain without friction. The entire UI runs on EasyAdmin, including the employee-facing parts, which is unusual, but it let me ship faster than hand-rolling Symfony Forms. Data access goes through Doctrine with XML mapping, tests run on Pest with 95%+ coverage, and PHPStan sits at Level 8. Nothing exotic. The point was to have a tool I could actually run in production without constant attention.

That also matters for the "is it really a developer afternoon?" question. It is, but only because Symfony deploys cleanly and there's nothing special about the setup: a standard PHP app with MySQL. Any fortrabbit instance or Docker host will take it without fuss.

Cost

For most absence management tools, cost is a real objection. £1–4 per user per month adds up for a team of 20 before you've done anything. Who's OOO is free to self-host, AGPL-3.0 licensed. Deploy on fortrabbit for €4.5/month or run it anywhere with Docker Compose. If you already have a server, adding it costs nothing.

What it does and doesn't do

It covers leave request submission, manager approval, configurable leave types (annual, sick, parental, unpaid, plus custom ones), per-type toggles for whether a type requires approval or tracks balance, annual allowances with per-employee overrides, and roles for Admin, Manager, and Employee. The Slack integration does approvals, weekly digests, and status sync. Public holidays auto-import for 100+ countries. Google Calendar and Outlook pick up absences through an iCal feed. Dark mode and four color palettes are in the box.

There are things it doesn't do, and I want to be honest about them. No mobile app. No multi-level approvals. No SSO. No REST API. No accrual rules or carry-over calculations. If any of those are hard requirements, Timetastic or Calamari are worth evaluating - they're good tools. But they will cost you much more money.

For teams that want the spreadsheet replaced with an approval flow, Slack integration, and a shared calendar that actually works, Who's OOO covers the full list.

Migrating off a Google Sheets leave tracker

The migration is simpler than it sounds. Export the existing leave history from the spreadsheet and keep it as a reference. Add employees to Who's OOO and configure their leave type allowances. Import public holidays for your country in one click. Share the URL with your team.

That's it. The installation guide walks through deploying on fortrabbit or with Docker.

Common questions

Is Who's OOO really free?

Yes. AGPL-3.0, self-hosted. You pay for the VPS, or nothing if you already have one. No per-user fees, no trial period, no gated features.

Does it integrate with Google Calendar?

Yes. It provides an iCal feed that Google Calendar, Outlook, and Apple Calendar can subscribe to. Once subscribed, absences appear automatically.

What if I need something more than leave tracking?

If you need payroll, recruitment, or performance reviews, OrangeHRM or a full HRIS is the right call. Who's OOO is deliberately focused on absence management only. I didn't want to build another HR suite.

In closing

Who's OOO is what I wanted every company I've worked at to have: something honest, self-hosted, free to run, and boring enough to trust. The full source is on GitHub. If you end up deploying it, I'd like to hear how it goes.