> ## Documentation Index
> Fetch the complete documentation index at: https://docs.testdino.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting Playwright Errors in TestDino

> Fix the most common TestDino errors: streaming, tokens, CI checks, sign-in, API tokens, rate limits, integrations, and plan limits.

Find the symptom in the Quick Reference table, then expand the matching section for the fix.

## Quick Reference

| Symptom                                  | Area         | Fix                                                       |
| :--------------------------------------- | :----------- | :-------------------------------------------------------- |
| `Token is required but not provided`     | Streaming    | [Token errors](#token-errors)                             |
| `Invalid API key or unauthorized access` | Streaming    | [Token errors](#token-errors)                             |
| Run never appears in the dashboard       | Streaming    | [Runs not appearing](#runs-not-appearing)                 |
| Sharded run shows partial results        | CI           | [Sharded runs not grouping](#ci-and-pull-request-errors)  |
| No check or comment on the pull request  | CI           | [GitHub checks and comments](#github-checks-and-comments) |
| CI check fails with a high pass rate     | CI           | [GitHub checks and comments](#github-checks-and-comments) |
| Run has no environment label             | CI           | [Environment label missing](#environment-label-missing)   |
| Cannot sign in with SSO                  | Access       | [SSO sign-in failures](#sso-sign-in-failures)             |
| Password login refused                   | Access       | [SSO sign-in failures](#sso-sign-in-failures)             |
| Cannot invite, or change a role          | Access       | [Permission errors](#permission-errors)                   |
| `401 UNAUTHORIZED`                       | API          | [API token and scope errors](#api-token-and-scope-errors) |
| `429 RATE_LIMIT_EXCEEDED`                | API          | [API rate limits](#api-rate-limits)                       |
| Slack alerts not arriving                | Integrations | [Slack alerts missing](#slack-alerts-missing)             |
| MCP server or tool errors                | Integrations | [MCP errors](#mcp-errors)                                 |
| `Execution limit reached`                | Plan         | [Plan and seat limits](#plan-and-seat-limits)             |

## Streaming and result errors

`@testdino/playwright` streams results as your tests run. Most failures to see a run are a token or a config problem.

<AccordionGroup>
  <Accordion title="Token errors" icon="key">
    TestDino authenticates with the `TESTDINO_TOKEN` environment variable. The streaming API key comes from **Project Settings → API Keys**.

    Confirm the token is set, then run with debug output:

    ```bash theme={null}
    echo $TESTDINO_TOKEN
    npx tdpw test -t "$TESTDINO_TOKEN" --server-url https://reporter.testdino.com --debug
    ```

    `Token is required but not provided` means the variable is unset or empty. Export it, or pass `-t` directly.

    `Invalid API key or unauthorized access` means the token is wrong, expired, revoked, or scoped to a different project.

    To fix this:

    * Generate a fresh key and confirm it belongs to the project you are streaming to.
    * In CI, store tokens as secrets, never hardcode them.
    * Secret names are case-sensitive: a secret saved as `TestDino_Token` will not resolve as `TESTDINO_TOKEN`.
    * See [API Keys](/guides/generate-api-keys) for creating and scoping keys.
  </Accordion>

  <Accordion title="Runs not appearing" icon="ghost">
    Tests run but no run shows in the dashboard. Work through these in order:

    1. **Reporter not added.** Confirm `@testdino/playwright` is in the `reporter` array in your Playwright config.
    2. **Token not set.** Confirm `TESTDINO_TOKEN` is set in the environment that runs the tests.
    3. **Wrong project.** A token without access to this project streams the run elsewhere. Confirm the token matches the project you are viewing.
    4. **Debug check.** Re-run with `npx tdpw test --debug` to see the exact stream target and any errors.

    ```bash theme={null}
    npx tdpw test -t "$TESTDINO_TOKEN" --server-url https://reporter.testdino.com --debug
    ```

    The FAQ walks through this case in more detail under [Why are my streamed runs not appearing?](/faqs#why-are-my-streamed-runs-not-appearing).
  </Accordion>
</AccordionGroup>

## CI and pull request errors

These appear once tests run inside a pipeline: shards do not group into one run, or the result never links to a pull request.

<AccordionGroup>
  <Accordion title="Sharded runs not grouping" icon="object-group">
    Each shard streams its own run, so the dashboard shows several partial runs instead of one. Pass the same `--ci-run-id` to every shard so TestDino groups them into a single run:

    ```bash theme={null}
    npx tdpw test -t "$TESTDINO_TOKEN" --server-url https://reporter.testdino.com --ci-run-id "$CI_RUN_ID" --shard=1/3
    ```

    Key requirements:

    * Every shard must use the same `--ci-run-id` value for the run.
    * Derive the ID from a stable per-run CI value (for example, the workflow run ID), not a per-shard value.
    * The exact variable to use is provider-specific, so follow the sharding section in your [CI provider guide](/guides/ci-setup-overview).
  </Accordion>

  <Accordion title="GitHub checks and comments" icon="code-pull-request">
    A pull request shows no TestDino check or comment even though the run streamed. Both depend on TestDino linking the run to a commit and the connected repository.

    Common causes:

    * **GitHub Checks is off.** Enable it in the CI Checks tab. See [GitHub status checks](/guides/github-status-checks#troubleshooting).
    * **Comments toggle is off.** Enable comments in **Settings → Integrations → GitHub**.
    * **No commit SHA.** Run tests inside CI so git context is captured automatically.
    * **Repository mismatch.** The TestDino project must be connected to the same repo the PR lives in.
    * **App not installed.** The GitHub App must be installed with access to the repository.

    A check can also fail while the pass rate looks high when a **mandatory tag** test fails: that overrides the pass rate. The FAQ covers this under [Why might a TestDino CI Check fail even if my pass rate looks high?](/faqs#why-might-a-testdino-ci-check-fail-even-if-my-pass-rate-looks-high). For repo connection and comment settings, see the [GitHub integration](/integrations/ci-cd/github#troubleshooting) guide.
  </Accordion>

  <Accordion title="Environment label missing" icon="tag">
    A run appears without an environment label and drops out of environment-filtered views. The branch matched no mapping pattern. The usual cause is a regex mistake:

    * **Unanchored**: `dev` matches any branch that contains "dev". Anchor it: `^dev/`.
    * **Too broad**: `.*` or `.+` matches every branch and overrides your specific rules.
    * **Invalid regex**: an unclosed bracket or a bad escape never matches.

    Test patterns on [regex101.com](https://regex101.com/) before saving, and add a catch-all rule for branches outside your naming convention. See [Environment mapping](/guides/environment-mapping) for the full pattern reference.
  </Accordion>
</AccordionGroup>

## Sign-in and access errors

These errors block users from signing in or performing actions within the organization. Most stem from SSO configuration issues or insufficient role permissions.

<AccordionGroup>
  <Accordion title="SSO sign-in failures" icon="right-to-bracket">
    SSO errors trace to a mismatch between your identity provider and the values saved in TestDino. The most common ones:

    | Error                                       | Cause                                            | Fix                                                                                                                          |
    | :------------------------------------------ | :----------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- |
    | `redirect_uri must be a Login redirect URI` | Callback URL does not match the organization key | Set the IdP redirect URI to exactly `…/sso/<your-org-key>/callback` on `api.testdino.com`, not `app`, with no trailing slash |
    | `Policy evaluation failed`                  | No access policy, or the user is not assigned    | Add an access policy and rule on the default auth server, then assign the user                                               |
    | Password login refused                      | SSO enforcement is on for that email domain      | Sign in with SSO, or remove the domain from enforcement                                                                      |
    | No Single Sign-On tab                       | Not an admin, or the org is not SSO-entitled     | Get admin access, or contact support to enable SSO                                                                           |

    For the full setup and OIDC troubleshooting, see [Single Sign-On](/platform/organizations/single-sign-on#troubleshooting).
  </Accordion>

  <Accordion title="Permission errors" icon="user-lock">
    Permissions are organization-level, so a blocked action usually means your role is too low, not a bug. Common cases:

    * **Cannot invite a member.** Only Owners and Administrators can invite. The org may also be at its member limit for the plan.
    * **Cannot change a role.** You can only assign roles at or below your own. Administrators cannot grant the Owner role or change their own role.
    * **Cannot delete a run or test case.** Members cannot delete; Viewers are read-only.
    * **Cannot manage an integration.** Project-level integrations (GitHub, GitLab, Slack, monday, Azure DevOps) need Owner or Administrator.
    * **Cannot manage billing.** Only Owners and Billing Managers can change a subscription.

    See the permission matrix and each case in [Users, Roles & Permissions](/platform/organizations/users-roles#troubleshooting).
  </Accordion>
</AccordionGroup>

## API errors

These come from the Public API and the MCP server, which both use the `td_pat_` Personal Access Token. Authentication, scope, and rate limits are the usual causes.

<AccordionGroup>
  <Accordion title="API token and scope errors" icon="lock">
    | Status | Code            | Cause                                                 | Fix                                                                                                |
    | :----- | :-------------- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------- |
    | 401    | `UNAUTHORIZED`  | Header missing, wrong prefix, or token not recognized | Send `Authorization: Bearer td_pat_...` with one space. Re-issue the token if it was rotated       |
    | 401    | `TOKEN_REVOKED` | The token was revoked                                 | Generate a new PAT in **User Settings → Personal Access Tokens**                                   |
    | 401    | `TOKEN_EXPIRED` | The token passed its expiry date                      | Generate a new PAT and update your stored secret                                                   |
    | 404    | `NOT_FOUND`     | Resource missing, or not visible to the token         | Verify the ID and that the token covers that project. Confirm a run ID exists with `list_testruns` |

    The full error table is in [API conventions](/api-reference/conventions#errors), and the auth setup is in the [API quickstart](/api-reference/quickstart#troubleshooting).
  </Accordion>

  <Accordion title="API rate limits" icon="gauge-high">
    A `429 RATE_LIMIT_EXCEEDED` means you crossed a per-token window:

    ```json theme={null}
    { "success": false, "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Too many requests" } }
    ```

    | Scope                     | Limit                 |
    | :------------------------ | :-------------------- |
    | Per token                 | 100 requests / minute |
    | Per IP before auth        | 200 requests / minute |
    | PDF generation, per token | 1 request / minute    |

    Read `RateLimit-Reset` from the response headers and wait that many seconds, or back off exponentially. See [Rate limits](/api-reference/conventions#rate-limits) for the full header reference.
  </Accordion>
</AccordionGroup>

## Integration errors

Slack and MCP each have their own connection and configuration failures. These accordions cover the top symptoms and link to the full guides.

<AccordionGroup>
  <Accordion title="Slack alerts missing" icon="slack">
    No TestDino messages arrive in Slack. Check the connection and channel setup:

    * **App not connected, or no default channel.** Verify the connection in **Settings → Integrations → Slack** and set a default channel. Use the **Test** button to send a sample.
    * **Private channel not listed.** Add the TestDino app to the channel first (channel name → Integrations → Add an App), then click **Refresh** in Slack settings.
    * **Messages in the wrong channel.** Check the environment-to-channel mapping. Unmapped environments fall back to the default channel.
    * **Annotation alerts silent.** The test needs a `testdino:notify-slack` annotation with a mapped target, and annotation alerts fire only on failure.

    Each case is detailed in [Slack alerts](/integrations/slack-playwright-test-alerts#troubleshooting).
  </Accordion>

  <Accordion title="MCP errors" icon="plug">
    The MCP server has its own setup, authentication, and network failures, with a dedicated page. The categories:

    * **Installation**: `npm ERR! 404 Not Found`, `command not found: testdino-mcp`.
    * **Editor integration**: the server does not appear in Claude Code, Cursor, or Claude Desktop.
    * **Authentication**: `health` returns "Invalid token" or "No projects found".
    * **Network**: `ECONNREFUSED`, timeouts, or a 429 from the server.

    Each category and its fix is in [MCP troubleshooting](/mcp/troubleshooting).
  </Accordion>
</AccordionGroup>

## Plan and seat limits

When the organization reaches a plan limit, tests still run locally but TestDino stops accepting new data. Two limits apply.

`Execution limit reached` is the monthly test-run quota, shared across all projects in your organization. New results pause until you upgrade the plan or the quota resets on your billing date.

To manage this:

* Open **Billing & Usage** to see how much of your monthly quota is used.
* Upgrade your plan if you consistently hit the limit, or wait for the reset date. See [Billing & Usage](/platform/billing-and-usage/overview).

`User limit reached` is the seat cap for new members. A new SSO sign-in is blocked when you're at the limit. However, existing members signing in again are never blocked.

**Fix:** Free a seat by removing an inactive member, or upgrade your plan. See [Billing & Usage](/platform/billing-and-usage/overview) to review your plan and usage.

## Other setup gaps

* **Commit, branch, or author blank.** TestDino reads git metadata from the repository, so run tests inside an initialized git repo.
* **Run tags missing from a run.** Tags are never rejected, only cleaned up: TestDino keeps the first 50 tags, trims each to 100 characters, strips control characters, and drops duplicates and empty values.
* **Errors on an old runtime.** `@testdino/playwright` needs Node.js 18+ and `@playwright/test` 1.52+.

## Get help

Still stuck? Collect this before contacting support, so the team can reproduce it without a back-and-forth:

* The **Run ID** or dashboard URL of the affected run.
* The **package version**: `@testdino/playwright` version from your lockfile.
* The **framework and runtime**: Playwright version, Node.js version.
* The **full error and stack trace**.
* The **CI logs** with tokens and credentials redacted.
* The **`--debug` output** from `npx tdpw test --debug`.

Reach the team at [support@testdino.com](mailto:support@testdino.com) or on [Discord](https://discord.gg/hGY9kqSm58). See [Support](/support) for hours and response times.

## Related

<CardGroup cols={2}>
  <Card title="Node.js Reporter" icon="node-js" href="/cli/testdino-playwright-nodejs">
    Upload flags, reporter config, and CLI commands for the Node.js CLI.
  </Card>

  <Card title="Generate API Keys" icon="key" href="/guides/generate-api-keys">
    Create and scope the token the CLI and API use.
  </Card>

  <Card title="CI Setup Overview" icon="infinity" href="/guides/ci-setup-overview">
    Per-provider pipeline guides with sharding and artifact handling.
  </Card>
</CardGroup>
