All work
AutomationTeams of 10 to 50 people2026

A bot for the team's HR routine

Time off, shift swaps and payslips lived in work chats and got lost. The bot carries them from request to approval, and the manager runs everything from a familiar spreadsheet.

Outcome

  • The manager approves requests in minutes, not hours: one button on the phone
  • Shifts no longer fall apart over clashing leave: the conflict shows up on the request
  • Less chat chaos and no «but I told you»: every request has a status and history
  • Less admin routine: the bot sends reminders and payslips by itself

The problem

Leave, days off and shift swaps were agreed in work chats: someone messaged the manager privately, someone posted in the group, someone just said it out loud. Requests got lost, and clashes surfaced on the day two people failed to turn up at once.

Payslips were a separate pain: each one has to reach the right person privately, and you need to know who has read it. A file in the shared chat solves neither.

What I built

Every request has a path and a status. Leave, a day off, sick leave or a shift swap: the bot carries the request from submission to decision and logs it.

Decisions from the phone. The manager gets a card with two buttons and sees straight away who else is away on those days.

Payslips in private. Everyone gets their own payslip with an «Acknowledged» button, so you can see who has confirmed.

Reminders without manual buttons. The bot reminds people about tomorrow's shifts and unread payslips by itself, on a schedule.

When it fits

  • Leave and cover are agreed in chats. Someone messages the manager privately, someone posts in the group, and requests get lost.
  • The manager does not want to touch a server for a small setting. The admin panel has to be something they already open every day.
  • A shift swap can happen behind someone's back. It needs explicit consent from the other side, not a silent swap.

The key decision: the spreadsheet is an admin panel, not a database

The manager should not have to log into a server to change the monthly limit on days off. So the admin panel is a Google Sheet they already open every day.

The source of truth always lives inside the bot (SQLite). Every tab of the sheet is either an input a person fills in or a log the bot rewrites in full, never both at once. That way the team never ends up with two different versions of the truth.

Safeguards

Nobody can rewrite someone else's schedule behind their back. A shift swap is first a request, and it becomes a fact only after the other side agrees.

The process owner does not depend on a developer. Limits and the reminder hour are changed inside the bot, with no edits on the server.

Try it yourself

The «See it live» link opens a demo bot. After Start you get your own made-up team with a two-week schedule, and you are both an employee and the manager in it. Try booking time off on a day when two people are already away: the bot turns it down on its own. Or offer a colleague a shift swap and watch the schedule update once they agree.

In the demo the made-up colleagues answer by themselves within a few seconds, and there is no Google Sheet: everything lives inside the bot. Only you see your actions, and there is no real data in it.

Common questions

Could the manager accidentally overwrite someone else's data in the sheet? No. The direction data flows in is fixed: a tab is either an input a person fills in, or an output the bot rewrites in full, never both at once.

What if two employees ask for time off on the same days? The manager sees it right on the request card: who else is away on those days and whose request is still pending. If a limit on simultaneous absences is set, the bot rejects a request over it on its own, and checks again on Approve, since two requests could arrive at once. Sick leave is never blocked by the limit, only flagged.

Stack

  • Python
  • aiogram 3
  • Google Sheets API
  • SQLite
  • APScheduler

Got a similar task?

Describe it in two sentences. I'll tell you if it can be automated, and we'll set up a short call to go through the details.

Message me on Telegram