In-app notifications

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] FlatsBratislava so 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.session row).
  • 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).

Source: the FlatsBratislava operator manual.