Skip to content

[bug]: Notification list endpoint 404s due to missing trailing slash in frontend service call #9489

Description

@cmc-mfino

Is there an existing issue for this?

  • I have searched the existing issues

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

  1. Have User A mention/comment-tag User B on a work item
  2. As User B, open the workspace inbox
  3. Inbox badge shows unread count correctly
  4. 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

Metadata

Metadata

Assignees

Labels

planesync issues to Plane🐛bugSomething isn't working

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions