Customers & Automation
Activity Feed
Last updated 19 May 2026
Activity Feed
A unified feed of everything going on at your venue — booking events, message threads, billing alerts, operator-action prompts. Three tabs (Unread / Needs action / All) with live counts. Staff see what's targeted to them; owners and managers see venue-wide.
Where to find it — Web: Sidebar → Activity. Mobile: bottom tab → Activity.
TL;DR
- Three tabs with live counts: Unread (default), Needs action, All.
- Owners and managers see venue-wide activity; staff see only notifications targeted to them.
- Mobile: swipe right on any row to mark as read.
- The bell icon now navigates straight here — the legacy notification panel was retired in v0.70.0.
The three tabs
| Tab | What's in it |
|---|---|
| Unread (default) | Everything you haven't marked as read yet. |
| Needs action | High-priority items plus types that always require operator follow-up: booking cancelled, client no-show, membership expiring, low wallet balance, deposit expired, deposit forfeited, SMS delivery failed. |
| All | Every notification — read and unread, action and non-action. |
The counts update live as new activity comes in. Tab counts are fetched independently from list contents so a badge stays correct even on a long scrolling list.
Notification types
A wide range of events flow through the Activity Feed:
| Type | What it means |
|---|---|
booking_created |
A new booking was placed. |
booking_cancelled |
A booking was cancelled (auto-includes "Needs action"). |
booking_rescheduled |
A booking was moved to a different time. |
client_no_show |
A customer marked as no-show (auto-includes "Needs action"). |
client_low_satisfaction |
A client left feedback ≤3 stars. |
payment_received |
A payment came in. |
membership_renewed |
A monthly membership renewed successfully. |
membership_expiring |
A membership is approaching its end (Needs action). |
deposit_expired |
A booking deposit authorisation expired (Needs action). |
deposit_forfeited |
A deposit was forfeited (Needs action). |
low_wallet_balance |
Your wallet balance is low (Needs action). |
allocation_warning |
SMS or email allocation is approaching the cap. |
sms_delivery_failed |
An outbound SMS failed to deliver (Needs action). |
Anything with priority: "high" also flags into the Needs action tab.
Role-scoped visibility
The feed is role-scoped at the database level, not just hidden in the UI:
- Owner / Manager — sees venue-wide notifications. Includes their own targeted notifications plus everything aimed at the venue or other staff.
- Stylist — sees only notifications where
targetStaffIdmatches their user. They don't see other team members' notifications.
This applies to reads (you can't see what's not yours) and writes (you can't mark someone else's notification as read). Marking all read for a stylist only marks their own; for an owner/manager it marks venue-wide.
Tapping a notification
Each row's tap target is contextual:
| Notification type | Tap target |
|---|---|
client_low_satisfaction |
/reviews?feedbackId=… — opens the specific feedback record |
low_wallet_balance |
Settings → Billing |
Has relatedBookingId |
The booking detail |
Has relatedClientId |
The customer's profile |
| (Other) | Falls back to the Activity Feed itself |
Mobile-specific UX
| Behaviour | Mobile detail |
|---|---|
| Swipe right to mark as read | Haptic confirmation, badge and count update live |
| Section grouping | Today / Yesterday / day-of-week-and-date / Earlier (kicks in after 10+ items) |
| Tab persistence | Swiping between tabs preserves scroll position |
| Per-type icons | Calendar (bookings), XCircle (cancellations), Clock (rescheduled), CreditCard (payments), Bell (general), MessageSquareWarning (feedback), AlertTriangle (alerts), UserX (no-show), DollarSign (membership), Wallet (low balance) |
Web-specific UX
| Behaviour | Web detail |
|---|---|
| Mark all read button | Right side of the page header; disabled when no unread |
| Cursor pagination | Loads more in chunks; smooth scrolling |
| Filter persists in URL | ?filter=action or ?filter=all — share or bookmark a filter |
| Page count and tab counts | Surfaced live; refetch on tab switch |
Marking as read
| Surface | How |
|---|---|
| Mobile | Swipe right on any row, or tap to navigate (auto-marks as read) |
| Web | Click Mark all read in the header; individual rows auto-mark on tap |
Marked notifications stay in the feed (still visible via All) — they just leave the Unread view and stop counting against the badge.
Bell icon (legacy notification panel)
The bell-icon panel that opened a dropdown was removed in v0.70.0. The bell now navigates straight to the Activity Feed instead — same shortcut, fuller view.
The mobile route /notifications is a redirect to /(tabs)/activity so push-notification deep links still resolve correctly. Old links keep working.
Push notifications
Push notifications fire for high-priority events (cancellations, no-shows, low balance, delivery failures) on both iOS and Android. Tapping the push opens the matching Activity Feed item.
Configure which events push at Settings → Notifications.
Empty states
Each tab has its own empty-state copy:
- Unread (empty) — "You're all caught up."
- Needs action (empty) — "Nothing needs your attention right now."
- All (empty) — "No activity yet."
A truly empty venue (just signed up, no bookings yet) sees the All empty state.
Role access
| Action | Owner | Manager | Stylist |
|---|---|---|---|
| View venue-wide activity | Yes | Yes | No |
| View own targeted activity | Yes | Yes | Yes |
| Mark own notifications as read | Yes | Yes | Yes |
| Mark venue-wide as read | Yes | Yes | No |
Common mistakes
| Problem | What to check |
|---|---|
| Badge says 5 unread but the list is empty | Refresh the page or restart the app. The badge can briefly diverge from the list during high-write moments (rare). |
| Notification I expected isn't appearing | Check your role — if you're a stylist, only your own targeted notifications appear. Check Settings → Notifications that the type is enabled. |
| Marked all as read but the badge stayed | Web: mark-all-read is for the current filter. Switch to Unread and try again. |
| Swipe-to-read isn't working on mobile | Confirm you're swiping right (not left or tap-and-hold). Some accessibility settings reduce swipe sensitivity. |
Tap on a client_low_satisfaction doesn't open the feedback |
Confirm the feedback record still exists; very rarely it's been deleted server-side. Otherwise check console for errors. |
Lots of sms_delivery_failed notifications |
A delivery failure pattern usually means a carrier or number issue. Check Settings → Communications that your dedicated number is healthy. |
FAQ
Where is the Activity Feed?
Web: Sidebar → Activity. Mobile: bottom tab → Activity. The legacy bell-icon notification panel was removed; the bell now navigates straight to the Activity Feed.
What's the difference between Unread, Needs action, and All?
Unread (default) shows everything you haven't seen yet. Needs action shows high-priority items plus types that always require operator action (cancellations, no-shows, expired deposits, SMS delivery failures). All shows everything.
Do staff see the same activity as owners?
No. Staff see only notifications targeted to them personally (their bookings, their clients). Owners and managers see venue-wide activity. The filter is applied to every read and every mark-read action.
Can I swipe to mark notifications as read on mobile?
Yes. Swipe right on any row to mark it as read with haptic confirmation. Tab counts and the badge update in real time.
Why are some items always in "Needs action"?
Specific types are flagged by the system as always requiring operator follow-up: booking_cancelled, client_no_show, membership_expiring, low_wallet_balance, deposit_expired, deposit_forfeited, sms_delivery_failed. Plus anything with priority "high".
Can I clear all read notifications?
There's no clear-history action today. Marked-read notifications stay in the All tab indefinitely so the audit trail is preserved. They don't count against the unread badge.