Asking your Telegram bot who's here today

There's already a daily summary at 6pm and, if you turned them on, a live ping for every punch. Neither of those answers the question you actually ask most days at 11am: who is in the shop right now?

Now the bot does. Type /attendance in the workspace group (or your personal chat with the bot) and it hands you today's list — present, late, on leave — with an inline keyboard of the last week to page through.

What it looks like

📊 Kramtay Coffee
Thu, 24 Sep 2026

🟢 Present: 6 · 🟠 Late: 1 · 🔵 On leave: 1

Check-ins
• Sokha Sun — 06:32 → 14:03
• Lyhour Huy — 07:12 → 14:00 late
• Sreymom Chan — 06:58 → …
…

On leave
• Dara Kem — paid

Below the message, a monthly calendar picker:

[◀ Aug]   [September 2026]   [Oct ▶]
[Mo] [Tu] [We] [Th] [Fr] [Sa] [Su]
[  ] [ 1] [ 2] [ 3] [ 4] [ 5] [ 6]
[ 7] [ 8] [ 9] [10] [11] [12] [13]
[14] [15] [16] [17] [18] [19] [20]
[21] [22] [23] [• 24 •] [25] [26] [27]
[28] [29] [30]
[Today]

Tap any day to see its report. Tap ◀ Aug or Oct ▶ to page months without rewriting the report — the calendar just updates so you can see the shape of the month before you pick. Today is a shortcut that jumps back to now from wherever you wandered to. Whichever day you're viewing is wrapped [• 24 •] so you always know where you are.

You can also type a date if you know what you want:

  • /attendance today and /attendance yesterday
  • /attendance 2026-09-01 (ISO)
  • /attendance 01/09/2026 — day-first, the format most owners here read every day. 24-09-2026 and 1/9/2026 work too.

US-style MM/DD/YYYY is deliberately not accepted — the same 10 characters read as two different days depending on where you live, and DailyBrew's default day-format is day-first. If you type a shape the bot doesn't recognise, it replies with a short "bad date" message naming the ones it does.

Who can run it

Same permission set as the daily summary:

  • The owner, always.
  • Managers with manage_attendance — the capability that already gates "see all employees' attendance vs. only your own" in the console.

In a workspace group chat, everyone in the group can read the reply (the group membership is the credential — matching how the existing group notifications already work). In a personal chat, the bot resolves your User and only queries workspaces where you're owner or one of the above managers. A manager whose only permission is manage_leave will get a polite "no workspace access" — leave-only staff shouldn't be reading attendance rosters over Telegram either.

If your permission changes between the first /attendance and a button tap ten seconds later, the tap is refused too — the bot re-resolves the chat on every callback, not just on the initial send.

A read-only console

That's what this command is, deliberately. You can read the day, page through the last week, and that's the extent of it. You cannot:

  • Edit a check-out from Telegram.
  • Add a manual attendance row.
  • Approve a leave request.
  • Void a bad punch.

Those are all in the console — behind an audit trail and, for the write operations, a required reason. A chat message is a great place to see state; it's a lousy place to change state you'll need to justify next week.

Where the manager fan-out fits

While we were in the notification code, we also fixed something adjacent: check-in and leave-request push notifications used to reach only the owner's phone. If your restaurant has managers running the day-to-day and the owner isn't the one reviewing the leave requests or watching the roster, that was invisible on the mobile app. As of this release, both fan out to owner and every manager with the matching permission — manage_attendance for check-in pings, manage_leave for new leave requests. Telegram already reached everyone via the group chat; push now matches that.

The /attendance command is the other half of the same thought: not every question needs a notification to arrive at the right moment. Some of them, you want to ask.

Getting started

You need the bot linked to a chat once:

  • Workspace group — Settings → Telegram notifications → Connect group. Paste the token into a /start <token> message in your group.
  • Personal DM — Profile → Telegram notifications → Connect personal Telegram. Same shape, different token.

Both flows already existed; nothing new to configure for /attendance. Once the chat is linked, type it and see.

Espresso plan and up — same as the rest of the Telegram integration.