smengo

SMENGO · SHIFT SWAPS

A swap is a request with a decision, not a thread in the group chat

An employee asks for a swap in Telegram. You approve it in one tap — and the shift leaves their schedule that same second and lands on the board in front of matching colleagues. In waves, not all at once.

  • Employees cannot drop a shift — only ask for a swap
  • Approval removes the shift and opens it in one transaction
  • The decision comes back to the same chat
Shift board

Uncovered shifts in the schedule — the system offers them to matching employees on its own

+ Open shift

Swap requests

  • From Olga Romanenko·Fri, 3 July · 16:00–00:00
    Created 1 July 2026
    RejectApprove

Open

  • Fri, 3 July·Sales Department·Manager·16:00–00:00

    Замена: Olga Romanenko

    Created 1 July 2026 · Offers sent: 4
    Cancel
  • Sat, 4 July·HR·Any position·10:00–18:00
    Created 30 June 2026 · Offers sent: 6 · Declined: 2
    Cancel

Awaiting approval

  • Sun, 5 July·Sales Department·Manager·12:00–20:00
    Created 29 June 2026 · Offers sent: 5
    RejectApprove

    Claimed by: Alexey Novikov

Closed this month

  • Thu, 2 July·Sales Department·Manager·09:00–18:00
    Created 27 June 2026 · Offers sent: 4
    Closed

    Claimed by: Ivan Melnikov

How it runs

One shift, end to end: from “I can't make it” to a new name in the schedule

Friday, 3 July, 16:00–00:00. Olga is not coming in — here is what happens next.

  1. 114:05

    The employee taps “Request swap”

    The bot lists only her own upcoming working shifts, ten at most. Someone else's shift cannot be picked: the list is always refiltered by employee.

  2. 214:06

    The request reaches the manager

    The chat says “Request sent to your manager”; a new row appears under “Swap requests”. Asking for the same shift twice does not work — one live request per shift.

  3. 315:31

    The manager taps “Approve”

    The shift is deleted from Olga's schedule and immediately becomes an open shift with a note naming the person being replaced. The shift cannot end up removed and not opened: both writes happen in one transaction. Offers go out as the next step.

  4. 415:31

    Wave 1 — the people who wanted it

    Offers go to colleagues in the same department and position: first those who marked “I want” for 3 July, then within the wave by hours already booked this month, lowest first.

  5. 515:44

    “Take it” — and the shift is in the schedule

    With “Instant claim” on, the first person to tap gets the shift right away; everyone else is told “This shift has been taken”.

  6. 6+60 min

    If nobody answers — wave 2

    Once the wave TTL expires (an hour by default, configurable from 5 minutes to a day) the offer goes to the remaining matching employees in the department.

Closing the loop: the person who asked for the swap gets “Swap approved” or “Swap rejected” in the same chat — no separate app, no phone call.

Boundaries

Employees do not drop shifts. They ask.

Only someone with the “Manage shifts” permission changes the schedule. That is a deliberate rule: a swap agreed in a group chat does not change the schedule by itself.

Employee — in Telegram

Asks, accepts, declines

  • Ask for a swap on any of their own nearest working shifts (the bot lists up to ten)
  • Mark “I want” and “I can't” in the availability calendar
  • Claim an open shift with “Take it”
  • Skip an offer — that offer closes and the shift stays open for everyone else

Manager — in Smengo

“Manage shifts” permission

  • Approve or reject a swap request
  • Create an open shift with no request behind it
  • Cancel an open shift
  • Approve a claimant when “Instant claim” is off

Not a UI convention: without the “Manage shifts” permission the requests are not visible at all — access is closed by database policies, not by a hidden button.

What is inside

Five mechanics a swap is made of

None of them is a roadmap promise — this is how the product behaves today.

The ask arrives as a request, not a message

One tap on “Request swap” in the bot, and the manager gets a row with the name, date and time of the shift. Nothing sinks in the chat, nothing has to be retold.

  • Only the employee's own upcoming working shifts, ten at most
  • One live request per shift — a duplicate simply is not created
  • Until it is decided, the shift stays in the schedule under their name
2 taps
from button to request
pick the shift, confirm
0
duplicate requests
a unique index on the live request in the database

Approval is one transaction, not two actions

“Approve” removes the shift from the employee and creates the open shift in a single database call. Date, time and shift preset carry over as they are, and the note records who is being replaced.

  • The shift cannot end up removed and not opened — both writes happen in one transaction
  • The deletion is written to the change log
  • If the shift was edited or deleted in the meantime, the request is honestly closed as stale
1
call per approval
approve_swap_request in the database
2
layers checking the permission
a database policy and a server-action gate
Schedule · Fri, 3 July
Olga Romanenko16:00–00:00
Shift removed
Board · open shift
Sales Department · Manager16:00–00:00
Замена: Olga Romanenko
Open
approve_swap_request()Removing and opening happen in one call: a half-applied state cannot happen. Offers are inserted as the next step.

Offers go out in waves, not in a blast

