Two acknowledgement states on every notification. Unseen means never shown to you — it is what the badge and the toast candidates are drawn from. Seen-but-unread keeps its accent treatment in the panel. Read means you opened or clicked it.
Also called: badge won't clear · unread notifications · mark all read · still shows as new
- 1Opening the panel marks everything seen, and re-fires for anything that arrives while it is open.
- 2Clicking a row marks it read and navigates; dismissing a toast with the ✕ marks only SEEN; a toast that expires on its own marks NOTHING, because 'the badge still owes the user that event'.
- 3Counts move optimistically; server counts are skipped while a mark POST could still be racing the read, so a diff cannot re-light a badge the user just cleared.
Migration 098 defines the model: 'unseen → badge + toast candidate; seen-but-unread → accent row in the panel'. The race guard exists because 'a diff read racing the seen/read UPDATE would re-light the badge the user just cleared' — and re-lighting it would also re-trigger the bell's mark-all-seen.
- A badge that resurrects itself on the next poll
- Glancing at the panel wiping your unread state
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →