Skip to content

Notifications

The Notifications system delivers real-time alerts across the platform. When someone assigns you a task, mentions you in a note, approves your leave, or any other action that needs your attention — you get a notification through your preferred channels.

ChannelDescription
In-AppBell icon in the header with unread badge, notification panel, and full notifications page
EmailIndividual notification emails plus a daily digest summary
SlackDirect messages via the Slack bot
PushBrowser push notifications (requires service worker)

34 notification types organised into 10 categories:

CategoryTypes
TasksTask Assigned, Task Status Changed, Task Comment, Overdue Task
LeaveLeave Request Submitted, Leave Approved, Leave Rejected, Leave Approval Needed
TimeTime Entry Approved, Time Entry Rejected, Time Entry Reminder
DealsDeal Assigned, Deal Won, Deal Lost
ProposalsProposal Approval Needed, Proposal Approved, Proposal Rejected
ContractsContract Sent, Contract Signed
PerformanceReview Assigned, Review Completed, Feedback Requested, Feedback Submitted, Scorecard Reminder
RecruitmentInterview Scheduled, Candidate Stage Changed
ProjectsAdded To Project, Sprint Started
GeneralMentioned In Note, New Announcement, Page Comment
FinanceInvoice Created, Invoice Paid
EventsEvent Confirmed

The bell icon in the header bar shows an unread count badge. Clicking it opens a popover panel with your most recent notifications. Each notification shows:

  • Actor avatar and name
  • Notification title and body
  • Relative time (e.g. “5m ago”)
  • Unread dot indicator
  • Mark as read / archive actions on hover

Navigate to /notifications for the full notifications experience:

  • All — All non-archived notifications
  • Unread — Only unread notifications with count badge
  • Archived — Soft-archived notifications (no hard deletes)
  • Preferences — Per-type channel toggle grid
  • Mark All Read — Marks all unread notifications as read
  • Archive Read — Archives all read notifications

Each user controls how they receive each notification type via a grid of toggles:

In-AppEmailSlackPush
Task Assignedtoggletoggletoggletoggle
Leave Approvedtoggletoggletoggletoggle

Preferences are set per-user. If a user hasn’t customised a type, the system-wide defaults from the notification types catalog apply.

The Preferences tab includes a Push Notifications card at the top:

  • Shows current status: Active, Blocked, or available to enable
  • Enable registers a service worker and creates a push subscription
  • Disable removes the subscription from the browser and server
  • If the user denied browser permission, shows “Blocked” with guidance to change browser settings

All authenticated users can view and manage their own notifications. No tool-level permission restriction — notifications are personal.

A daily cron (Mon–Fri 8am AEST) generates:

  • Overdue task reminders — for tasks past their due date
  • Stale leave approval nudges — for requests pending 2+ days
  • Time entry reminders — for users with no time logged this week
  • Daily digest email — summary of unread notifications from the last 24 hours

Squads can be configured with Slack channels and email groups in Settings > Squads:

  • Squad Channel — notifications for all squad members
  • Leads Channel — notifications for squad leads
  • Managers Channel — notifications for squad managers
  • Email Group — group email address for squad-wide emails

External portal users receive a subset of notifications (types marked supports_portal): task updates, contract signing, invoice creation, project updates. Portal notification preferences support In-App and Email channels only.

Executives can view notification metrics on the Usage > Notifications tab:

  • Daily sent volume trend
  • Notifications by type breakdown
  • Channel distribution (email, Slack, push)
  • Read rates by notification type

Notification emails, the daily digest, team announcements and contract signing emails are all system-originated and delivered through Cloudflare Email Sending (the SEND_EMAIL binding in apps/app/wrangler.toml).

  • Sender: Nucleus <notifications@nucleus.fast>
  • Transport: env.SEND_EMAIL.send({ html, text }) via a shared template at apps/app/worker/lib/email-template.ts, wrapped by apps/app/worker/lib/system-email.ts
  • DNS: nucleus.fast must have the SPF and DKIM records provisioned in the Cloudflare Email Sending dashboard (dash.cloudflare.com → Email → Email Sending). Destinations are not pre-verified — send to any recipient.
  • Reply-To: for contract emails the Reply-To is set to the sender’s address so replies route to the human who initiated the contract, not to notifications@. An inbound CC address is also attached for unified-inbox thread capture.

Person-to-client email (user-composed messages, inbound replies, the Contact tool, report emails and recruitment outreach) still flows through the Gmail API with Google Workspace domain-wide delegation — see apps/app/worker/lib/email-config.ts. That way team members’ messages to external contacts continue to look and thread as personal mail.