An open shift is not fanned out to everybody. It starts with the people who said they want to work that day and who have fewer hours booked this month. The rest join later.

  • Candidates come from the same department and position; leave the position empty and any position qualifies
  • Anyone already booked that day or marked as unavailable never enters the list
  • Wave 2 fires on the TTL: from 5 minutes to a day, an hour by default
  • If nobody marked “I want”, wave 1 takes half the list — but never fewer than three people
60 min
default wave TTL
configurable from 5 minutes to 24 hours
2
offer waves
the priority one and everyone else who fits
Wave 1 — right awayHours this month

Marked “I want” on 3 July, sorted by hours booked this month

Alexey NovikovI want112 h
Daria KosI want176 h
Wave 2TTL 60 min
Mark Sidorov184 h
Kate Volkova192 h
Will not get an offer
Ivan Melnikovalready scheduled on 3 July
Yulia Lebedmarked as unavailable
Roman Karpovdifferent department

If nobody marked “I want” for that date, wave 1 takes half of the matching people — but never fewer than three.

“Instant claim” — or your approval

One switch in the settings decides who has the final word. On: the first person to accept is already in the schedule. Off: the claimant waits for you under “Awaiting approval”.

  • First tap wins — the shift row is locked at the moment of the click
  • Nobody ends up with two shifts on one day: the second attempt returns a conflict
  • A rejected claimant does not block the shift — it goes back to open
2 modes
of claiming a shift
instant or with approval
1
shift per person per day
a second claim returns a conflict
Open shifts
Instant claim

The first employee to accept gets the shift right away, without approval.

Wave TTL, minutes60How many minutes before the offer moves to the second wave.
Save
On

“Take it” — and the shift is in their schedule; everyone else is told it has been taken.

Off

“Take it” — and the row moves to “Awaiting approval”: the manager has the last word.

No race conditions: the shift is locked at the moment of the click, and the second person is told it is already taken.

The answer comes back to the same chat

The person who asked gets the decision. The person who took the shift gets confirmation that it is already in their schedule. The other candidates learn that it is gone.

  • “Swap approved” and the shift is on the board — or “Swap rejected”
  • If an offer cannot be delivered, it is marked unreachable instead of hanging silently
  • The swap.decided event goes to your webhooks — pull the decision into your own system
3
recipients per decision
the asker, the winner and the other candidates
4
fields in the webhook event
request_id, employee_id, entry_date, decision

Not only swaps

An open shift can be created without any request

Somebody called in sick, a new location opened, the evening was extended — create the shift by hand and it travels the same waves.

  • Up to ten identical shifts at once
  • Department is required, position is optional: “Any position” widens the candidate pool
  • Time comes from your shift presets or is typed in
  • The note stays on the shift card on the board — it never reaches the candidate's offer message
  • If no matching candidates exist, the form says so instead of pretending it sent anything
New open shift
Date
3 July 2026
Department
Sales Department
Position
Manager
Number of shifts
1
Time
Morning 09:00–17:00Evening 16:00–00:00Night 00:00–08:00Custom time
Note
Swap: Olga Romanenko
CreateCancel

No matching candidates found — no offers were sent

Comparison

The “who can cover me?” chat versus a swap board

The same Friday, two very different endings.

The ask sinks in the feed; who agreed becomes clear on the day of the shift
The request sits in its own list with name, date and time; the decision is two buttons
“I sorted it out” — while the schedule still shows the original person
Approval changes the schedule itself: the shift is removed and opened in one action
Everyone is pinged at once, and the person already overworked says yes
The people who marked “I want”, with fewer hours this month, hear about it first
Two people took the same shift and it has to be untangled by hand
First tap wins; the second person is told the shift is gone
The manager decides
A swap becomes an open shift
The answer returns to the same chat

Outward: every decision leaves as a swap.decided webhook event — with the request id, the employee, the shift date and the decision itself.

Questions

Common questions about shift swaps

No. The bot only offers “Request swap”, which creates a request. The schedule changes when a manager with the “Manage shifts” permission decides.

It stays in the schedule under the employee's name. Until “Approve” is tapped, nothing changes for anyone else.

Employees from the same department with a matching position. Wave 1 is the people who marked “I want” for that date, sorted by hours already booked this month. Wave 2 fires after the TTL, an hour by default.

Yes, with “Instant claim” on: the first person to tap “Take it” gets the shift in their schedule immediately. Turn the switch off and every claimant waits for your decision.

They never enter the candidate list, and a claim through any other path returns a conflict: nobody ends up with two shifts on one day.

No. Everything an employee needs happens in the Telegram bot behind a single invite link; the web interface is for managers.

Yes. Each decision is delivered as a signed swap.decided event to your HTTPS endpoint; the payload carries the request id, the employee, the shift date and the decision.

Let swaps live in the schedule, not in the group chat

Connect the team to the bot and open the board — the next “cover me?” will reach you as a request with two buttons instead of a message at one in the morning.

14 days free · no card