Is there an existing issue for this?
Current behavior
Describe the bug
The workspace inbox shows the correct unread notification count (badge), but the actual notification list never loads — the inbox stays on the empty-state illustration even though notifications exist.
Root cause
WorkspaceNotificationService.list() in packages/services/src/workspace/notification.service.ts builds its request URL without a trailing slash:
async list(workspaceSlug, params) {
return this.get(`/api/workspaces/${workspaceSlug}/users/notifications`, { params })
...
}
Every sibling method in the same file (getUnreadCount, update, markAsRead, archive, markAllAsRead) correctly appends a trailing slash — only .list() omits it.
The backend only registers this route with a trailing slash:
# apps/api/plane/app/urls/notification.py
path(
"workspaces/<str:slug>/users/notifications/",
NotificationViewSet.as_view({"get": "list"}),
name="notifications",
),
So the request 404s at the Django routing layer. In our self-hosted deployment (Traefik reverse proxy), this upstream 404 surfaces to the browser as a 500, which obscured the real cause until we checked the API pod logs directly.
Confirmed affected versions
- v1.2.0
- v1.3.1
preview branch (current HEAD as of 2026-07-28) — bug is still present
Steps to reproduce
Steps to reproduce
- Have User A mention/comment-tag User B on a work item
- As User B, open the workspace inbox
- Inbox badge shows unread count correctly
- Notification list panel remains empty; network tab shows a failed request to
/api/workspaces/{slug}/users/notifications?... (no trailing slash)
Expected behavior
The notification list request should include the trailing slash (matching every other method in the same service file), or the backend should register both slash and non-slash variants.
Suggested fix
One-line change in packages/services/src/workspace/notification.service.ts:
- return this.get(`/api/workspaces/${workspaceSlug}/users/notifications`, { params })
+ return this.get(`/api/workspaces/${workspaceSlug}/users/notifications/`, { params })
Environment
Production
Browser
Google Chrome
Variant
Self-hosted
Version
v1.2.0
Is there an existing issue for this?
Current behavior
Describe the bug
The workspace inbox shows the correct unread notification count (badge), but the actual notification list never loads — the inbox stays on the empty-state illustration even though notifications exist.
Root cause
WorkspaceNotificationService.list()inpackages/services/src/workspace/notification.service.tsbuilds its request URL without a trailing slash:Every sibling method in the same file (
getUnreadCount,update,markAsRead,archive,markAllAsRead) correctly appends a trailing slash — only.list()omits it.The backend only registers this route with a trailing slash:
So the request 404s at the Django routing layer. In our self-hosted deployment (Traefik reverse proxy), this upstream 404 surfaces to the browser as a 500, which obscured the real cause until we checked the API pod logs directly.
Confirmed affected versions
previewbranch (current HEAD as of 2026-07-28) — bug is still presentSteps to reproduce
Steps to reproduce
/api/workspaces/{slug}/users/notifications?...(no trailing slash)Expected behavior
The notification list request should include the trailing slash (matching every other method in the same service file), or the backend should register both slash and non-slash variants.
Suggested fix
One-line change in
packages/services/src/workspace/notification.service.ts:Environment
Production
Browser
Google Chrome
Variant
Self-hosted
Version
v1.2.0