After upgrading to v3.0.0/v3.0.1 Commercial (free 12-seat tier, no paid license), every workspace page navigation triggers the error boundary. Reloading the page recovers, but it is a very annoying step to click “Reload” whenever navigating anywhere.
Error screeen:
From the browser console, the issue seems to be with the teamspaces endpoint:
Request URL <DOMAIN>/api/workspaces/cogscai/teamspaces/
Request Method GET
Status Code 402 Payment Required
This makes Plane near unusable for us. Please assist with a fix. Thanks.
Follow-up with diagnostics.
The 402 response itself appears to be correct behavior. Per your own docs:
- Self-hosting 101: the Commercial Edition’s built-in Free tier is 12 seats per workspace, and “to unlock Pro, Business, or Enterprise Grid features, you activate a license key.” (Self-hosting 101 | Plane)
- The pricing page lists Teamspaces as a Pro-tier feature (Basic on Pro, Advanced on Business/Enterprise). (Plane Pricing | Simple per-seat plans for teams that ship)
So a free-tier workspace receiving 402 from /api/workspaces/<slug>/teamspaces/ is the paywall working as designed. Our backend checks support this: the license activates and verifies successfully, workspace sync returns 200, GET /api/payments/workspaces/<slug>/flags/ returns {} (correct for a free-tier workspace), and all other API endpoints return 200/201.
The bug is that the frontend crashes on this legitimate 402. Console trace from the error page:
GET /api/workspaces/cogscai/teamspaces/ 402 (Payment Required)
Failed to fetch teamspaces {status: 402, ...}
TypeError: n.find is not a function
at store-context-BjKUlH_5.js:746:704160
at by (mobxreact.esm-*.js) <- mobx computed
at sidebar-wrapper-*.js
at e.useMemo
React Router caught the following error during render
TypeError: n.find is not a function
Observed sequence on every workspace page navigation (client-side, e.g. sidebar click):
client-bootstrapcallsfetchTeamspaces(), which GETs/api/workspaces/<slug>/teamspaces/- API returns 402
- The store logs “Failed to fetch teamspaces”, leaving the teamspaces observable in a non-array state
- A MobX computed used by the sidebar calls
.find()on it and throws - The React Router error boundary catches the throw and replaces the entire page
Clicking the error boundary’s Reload button (a full page reload) recovers the page. The crash recurs on the next client-side navigation.
Expected behavior: the frontend should not fetch /teamspaces/ for a workspace without the teamspace entitlement — or, defensively, the store should fall back to an empty array on fetch failure and the computed should guard the .find() call. A 402 from a paywalled endpoint should not take down the whole page.
We are on Commercial v3.0.1 (also reproduced on v3.0.0), self-hosted on Kubernetes via the Helm chart, free 12-seat tier. Happy to provide further logs or traces if useful.
