Notifications
Ascendly delivers in-app notifications when scorecard and related events affect you or your team. The same inbox and delivery rules apply on web and the Windows desktop app.
Where to find them
| Client | Bell | Full inbox | Delivery preferences |
|---|---|---|---|
| Web | Header nav | /notifications | Account / settings |
| Desktop | Titlebar (next to window controls) | /notifications | Settings → Notifications |
Unread count appears on the bell. New items can also show as toasts while you are signed in. Desktop can optionally mirror toasts as native OS notifications (user preference).
What triggers notifications
Scorecard entries (seven submission types)
When someone submits an entry for you (as the evaluated employee), you receive scorecard.{kind}.submitted_for_you for:
sbs · non_sbs · atw · attendance · productivity · additional_points · incidents
When a manager soft-deletes an entry that affects you, you receive scorecard.{kind}.deleted_for_you. Deletes are recoverable from the web recycle bin while the entry month is open — see Scorecard § Recently deleted.
ATW entry requests
| Type key | Who receives it |
|---|---|
scorecard.atw.request_submitted | Managers reviewing the request |
scorecard.atw.request_approved | Employee who submitted the request |
scorecard.atw.request_rejected | Employee who submitted the request |
Employees submit requests from desktop My ATW (or web when enabled). Managers approve/reject on the web ATW page.
Evaluation follow-up
| Type key | Purpose |
|---|---|
scorecard.eval.follow_up | Employee pings managers about missing SBS / Non-SBS evaluations |
Scheduled reminders (worker)
| Type key | Purpose |
|---|---|
scorecard.evals.missing_team | Leftover monthly gap ping (off by default). Prefer the lock reminders below. |
scorecard.weekly_lock.approaching | When weekly locking is enabled and a week’s lock is within remind_hours_before (default 24h). Body includes how many people in that manager’s scope are short for that week (not later weeks). |
scorecard.monthly_lock.approaching | When monthly locking is enabled and the month’s scheduled lock is within remind_hours_before. Body includes how many people in that manager’s scope are short for the month. |
Lock emails are not the Configurations page. Scorecard → Configurations → Scheduled locking is what actually locks periods and shows page banners. System → Notifications types Weekly lock approaching / Monthly lock approaching send in-app + email before that lock, from the worker job weekly_lock_reminders (about every 30 minutes). They do not use the daily 09:00 clock on the notification type. Preview scan reports the next lock even outside the window; Send now only delivers once the remind window is open.
See Scorecard § Scheduled locking.
News — birthday greetings
Posting a birthday greeting on News notifies the celebrant with a link to that year’s thread. This path is not listed in the System → Notifications catalog (it is emitted by the news domain).
Not notified today
- Weekly Kudos publish (employees see cards on the desktop widget via poll)
- Learning assignment / due-date reminders (not built)
Admin configuration
Super admins (access level 5) manage catalog types at System → Notifications (/system/notifications):
- Enable or disable each type
- Edit title/body templates
- Configure scheduled types (time + IANA timezone; UI shows local time)
- On lock / missing-evals types: Also post to the Teams channel (one shared notice; see Teams channel)
Users control delivery per type: in-app and email on/off independently (when email is enabled on the server).
Email delivery (Gmail)
When NOTIFICATION_EMAIL_ENABLED=true and Gmail delegation is configured on the API and the Worker, eligible notifications can also send email to the employee's work address (personal_data.email_address). Test emails and Compose email run on the API; scheduled reminders send from the Worker, which needs the same NOTIFICATION_EMAIL_* variables.
| Rule | Behavior |
|---|---|
| User prefs | Per-type in-app and email toggles on the delivery preferences panel |
| Quiet hours | Email suppressed during configured quiet window (user timezone) |
| Type catalog | Admins can restrict which channels a type supports |
| Impersonation | Mirror notifications to the impersonator's inbox skip email |
Super admins can send a test email from System → Notifications (POST /v1/system/notifications/email-test).
Env vars: NOTIFICATION_EMAIL_ENABLED, NOTIFICATION_EMAIL_IMPERSONATE, NOTIFICATION_EMAIL_FROM, NOTIFICATION_APP_BASE_URL. See engineering api/.env.example.
Teams channel
Super admins (level 5) connect one Microsoft Teams channel at System → Teams (/system/teams). This is a shared notice board, not personal chat:
- In Teams, add a Workflow to the destination channel: Post to a channel when a webhook request is received.
- Paste the HTTPS URL in Ascendly (treat it as a password).
- Send a test card. Compose announcements anytime. Automated lock and missing-eval posts stay off until Enable automated Teams posts is on at System → Teams and the type checkbox is on at System → Notifications.
Automatic posts (one per event, not one per manager):
- Weekly / monthly lock approaching
- Missing evaluations — department counts only, no employee names
Personal types (submitted_for_you, ATW approve/reject, eval follow-up, birthdays) never post to the channel. Users do not get a Teams delivery toggle. If Teams is down, the bell and email still send; failures show under Recent posts.
v1 cards appear from Workflows. An Ascendly Teams app/bot is later. Optional server override: TEAMS_WEBHOOK_URL.
API: GET/PUT/PATCH/DELETE /v1/system/teams/connection, POST /v1/system/teams/test, POST /v1/system/teams/compose, GET /v1/system/teams/posts.
Web and desktop parity
Both clients call the same REST API (GET /v1/notifications, mark read, delivery prefs). Shared behavior:
| Concern | Rule |
|---|---|
| Timestamps | API stores UTC; relative labels (“5m ago”) parse datetimes as UTC |
| Hooks & formatting | Desktop imports web/src/notifications/* — do not maintain separate copies |
| Scorecard side-effects (desktop) | When a scorecard.* notification arrives, desktop Home / BSC cards refetch so ATW points and BSC % stay in sync after deletes |
If you add a notification type on the API catalog, wire it in the shared web module; desktop picks it up automatically.
Related docs
- Scorecard — entry CRUD, soft delete, recycle bin
- News — birthday greetings
- Desktop app — employee Home, My ATW, notification bell
- Platform & admin — sign-in domains, system status, admin email, Teams channel
- Teams channel — notice-board destination
- Dashboard overview — BSC self view (live scores after entry changes)
- What's in Ascendly — product map
