In-app notifications
A sibling channel to WhatsApp notifications — when something needs the operator's attention, in-app notifications fire alongside WA. Browser tab shakes, audio plays, the operator acks once across all open sessions.
Open from V28 → Settings → Notifications.
Why both channels
WhatsApp is reliable but lossy — closed-window guests, batched sends, the 24h policy. In-app notifications close the gaps for operators actively in the app:
- WA stays the fallback — if the operator doesn't ack in-app within 60 s, the WA notification fires anyway.
- In-app wins when actively engaged — operator at the desk acks via tab shake + audio; no extra WA noise.
How an in-app notification looks
- Tab title shake — the browser tab title oscillates between the page name and
[N] FlatsBratislavaso the operator sees it from another tab. - Audio cue — short ping (configurable). Silenced when the operator's tab is focused.
- Slide-in toast — top-right corner, summary + jump-to-entity button (e.g. "Send Check-in BLOCKED for Castle&River → open task").
- Persistent inbox bell — top header carries a count chip; tap to see all unacked.
Ack semantics
Acking a notification:
- Stops the shake + audio.
- Marks it acked across all the operator's open sessions (multi-tab sync via the same
users.sessionrow). - Cancels the 60 s WA fallback.
If the operator doesn't ack within 60 s on any tab, the WA fallback fires per the standard task notifications flow.
Configuration
Global defaults (per-tenant)
In Settings → Notifications:
- Audio enabled — global on/off.
- Audio volume — 0–100.
- Tab shake enabled — global on/off.
- Toast duration — seconds before the toast auto-dismisses.
- WA fallback delay — default 60 s.
Per-template override
Each task template (in the Task Templates editor) carries an In-app notification field:
- inherit (default) — uses the tenant defaults.
- force-audio — even when global audio is off, this template plays audio (use for critical templates).
- silent — no audio + no shake even when global is on (use for low-priority alerts).
- wa-only — skip in-app entirely; always WA.
This lets the operator put aggressive shake+audio on Send Check-in BLOCKED while keeping "Generate guest book" silent.
Browser permission
In-app notifications use the standard browser notification permission (Notification.requestPermission()). The first time the operator opens V28 after gh#552 ships, they get the browser permission prompt; granting it enables OS-level toasts even when the tab isn't focused.
If the operator denies the permission, in-tab toast + shake + audio still work; OS-level toasts don't.
Implements: gh#552 (in-app notifications: shake + audio + ack as WA-channel sibling). Related: gh#562 (mobile push end-to-end), gh#561 (mobile bottom-nav badges + iOS app-icon badge), gh#583 (mobile push deep-link to entity routes).