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

# Review comments not appearing on pull requests

> Use this guide if Qodo is not posting review comments on your pull requests.

If Qodo is not posting review comments on your pull requests, this guide walks you through the most common causes. Work through the verification steps to rule out each potential cause, or use the table below to jump directly to your symptom.

| Symptom                                                     | Start here                                                                                                                                           |
| :---------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- |
| No webhook deliveries in your Git provider log              | [Verification step 1](#verification-step-1-confirm-the-webhook-is-reaching-qodo): Wrong endpoint URL or event types not configured                   |
| `403 Forbidden` or `401 Unauthorized` in the webhook log    | [Verification step 1](#verification-step-1-confirm-the-webhook-is-reaching-qodo): Webhook secret mismatch or missing                                 |
| Webhook delivers successfully but no review comment appears | [Verification step 2](#verification-step-2-confirm-the-user-is-licensed): User may not have a paid seat or a linked Git account                      |
| Qodo reviews some repositories but not others               | [Verification step 4](#verification-step-4-confirm-the-integration-has-access-to-the-repository): Integration does not have access to the repository |
| Reviews were working before but have stopped                | [Verification step 3](#verification-step-3-confirm-the-integration-has-the-required-permissions): Permissions may have changed                       |
| Bot-created or draft PRs are skipped                        | [Verification step 5](#verification-step-5-additional-reasons-reviews-may-be-skipped): Default behavior. Can be disabled in configuration            |

## Verification steps

<Note>
  **Single-tenant and multi-tenant:** Follow verification steps 1–5. You do not have access to application logs. If you cannot identify the cause, contact [Qodo Support](mailto:support@qodo.ai) with the PR URL and timestamp.

  **On-premises:** Follow verification steps 1–5, then see [Check your logs](#check-your-logs) for additional diagnostics.
</Note>

### Verification step 1: Confirm the webhook is reaching Qodo

If your Git provider is not sending webhook events, Qodo will not process the PR. Check your webhook delivery logs:

* **GitHub**: [Viewing webhook deliveries](https://docs.github.com/en/webhooks/testing-and-troubleshooting-webhooks/viewing-webhook-deliveries). Qodo uses a GitHub App. Navigate to your GitHub App settings to find **Recent Deliveries**.
* **GitLab**: [Webhook logs](https://docs.gitlab.com/user/project/integrations/webhooks/#webhook-logs).
* **Bitbucket**: Qodo uses a Bitbucket Connect App, which does not provide a native webhook delivery log. If you suspect webhooks are not being sent, [contact Qodo Support](https://www.qodo.ai/contact/).
* **Azure DevOps**: [Troubleshoot service hooks](https://learn.microsoft.com/en-us/azure/devops/service-hooks/troubleshoot).

**Interpreting the response:**

| Response                   | Meaning                                                                                                                            |
| :------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| `200 OK` or `202 Accepted` | Webhook received. Continue to Verification step 2.                                                                                 |
| `403 Forbidden`            | Webhook secret mismatch.                                                                                                           |
| `401 Unauthorized`         | Webhook secret missing, mismatched, or could not be retrieved (GitLab and Azure DevOps). Authentication failure (other providers). |
| No deliveries listed       | Wrong endpoint URL or event types not configured.                                                                                  |

If no deliveries are listed, confirm the required event types are enabled:

| Event                | GitHub         | GitLab               | Bitbucket                    | Azure DevOps                    |
| :------------------- | :------------- | :------------------- | :--------------------------- | :------------------------------ |
| PR opened or updated | Pull requests  | Merge request events | Pull request                 | Pull request created or updated |
| Comments or commands | Issue comments | Comments             | Pull request comment created | Pull request commented on       |
| Push to PR branch    | Push           | Push events          | Repository push              | Code pushed                     |

If you see a `403` (GitHub or Bitbucket) or `401` (GitLab or Azure DevOps), verify that a webhook secret is configured and matches your Qodo deployment:

* **GitHub**: GitHub App settings → Webhook secret
* **GitLab**: Webhook settings → Secret token
* **Bitbucket Server**: Webhook settings → Secret
* **Azure DevOps**: Service hook subscription settings → Webhook secret

### Verification step 2: Confirm the user is licensed

Qodo silently skips reviews when either of the following conditions is not met:

* The user must have a paid seat, either as part of a paid team or with an individual license.
* The user must have their Git Cloud account linked in the Qodo portal.

<Note>
  Supported providers and plans: GitHub, Bitbucket, and GitLab Cloud on the Teams plan. Enterprise customers should confirm their Git organization ID has been registered with Qodo.
</Note>

Log in to the [Qodo portal](https://app.qodo.ai/signin) and confirm:

1. Your organization has an active subscription.
2. The PR author is a member of the licensed organization with their Git Cloud account linked.
3. You are not at or over your monthly review limit. If you are, reviews will be skipped until the next billing cycle.

### Verification step 3: Confirm the integration has the required permissions

Qodo requires write access to post comments.

<AccordionGroup>
  <Accordion title="GitHub">
    Go to your GitHub App settings → **Permissions & events**. Confirm:

    * Pull requests: Read & Write
    * Issues: Read & Write
    * Contents: Read
    * Checks: Read & Write (if check run annotations are enabled)

    If you recently updated permissions, your organization may need to re-approve them. Check for a pending approval banner under your organization's **Settings → GitHub Apps**.
  </Accordion>

  <Accordion title="GitLab">
    Confirm the access token or PAT used by Qodo has the following scopes:

    * `api` or `read_api`
    * `write_repository`
    * `write_merge_requests` (if available on your GitLab version)
  </Accordion>

  <Accordion title="Bitbucket Server">
    Confirm the bearer token used by Qodo has:

    * Read and write access to repositories
    * Read and write access to pull requests
  </Accordion>

  <Accordion title="Azure DevOps">
    Confirm the PAT used by Qodo has:

    * Code: Read & Write
    * Pull Request Threads: Read & Write
  </Accordion>
</AccordionGroup>

### Verification step 4: Confirm the integration has access to the repository

<AccordionGroup>
  <Accordion title="GitHub">
    Go to your organization's **Settings → GitHub Apps → Qodo → Configure**.

    Under **Repository access**, confirm the repository is listed, or **All repositories** is selected. Private repositories require explicit access.
  </Accordion>

  <Accordion title="GitLab">
    Confirm the webhook is configured at the correct level: project versus group. If using a group webhook, verify it is set to propagate to subgroups and projects.
  </Accordion>

  <Accordion title="Bitbucket">
    Webhooks on Bitbucket are configured per repository. Confirm the webhook is set up under the correct repository's settings, not just at the workspace level.
  </Accordion>

  <Accordion title="Azure DevOps">
    Service hook subscriptions are project-scoped. Confirm the subscription is configured for the correct project, and that any event filters do not exclude the repository.
  </Accordion>
</AccordionGroup>

### Verification step 5: Additional reasons reviews may be skipped

**PR opened by a bot**

Qodo ignores PRs from bot accounts by default (`ignore_bot_pr = true`) across all supported providers. Detection works by pattern matching on usernames containing `bot-`, `_bot`, or `[bot]`. To disable, set `ignore_bot_pr = false` in your Qodo configuration.

**Draft pull requests**

Qodo skips draft PRs on GitHub and GitLab by default. Set `feedback_on_draft_pr = true` in the relevant config section (`[github_app]` for GitHub, `[gitlab]` for GitLab), or mark the PR as ready for review.

**GitHub only: API rate limit**

GitHub enforces hourly API rate limits. If Qodo has exhausted its rate limit, it will skip processing until the limit resets, typically within an hour. Try opening a new PR or re-triggering a review after an hour.

## Check your logs

<Note>
  On-premises deployments only. Single-tenant and multi-tenant customers should contact [Qodo Support](mailto:support@qodo.ai).
</Note>

Qodo logs are structured JSON. Filter by the PR URL, which is logged as the `api_url` field on every event:

```bash theme={null}
# Filter by PR URL
grep '"api_url"' /path/to/qodo.log | grep 'api.github.com/repos/your-org/your-repo/pulls/123'
```

If you have access to a structured log tool such as Loki, CloudWatch, or Datadog, query by field directly:

```javascript theme={null}
api_url = "https://api.github.com/repos/your-org/your-repo/pulls/123"
```

### Additional log fields

| Field        | Example value                        | Use                                      |
| :----------- | :----------------------------------- | :--------------------------------------- |
| `api_url`    | Varies by provider (see table below) | Isolate a specific PR.                   |
| `git_org`    | `your-org`                           | All events for an organization.          |
| `repo`       | `your-repo`                          | All events for a repository.             |
| `sender`     | `octocat`                            | Events triggered by a specific user.     |
| `request_id` | `abc123`                             | Trace a single webhook event end-to-end. |

### `api_url` format by provider

| Provider         | Format                                                                 |
| :--------------- | :--------------------------------------------------------------------- |
| GitHub Cloud     | `https://api.github.com/repos/<org>/<repo>/pulls/<PR#>`                |
| GitHub Server    | `https://<server>/api/v3/repos/<org>/<repo>/pulls/<PR#>`               |
| GitLab Cloud     | `https://gitlab.com/<org>/<repo>/-/merge_requests/<MR#>`               |
| GitLab Server    | `https://<server>/<org>/<group>/-/merge_requests/<MR#>`                |
| Bitbucket Cloud  | `https://bitbucket.org/<workspace>/<repo>/pull-requests/<PR#>`         |
| Bitbucket Server | `https://<server>/projects/<project>/repos/<repo>/pull-requests/<PR#>` |
| Azure DevOps     | `https://dev.azure.com/<org>/<project>/_git/<repo>/pullrequest/<PR#>`  |

### Log patterns

Once you have the relevant log lines, look for the following:

#### Not licensed or not eligible

```javascript theme={null}
User {username} is not eligible to trigger auto commands for PR
User {username} is not eligible to comment on PR
Monthly invoke count for '{org}' is {count}, above trial max invokes of 30
```

**Solution:** Confirm the organization has an active subscription and the user is a registered member. If the monthly limit is exceeded, upgrade your plan or contact support.

#### Webhook secret or signature failure

```javascript theme={null}
Request signatures didn't match!                  (GitHub, Bitbucket)
Secret mismatch between request and settings      (GitLab)
Secret retrieved does not match stored PAT        (Azure DevOps)
```

**Solution:** Re-sync the webhook secret between your Git provider and your Qodo configuration.

#### Integration not installed on the repository

```javascript theme={null}
PR not found, or PR-Agent app is not installed on the repository
```

**Solution:** Install or configure the integration to cover the repository. See [Verification step 4](#verification-step-4-confirm-the-integration-has-access-to-the-repository).

#### Permission failure

```javascript theme={null}
Error getting permissions
```

**Solution:** Review the required permissions for your Git provider. See [Verification step 3](#verification-step-3-confirm-the-integration-has-the-required-permissions).

#### Rate limit (GitHub)

```javascript theme={null}
Rate limit is too close to the limit, will not proceed
```

**Solution:** Wait for the GitHub API rate limit to reset, typically within one hour.

#### Output suppressed by configuration

```javascript theme={null}
Skipping publish_comment since publish_output is disabled
```

**Solution:** Set `CONFIG.PUBLISH_OUTPUT = true` in your Qodo configuration.

#### Queue workers not running

```javascript theme={null}
CRITICAL: No queue workers available! Webhook events will be REJECTED.
```

**Solution:** Ensure the configured number of queue workers are running and connected to the queue provider (such as Redis).

## Still not working?

Contact [Qodo Support](mailto:support@qodo.ai) with the following:

* The PR URL.
* The date and time the PR was opened.
* Your Git provider: GitHub, GitLab, Bitbucket, or Azure DevOps.
* Your deployment type: single-tenant, multi-tenant, or on-premises.
* Any relevant log lines if self-hosted.
