Troubleshooting
Troubleshooting
Common failure modes and how to fix them: auth, integrations, AI features, performance.
This page is a triage list. Find the symptom, jump to the fix. If you don't see your issue, contact support with your workspace's slug and a short repro.
Authentication & access
"Redirected to /login despite signing in"
- Browser blocks third-party cookies. ProductOS uses a same-origin cookie, but some extensions still strip it, disable strict tracking-prevention for productos.ca.
- Session expired silently. Hard-refresh (
Ctrl+Shift+R) to force a session refresh.
"401 unauthorized on API calls that worked yesterday"
- Token rotated (someone hit "Revoke" on the token in Settings → API Tokens). Issue a new one.
- Token auto-revoked because the owner was demoted below the token's stored role, re-issue from a higher-role member.
"403 forbidden, but my token used to work"
There are no per-endpoint scope strings. A token runs at the workspace role it was issued with (commenter by default), and every write route checks that role: a commenter token calling POST gets a 403 naming the missing capability. Demoting the issuer below the token's role revokes the token outright, which shows up as a 401 rather than a 403. Either re-promote the user or have an admin re-issue the token at the role you need.
Integrations
"GitHub PR doesn't link to my feature"
- ProductOS doesn't scan PR titles or bodies for sequence IDs. A PR is linked to a feature either by a Claude Code session (matched on the branch name the session was dispatched with) or by attaching the PR URL to the feature yourself.
- The repo must be in the GitHub App's install scope. Re-check Settings → Integrations → GitHub for the included repo list.
- Webhook handler failures are recorded on the installation: the GitHub App card in Settings → Integrations shows the last error under the connection.
"Intercom conversations not syncing"
- Confirm the access token still works. Re-enter the token via Settings → Integrations → Intercom → Connect & test; the test calls Intercom's
/meand should come back with the admin's name and email; if it fails, generate a new access token in Intercom and save it. - Check the Tag option. Only conversations carrying that tag are imported (default
feedback; empty means everything), and each run pulls at most Max pages per sync × 50 conversations. Widen the tag or raise the page cap under Configure, then Sync now; rows are dedup'd on the Intercom conversation ID, so re-syncs don't duplicate.
"Linear status sync skips some transitions"
Linear sync is poll-based: a feature's status is re-mapped from the issue's workflow state on each sync, and there is no in-app way to register Linear's webhook yet, so changes arrive on the next run. Trigger one from Settings → Integrations → Linear → Sync now (it pulls up to Max pages per sync × 50 issues and updates existing features by Linear issue ID).
AI features
"Copilot chat says 'No API key configured. Add your Anthropic API key in Settings → AI.'"
You haven't saved your own key, and no hosted key covers the call. See Bring your own Anthropic key.
"AI features ran fine yesterday but error today"
Anthropic key rate-limited or rotated:
- Check Settings → AI: is a key saved at all, and is it the one you expect? The field shows the saved key masked, with a show/hide toggle.
- Hit a small test (the copilot chat input) and read the error in the toast; it carries Anthropic's message.
- If the message mentions a rate limit (a 429 from Anthropic), your Anthropic account hit a tier limit, wait or upgrade your Anthropic plan.
- If it says the key is invalid (a 401 from Anthropic), the key was rotated or revoked on Anthropic's side. Re-paste in ProductOS.
"AI theme suggestions look wrong"
ProductSense's Suggest missing links check proposes theme links from the titles and descriptions it can see; rows that are just a title get weak matches. Run Polish descriptions from ProductSense cleanup first, then re-run Suggest missing links. The embedding-based POST /api/ai/cluster-themes endpoint groups feedback by cosine similarity instead (default threshold 0.62, tunable in the request body) and is reachable only from an in-app session, not with API tokens.
Performance
"List endpoint feels slow on a large workspace"
- Add filters.
?status=newis much faster than no filter. - Use the export endpoint for full-dataset pulls. See Pagination.
- Pagination past
offset=10kis slow by design, paginate by filter, not deep offset.
"Dashboard slow to load"
- Trash old
wont-do/addressedfeedback you no longer need; rows in Trash are excluded from lists and counts. - ProductSense's Polish descriptions check flags near-duplicate rows; merging them shrinks the working set.
Data integrity
"Feedback I trashed isn't in Trash"
Trashed rows stay in Trash until someone restores them or an admin/owner clicks Delete permanently; there is no automatic purge. If a row isn't there, it was permanently deleted. Settings → Audit Log (entity type feedback) shows who did it.
"Sequence ID I expected (FEAT-000123) doesn't exist"
Sequence IDs are issued at row creation and never reused: even after hard delete. If FEAT-000123 doesn't exist, the row was either hard-deleted or never created. Filter Settings → Audit Log by entity type features to confirm.
Contact support
Email support@productos.ca, or use the in-app feedback button (⌘/ / Ctrl+/). Include:
- Your workspace slug (shown under Settings → Workspace)
- A short repro (steps to reproduce)
- The
error.codeanderror.messagefrom any API error response you've seen
Next
- FAQ: the questions that come up before you have a specific problem.