# Events, issues and triage

> How errors are grouped into issues, statuses, search, filters, assignment and archiving.

An **event** is one error report from your app. An **issue** is every event with the same cause, grouped together — a bug that fired 3,000 times is one issue with 3,000 events. You triage issues, not events.

## How errors are grouped

Your node computes a fingerprint for each event:

- **With a stack trace:** the exception type plus up to 30 of the newest in-app frames — each frame's module or file name and function name. Line and column numbers are not used, so an issue survives small code changes.
- **Without a stack trace:** the exception type and its message, or the message alone.
- Before comparing, volatile parts are normalised: UUIDs, emails, IP addresses, long numbers and hex strings, temporary paths and URL query strings. `User 123 not found` and `User 456 not found` become one issue.

The grouping version (currently `belvador:2026-10`) is stored on every issue. A future version applies to new events only; existing issues are never regrouped.

### Your own grouping

Set a fingerprint when the default groups too much or too little:

```ts
import { captureException, withScope } from "@belvador/browser";

withScope((scope) => {
  // All failures of one payment provider become one issue.
  scope.setFingerprint(["payment-provider-down", provider]);
  captureException(error);
});
```

Include `"{{ default }}"` in the list to refine the default grouping instead of replacing it.

## Statuses

| Status | Meaning |
|---|---|
| **Unresolved** | Needs attention. Sub-states: **New**, **Ongoing**, **Escalating**, **Regressed** |
| **Resolved** | Fixed. A newer event brings it back as **Regressed** |
| **Archived** | Hidden on purpose, until a condition you chose — or forever |

An issue is **Escalating** when it had at least 10 events in the last 60 minutes and at least five times its hourly average over the 7 days before. Events are counted as they arrive, so a job that reports every retried attempt reaches that threshold sooner than one that reports only its final failure ([retries](https://belvador.dev/en/docs/monitors/setup#retries)).

Issues also carry a **Priority**: High, Medium or Low.

## Actions

Open the action menu on an issue, or select several in the list (up to 100 at once):

| Action | Effect |
|---|---|
| **Resolve now** | Marks it fixed. Any later event reopens it as Regressed. |
| **Resolve in next release** | Reopens only when the error appears in a newer release than the one you were on — use it when the fix is deployed later. Needs `release` set in the SDK. |
| **Unresolve** | Back to Unresolved. |
| **Archive** | **Until it escalates**, **Until 100 more events**, **Until 10 more users are affected**, **For 24 hours**, **For 7 days** or **Forever**. When the condition is met, the issue returns. |
| **Assign to me** / assign to a member / **Unassign** | Who is looking at it. Viewers cannot be assigned. |
| **Priority** | High, Medium or Low. |

Members, admins and owners can change issues; viewers can only read them.

## Find issues

The search box (press **/** to focus it) matches plain text in issue titles, culprits, messages, exception values and stack traces, ignoring case. An issue's short ID — such as `WEB-1Z` — opens that issue directly.

There is no query language: words like `is:unresolved` or `tag:browser` are searched as text. Use the filters instead:

| Filter | Values |
|---|---|
| Projects | One, several or all |
| Status | Unresolved (default), Resolved, Archived |
| Level | Fatal, Error, Warning, Info, Debug |
| Priority | High, Medium, Low |
| Environment | Any environment the node has seen |
| Assignee | Anyone, Me, Unassigned, a member |
| Period | 1 hour, 24 hours (default), 7, 14 or 30 days |
| Sort | Last seen (default), First seen, Events, Users, Priority |

Filters live in the page address, so you can bookmark or share a view. Over long periods, searching inside event bodies can stop early to stay fast; titles are always fully searched, and the page says when that happens.

## Issue details

- **Stack trace** — choose **In-app**, **All frames** or **Raw**. Frames from minified code are marked **Minified** until [source maps](https://belvador.dev/en/docs/source-maps) resolve them.
- **Breadcrumbs** — steps before the error, if your SDK records them.
- **Tags** and **Contexts** — what your app and the SDK attached, after scrubbing.
- **Attachments** — always downloadable. PNG, JPEG, GIF and WebP files, recognised from their bytes, can also be previewed; SVG and every other type are download-only, never opened in the page.

Everything in an event was sent by an app and is shown as plain text — links from event data open through a warning page.
