# Sentry vs Raygun: Hands-On Error Tracking Comparison for 2026

Finding out that your application has crashed is only half the job. You still need to understand what went wrong, which users were affected, whether the problem has happened before, and what else was happening when it failed. That's where the differences between Sentry and BugSnag become important.

Both tools handle the essentials well. They capture exceptions, group related errors, preserve debugging context, and help you track application stability. But they approach the investigation differently. **Sentry connects errors to traces, CPU profiles, logs, and application metrics**, while **BugSnag focuses on making individual errors easier to investigate, prioritize, and manage**.

I wanted to see how much those differences matter in practice, so I tested both tools against the same Node.js application. I deliberately introduced six bugs, simulated slow requests, and brought back an error I'd previously marked as fixed.

[ad-logs]

Both tools detected every bug, but the experience of investigating them wasn't identical. Sentry made it easier to identify returning errors and trace performance problems back to specific functions. BugSnag stood out for its focused interface, searchable breadcrumbs, and ability to show related errors from the same user or session.

This comparison walks through what I found, using actual screenshots and results from both platforms, so you can decide which error-monitoring tool fits your application and debugging workflow.


## Where each tool came out ahead

| Task | Stronger in my test | Deciding factor |
|---|---|---|
| Setup | **Sentry** | One project for both sides; Raygun needed two apps and a loading workaround |
| Capturing errors | **Sentry** | Raygun missed the unhandled promise rejection |
| Debugging one error | **Sentry** | Backend source lines and a link from browser errors to backend errors |
| Grouping | **Sentry**, in this test | Raygun split one bug by URL and another by amount |
| Real user monitoring | **Raygun** on page metrics, **Sentry** on replay | Raygun groups pages and requests well; only Sentry records video replays |
| Release tracking | **Sentry** | Releases come from the SDK; Raygun deployments were manual on the trial |
| Performance | **Sentry** | One trace showed the slow query; Raygun's tools missed it |
| AI | Not compared directly | Only Seer was run, with code access; Raygun's AI untested |
| Price | **Sentry** to start, closer at scale | Sentry has a free plan; Raygun starts at $40 a month per product |

## How I tested

My test bed is monitoring-lab, a bookstore built to fail in predictable ways. The server side is Express 5 on SQLite, the shop front is built with Vite, and two helpers misbehave on purpose: a price service that throws 503s and a reporting job that fails every minute. Sentry and Raygun each got a thin adapter on both sides, so their SDKs saw identical failures from identical code.

The planted failures:

- two server crashes, one for a coupon code that doesn't exist and one for a book ID that doesn't exist
- a handled stock error, an upstream 503, a promise nobody catches and the failing job
- a crash on the wishlist button in the shop front, plus storefront requests that fail
- slow paths: one book page, the search endpoint, and a cover image that never loads

Shoppers named alice, bob and carol were simulated by a script, three over the API and two in headless Chromium, across three versions:

| Release | What it tested |
|---|---|
| 1.0.0 | First install, capture from both sides, readable stack traces, breadcrumbs, user monitoring and speed |
| 1.1.0 | A marked-as-fixed coupon crash that ships again unchanged, to see who flags the comeback |
| 1.2.0 | A broken deploy: checkout waits on a slow query, and every fifth card charge fails |

On the Sentry side, I used `@sentry/node` and `@sentry/browser` 11.8.0 in one project. On the Raygun side, I used `raygun` 2.2.10 for the API and `raygun4js` 3.1.4 for the storefront, in two Raygun applications, plus the `raygun-apm` profiler and agent for one APM run.

Keep these conditions in mind:

- **Only Sentry had my GitHub repository connected**, which its AI used to read the code. I didn't test Raygun's AI.
- **Raygun ran on a 14-day trial**, which blocks API tokens. That forced manual source map uploads and manual deployments.
- **Each tool got its own traffic runs**, so event counts aren't comparable one to one.
- **Everything ran on Node.js.** Raygun's APM support in particular differs by language.

## The release that told them apart

The third release broke the shop in two ways. Every fifth payment failed with a new error, and checkout slowed from a few milliseconds to several seconds.

Both tools reported the new error. The slowdown is where they parted. A slow request throws nothing, so only a tool that times requests can see it. Sentry's trace of one checkout showed a single database query taking most of the time. Raygun has the products for this job, but neither caught it: its release comparison called the bad release faster, and its APM profiler can't see SQLite queries at all. You'll find the evidence for each half under release tracking and under performance.

## Setup and error capture

Sentry's setup ran in one project. Project creation detected my GitHub repository, the setup snippet had my DSN filled in, and the browser SDK sent to the same project as the API. One error list held both sides from the first event.

Raygun asks you to split your app. Each part of a system gets its own application, with its own API key and its own error list, so I created `monitoring-lab-api` and `monitoring-lab-web`. Onboarding also takes one product at a time per application. Here's step 3 for the storefront:

![Raygun onboarding step 3, with Crash Reporting received and Real User Monitoring still waiting](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/3a9a6759-70d2-455d-674a-2241b56b5100/public =2244x1388)

Crash Reporting has a green check, while Real User Monitoring still waits for its first data. You can't leave this step until something arrives, so I sent a test error with `curl` to move on.

The browser library then needed a workaround. `raygun4js` reads its settings only when the page's load event fires, and my storefront loads its monitoring code after that event, so nothing was ever sent. Raygun's npm instructions don't warn about this. The fix was to copy what Raygun's CDN snippet does: queue the calls first, then load the library after the page has loaded.

Once data flowed, the two tools disagreed on one error. The backend's unhandled promise rejection, "Recommendation engine timed out", reached Sentry but never reached Raygun, even with uncaught exception reporting switched on. Raygun's API list after the first release shows the other five backend errors:

![Raygun API error groups after the first release](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/80ea8849-b421-413a-a3cc-d0e77e033b00/lg2x =1512x744)

Notice what's missing: there's no row for the timed-out recommendation call. Sentry's single list, by contrast, holds all six backend errors and the browser errors together:

![Sentry issues list after the first release, backend and browser together](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/44303b13-4541-4535-6270-dce045e9c700/public =1512x744)

The cover image that never loads didn't register as an error in either tool.

**Verdict:** Sentry. It caught one more error, and it needed no workaround or second application to cover the whole app.

## Debugging an error

### Stack traces and source maps

Both tools can turn a minified browser stack trace back into your source code, but getting there took very different amounts of work.

In Sentry, the CLI uploads the source maps as part of the build, and the wishlist bug arrived pointing at `pages.js:122:13`, with the failing line highlighted.

In Raygun, uploading maps through the API needs a Personal Access Token, and the trial page for tokens said "Purchase a plan to use this feature". On a trial, you upload each file by hand in the JS Source Map Center, and every upload starts without a label:

![Raygun JS Source Map Center after upload, with every file unlabelled](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a3506607-4462-44fe-b1b4-fc90d5033c00/lg2x =2534x1482)

Each row reads "Please enter resource URL here", so you type the full URL of every file. Built file names change on each build, so you repeat this after every rebuild, and twice my labels ended up swapped between files. Once the labels were right, "Re-process this error for Source Maps" worked straight away:

![Raygun browser error with the source-mapped stack trace](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/d73c0be4-130e-486c-fe1e-426647522c00/lg2x =1512x744)

The frame now reads `pages.js:122`, with lines 119 to 125 and the bug highlighted, the same result Sentry gave automatically.

Backend stack traces differed too. Sentry showed the code around each backend frame. Raygun's backend trace gave the file and line, `server.js:150`, but no code:

![Raygun backend stack trace with no source lines](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/5830670b-f9fe-4873-32ea-dfd420bc7200/md1x =1512x744)

You get one in-app frame and "1 framework frame", so you open your editor to see what line 150 does.

### Breadcrumbs and context

Both tools record what happened before an error, and both did it well. Raygun's browser breadcrumbs were automatic, covering clicks, route changes, requests opening and finishing, and the app's own messages:

![Raygun browser breadcrumbs before an error](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/5896e7d7-b250-4670-d855-e012afe83d00/md2x =1512x744)

On the backend, Raygun's breadcrumbs stayed scoped to one request, "checkout started" then "book found", so you don't see other users' requests mixed in. Sentry did the same, and also kept the request body, such as the coupon code a checkout sent.

### From the browser to the backend

When the shop front can't complete a request, the browser logs one error while the server logs another, the real cause. Sentry ties them together. Its page for the failed browser checkout carried a Trace Preview reading "1 other issue appears in this trace", and that link led to the server's coupon `TypeError`:

![Sentry browser error linked to the backend error in the same trace](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/16a85cf6-9310-4105-0927-1651d8738700/lg2x =1512x744)

One click takes you from the symptom to the cause, and the trace shows every step between them, from the button click to the database query.

Raygun can't do this. The browser error lives in monitoring-lab-web and the backend error in monitoring-lab-api, two lists with nothing linking them, and Raygun Crash Reporting has no tracing to carry the connection across.

**Verdict:** Sentry, by a wide margin. Automatic source maps, backend source lines and the browser-to-backend link all save time on every error. Raygun matches it only on breadcrumbs.

[summary]
<iframe width="100%" class="aspect-video h-auto" src="https://www.youtube.com/embed/7tQ7haFmSXI" title="Explore Traces | Better Stack" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Raygun gave my shop two separate applications that never reference each other. In Better Stack, one visit to the shop appeared as a single timeline, with the recording at the top and 30 browser spans alongside 7 server spans underneath. The server needed no new library: it kept the Sentry SDK and simply sent to a Better Stack DSN.

![Better Stack timeline holding browser and server spans from one visit](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/719b53e1-6b61-4f23-7134-6ae81a884200/md1x =1512x744)

On any server error, the "View related" menu leads to that visitor's recordings, the request's spans and log lines, or an AI investigation, all in the same place.

**[Trace a request from the browser click to the database](https://betterstack.com/tracing)**
[/summary]

## Grouping

Grouping decides whether one bug shows up as one item or many. On this test, the two tools took different approaches, and Raygun split bugs that Sentry kept together.

The first split came from the storefront's failed book loads. They're one bug in one place in the code, triggered with different book IDs. Raygun's browser list made a separate group for each URL:

![Raygun browser error groups with the book load error split by URL](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/bf6de6d2-53c1-4f5a-0577-355ead5de300/orig =1512x744)

Look at the `ApiError` rows: `/books/0`, `/404`, `/99` and `/1234` each have their own group. The orders tracking error, which also has a changing ID in its URL, stayed in one group, so this isn't consistent across errors.

The second split came with the new payment error in the bad release. Its message includes the amount that failed, and Raygun made a group per amount:

![Raygun errors after the bad release, with the payment error split by amount](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f449ecc5-260a-4bb0-c187-b218c0664500/lg2x =1512x744)

"Payment gateway rejected charge of 44 USD" has 8 events and "…of 35.5 USD" has 2, with the same class and the same two-frame stack. Sentry kept this error as one issue across every amount.

Both tools also opened duplicate groups for some old bugs in that release, because the new checkout code changed their stack traces. Sentry opened one extra issue for the coupon bug and one for the out-of-stock error. Raygun opened one for the coupon bug and two for the out-of-stock error.

What this shows is narrow. In my Node.js app, Raygun's grouping included parts of the error message, so URLs and amounts produced new groups. It doesn't prove Raygun groups worse for every language or app, and Raygun lets you customize grouping. If your error messages carry IDs, amounts or URLs, test this before you rely on the counts. In my [Sentry vs Rollbar test](https://betterstack.com/community/comparisons/sentry-vs-rollbar/), the splitting came from changing framework frames rather than messages, which is a reminder that every tool's default breaks somewhere.

**Verdict:** Sentry, in this test. Its default grouping kept each bug in one issue more often, which keeps the list honest without extra configuration.

## Real user monitoring and session replay

Here Raygun brings a dedicated product, and parts of it beat Sentry.

Raygun's Real User Monitoring tracks page loads and the requests each page makes. Its performance view charts load time and Core Web Vitals:

![Raygun RUM performance view with load time and Core Web Vitals](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/d9343e44-1f3d-48b6-6568-7b2b205a6600/lg2x =1512x744)

Below the charts, Raygun ranks pages and requests by view count and speed:

![Raygun most viewed virtual pages and requests](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/8d2e11d4-6849-4e4a-b7ce-2a8e85443300/md1x =1512x744)

Book pages averaged 1.58 s against 285 ms for the home page, and the requests table showed `/search` at 1.49 s and `/prices` at 2.63 s, which are two of the slow paths I built in. Raygun collapses `/books/3` into `/books/*`, so you drill in to find which book is slow, but it still pointed in the right direction.

Sentry's Web Vitals dashboard gave the storefront a score of 90 and a P75 LCP of 92 ms, but my hash-based routes all appeared as `/`, so it grouped pages into page loads and navigations and couldn't single out a slow page without custom names. On per-page speed, Raygun gave the more useful view without extra setup.

Replay is the other half. Raygun's session page shows a user's visit as a timeline of pages and time on each:

![Raygun RUM session timeline for one user](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/9a5b9225-c5a0-4a6a-df9c-f1478bf76d00/lg2x =1512x744)

It tells you where alice went and for how long, with an "Experience: Excellent" label, but you can't watch what she did. Sentry records the session itself. Its replays come with an AI summary of what the user did, and a Network tab with every request:

![Sentry replay Network tab with the failed cover image request](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/f451b14a-bd41-452f-0c1d-cd67e1602a00/lg2x =1512x744)

That tab was the only place either tool showed the broken cover image, as an image request that returned an error. Sentry includes 50 replays a month on every plan and charges for more.

**Verdict:** Raygun for page-level performance at a glance, and its Customers page, which joins each user's sessions and errors, is a nice touch. Sentry for replay, since Raygun has no video replay at all.

## Release tracking and regressions

Each tool finds out about a new version in its own way, and the trial makes Raygun's way harder.

Sentry reads the release name from the SDK, so each new version appears as soon as it sends an event. Raygun also stamps each error with the SDK's version, yet its deployment pages stay empty until something registers a deployment, by API or by hand. With the API locked on the trial, I used the form, and the first save failed:

![Raygun Create deployment returning a 500 error page](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/d474694a-a147-4d78-8d06-0fa2860b2900/lg1x =1512x800)

That attempt had a deployment date chosen with the date picker. The second save worked with only the version filled in.

### When a fixed bug comes back

The test here is simple: mark a bug as fixed for the upcoming version, ship that version with the bug intact, and see what each tool says. I did this with the coupon crash.

Raygun's "Resolve in next version" dialog adds an option Sentry doesn't have:

![Raygun Resolve in next version dialog with the discard option](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/adf3374d-200d-4b29-0618-3ae68da09800/public =1512x800)

"Discard future occurrences until a newer version is released" is ticked by default, so old-version events stop counting once you resolve. Sentry has no such box, though its Resolve options are wider, covering the upcoming release, any named release or a single commit.

Each tool brought the coupon crash back, and nothing else, as soon as the unchanged version sent it. Sentry flags the comeback on the list itself:

![Sentry list row for the coupon crash with the Regressed flag](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/3e26bfe8-954e-439c-8b4d-05b179926400/md1x =1512x744)

The row says "Regressed", so you spot it while scanning. Raygun's list row just went back to Active. The reopen shows on the error itself:

![Raygun coupon error with the version split and an Error reoccurred entry](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/dc7c9f97-e489-42e1-a3e9-e55df8387d00/orig =1512x744)

The activity feed reads "Error reoccurred", and the version breakdown splits the events 57% on 1.0.0 and 43% on 1.1.0. Raygun's deployment page summarizes the same thing per release:

![Raygun deployment page with one regression](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/842b125a-8f2f-4ff6-7d00-292dfa2d4500/public =1512x744)

Its Regressions tab holds the coupon error, marked "Resolved in 1.0.0" and active again, much like Sentry's release page with its Regressed tab.

For the bad release, Raygun's deployment page listed five new errors, the two payment groups plus three duplicates, while Sentry linked a suspect commit to the new payment error. My repository has a single commit, so that suspect commit couldn't narrow anything down here.

**Verdict:** Sentry. Releases arrive without a manual step, and regressions show in the list. Raygun's deployment pages are good once you feed them, and the discard option is useful, but on a trial, feeding them was manual and fragile.

[summary]
<iframe width="100%" class="aspect-video h-auto" src="https://www.youtube.com/embed/-26mmryojE4" title="Error tracking | Better Stack" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Raygun asked me to register every deployment through a form, and its list still showed the coupon crash as plain Active. Better Stack asked for nothing. It picked up each version from the SDK, and the comeback was impossible to miss, a red "Reoccurred" status on the coupon crash's row:

![Better Stack error list showing the coupon crash as Reoccurred](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a4c8af6b-7733-40f5-93ac-a059feb27800/md1x =1512x744)

Its Releases page filled itself in from the same events, with adoption, error totals and first-seen errors for every version.

**[Spot returning bugs without registering deployments](https://betterstack.com/error-tracking)**
[/summary]

## Performance and APM

This is where the two tools differed most, and where the bad release made the difference visible.

### What Sentry showed

Sentry's tracing measures each stage of a request, starting at the browser click and ending at the database. One checkout trace from the broken version is enough to find the problem:

![Sentry trace of a slow checkout after the bad release](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/a15c5c68-25bd-4b2b-dc08-1234e07cd600/lg1x =1512x744)

Of the request's 2.26 s, the `SELECT book for checkout` query alone used 1.79 s, and a payment step that only exists in this version spent 459 ms before failing. To rule out a single unlucky request, I charted checkout duration per version in Trace Explorer:

![Sentry p95 checkout time by release](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/af60b449-787a-4b5e-37ed-d4a54474ab00/md1x =1512x744)

At the 95th percentile, checkout went from 3.63 ms on 1.1.0 to 5.93 s on 1.2.0, a cliff that lines up exactly with the deploy.

### What Raygun showed

Raygun has two places this slowdown could appear: RUM in the browser and APM on the server.

RUM has a release comparison, and it gave the most surprising result of the test:

![Raygun RUM Compare, 1.1.0 against 1.2.0](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/757fd276-0071-441d-730c-7fc49f77dc00/md2x =1512x744)

"1.2.0 is running 34.8% faster than 1.1.0 in median load time", with median page loads dropping from 28.9 ms to 18.85 ms. That's accurate for full page loads, which didn't slow down. The slowdown was in the checkout request, and Compare doesn't cover requests. RUM's requests table did show `/checkout` averaging 438.95 ms, up from 199 ms, but blended across every version, and the link I tried for filtering by version didn't apply the filter.

APM is Raygun's server-side tracing, and setting it up shows why it's a separate product. It needs the `raygun-apm` profiler in your app plus the Raygun APM Agent running beside it, which I ran in Docker. On macOS, the profiler failed with `EHOSTUNREACH 0.0.0.0:2799` until I set `RAYGUN_AGENT_HOST=127.0.0.1`, which Raygun's Node.js setup page doesn't mention. Once it ran, the overview looked useful:

![Raygun APM overview with Apdex and request speeds](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/bc3c92e3-30b3-402f-fc23-be9d9bc8bb00/md2x =1512x800)

It gave an Apdex of 0.94 and ranked POST /checkout, the price lookups and the search among the slowest requests. The detail underneath was thin:

![Raygun APM slowest tables with empty methods and queries](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/cbcb24cf-acd6-4f6b-54bb-83310b380f00/lg2x =1512x800)

Slowest methods and slowest queries are both empty. Raygun's Node.js APM doesn't support SQLite, so it couldn't have shown my slow query in any release. The only external call it recorded was Raygun's own error upload, while the app's calls to the price service didn't appear. A single trace was just as opaque:

![Raygun APM flame chart for a slow price lookup](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/07116cd5-8dcb-4e65-fc78-673ae7c7ef00/orig =1512x800)

The 5.3 s request is mostly "(idle)" and "(garbage collector)" blocks, with no functions from my code. The profiler hooks Node's `require`, and my app uses ES modules, which likely explains it. The real cause, waiting on the slow price service, shows up only as idle time.

### The APM package broke error reporting

The bigger problem came after. Once `raygun-apm` was installed, crashing errors started arriving in Crash Reporting as "Unknown error", with no message and no stack trace:

![Raygun Crash Reporting showing Unknown error after installing raygun-apm](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/5b265f81-f83e-42bd-77ac-f9b1f3ec7500/md1x =1512x800)

The coupon error and the missing-book error merged into this one empty group, and it kept happening with the profiler switched off. Reading both packages' code explained it. When `raygun-apm` is installed, the Crash Reporting SDK loads a bridge from it that replaces JavaScript's built-in `Error`. From then on, errors that Node itself throws, like `TypeError`, no longer count as errors to the SDK, so it sends them empty. Uninstalling `raygun-apm`, or setting `RAYGUN_APM_CRASH_REPORTING_INTEGRATION=false`, fixed it.

That's why I ran the bad release without APM. It also means APM and Crash Reporting can't safely share a Node.js app with the default settings, at least in these versions.

**Verdict:** Sentry, decisively. Its tracing found the slow query in one view, from the same SDK that reports errors. Raygun's release comparison called the bad release faster, its APM couldn't see my database or my code, and installing it silently broke error reporting.

[summary]
<iframe width="100%" class="aspect-video h-auto" src="https://www.youtube.com/embed/XJv7ON314k4" title="Live Tail Overview | Better Stack" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Tracing with Raygun meant a second npm package, an agent container and a host setting the docs left out, and the traces it produced were mostly idle time. Better Stack reused the Sentry SDK the server already had. From the payment crash, "View spans" showed the failing checkout in full: 2.19 s overall, 1.53 s in the book query and 660 ms in the payment call.

![Better Stack span list for one failing checkout, led by the slow query](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/6e59bd17-1ba1-432a-9a2e-6686c91c5700/lg2x =1512x744)

"View logs" then narrowed Live tail to that single request, where the app's slow-query warning sat right above the failure. Raygun opened a new group for each failed amount, while Better Stack kept all 10 payment failures in one error.

**[See the spans and logs behind every error](https://betterstack.com/log-management)**
[/summary]

## AI

Read this section as a Seer review with a note on Raygun. Seer could read my GitHub code; Raygun's AI never ran, so everything about it comes from Raygun's documentation.

### Sentry Seer

Seer needed roughly 15 seconds on the coupon crash and named the cause correctly: `FREEBOOKS` isn't a known coupon, the lookup returns nothing, and the handler then reads `.discount` off nothing. It suggested refusing unknown codes, which is what I'd do. The payment crash took it a little longer:

![Seer root cause for the new payment error](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/44da54a0-4329-4152-f4e5-f4ee65a86900/md2x =1512x744)

Within about 20 seconds it had located both the version flag that enables the failure and the counter that trips on every fifth charge.

Next I tried Seer Agent, the chat assistant Sentry labels beta, and asked what the broken version changed and why checkout dragged:

![Seer Agent answer about the bad release](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/09de193f-7c19-488d-f929-ea0c6cec7700/public =1512x744)

Its 51-second reply had accurate figures, median checkout up from 1.7 ms to 3.77 s, attached to a mistaken story: it said payment retries caused the delay. Sentry's own trace contradicts that, since the slow query finishes before payment code runs at all. Asking again didn't change its mind. In short, Seer read code well and read performance data less well.

### Raygun

Raygun has two AI options, and I tested neither. AI Error Resolution is a button on each Crash Reporting error group that sends the stack trace and error data to a model. According to Raygun's docs, you bring your own OpenAI or Azure OpenAI key. Raygun also runs a remote MCP server that lets outside assistants such as Claude Code, Cursor or Codex query your errors, sessions, deployments and APM data.

**Verdict:** I can only recommend what I ran, and Seer was accurate on both crashes. Raygun's bring-your-own-key option could suit a team that already pays for a model, so give it a trial on your own errors.

[summary]
<iframe width="100%" class="aspect-video h-auto" src="https://www.youtube.com/embed/n6TtDk8ITgc" title="AI SRE Demo | Better Stack" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Seer had the source code and still pinned the slowdown on the payment code, and Raygun's AI only runs once you plug in your own model key. Better Stack's AI SRE comes with the product, never saw my repository, and answered the same question about the broken version with both causes separated:

- **Why checkout slowed:** the book query's median jumped from 0.13 ms to 2.6 s while the rest of the database stayed around 0.1 ms, which cleared the database server itself.
- **Why payments failed:** a payment step new to that version failed on 10 of 48 calls, and it connected those failures to the new crash.

![Better Stack AI SRE explaining both causes of the broken version](https://imagedelivery.net/xZXo0QFi-1_4Zimer-T0XQ/d67d2cf1-42cc-4c6c-7ae5-c4820e0d0900/md1x =1512x744)

It was slower than Seer at roughly four minutes, and it displayed the run's $0.49 cost. No other AI I tried got both causes right.

**[Let Better Stack AI SRE investigate your next bad deploy](https://betterstack.com/ai-sre)**
[/summary]

## Pricing

I took these figures from Sentry's and Raygun's pricing pages on October 23, 2026, and they can change at any time.

### Free plans and trials

| | Sentry | Raygun |
|---|---|---|
| Free plan | ✔: Developer, 1 user | ✘: none |
| Free plan limits | 5,000 errors, 50 replays, 5M spans, 5 GB logs | Not applicable |
| Trial | 14-day Business trial | 14 days on any plan |
| API tokens on the trial | ✔: available | ✘: Personal Access Tokens need a paid plan |

### What the entry plans include

Raygun prices each product separately, so the fair comparison is Sentry's Team plan against the Raygun products you'd need.

| | Sentry Team | Raygun Crash Reporting Basic | Raygun RUM Basic | Raygun APM Basic |
|---|---|---|---|---|
| Price, billed monthly | $29 | $60 | $120 | $120 |
| Price, billed annually | $26 a month | $40 a month | $80 a month | $80 a month |
| Included volume | 50,000 errors, 5M spans, 50 replays, 5 GB logs | 100,000 errors | 100,000 sessions | 100,000 traces |
| Users | Unlimited | Unlimited | Unlimited | Unlimited |
| Retention | Not published | 180 days | Not published | Not published |

Raygun's Crash Reporting Basic plan also lists 5,000 free RUM sessions and 5,000 free APM traces, so a small app can try all three on one subscription. One step up, Sentry Business costs $89 monthly or $80 on annual billing, and each Raygun Team plan doubles both the Basic price and its volume.

### What costs extra

| Need | Sentry | Raygun |
|---|---|---|
| More errors | Pay-as-you-go budget | $0.001 per error over the plan |
| More sessions or replays | Pay-as-you-go for replays | $0.002 per RUM session |
| Tracing | Included spans, then pay-as-you-go | $0.002 per APM trace, plus an agent to run |
| Logs | 5 GB included, then $0.50 per GB | ✘: not offered |
| Session replay | Included replays, then pay-as-you-go | ✘: not offered |
| Profiling | Pay-as-you-go, from $0.25 per UI profiling hour | Part of APM |
| AI | Seer sold separately, no public price | AI Error Resolution, paying your own OpenAI or Azure OpenAI bill |

For a small team, Sentry is much cheaper to start: free with one user, or $29 a month for errors, tracing, replay and logs together. Raygun's three Basic products together cost $300 a month on monthly billing, or $200 a month billed annually, and it still has no logs or video replay. At high error volumes, Raygun's included 100,000 errors and flat overage narrow the gap, so price your real monthly volumes. Teams that would rather buy errors, logs, uptime checks and on-call from one vendor can read how [Sentry fares against that kind of platform](https://betterstack.com/community/comparisons/better-stack-vs-sentry/), and [how Raygun does](https://betterstack.com/community/comparisons/better-stack-vs-raygun/).

**Verdict:** Sentry for most teams, especially small ones. Raygun's included volumes make more sense at scale, if you only need Crash Reporting.

## Full feature comparison

| Feature | Sentry | Raygun |
|---|---|---|
| Backend and browser in one place | ✔: one project | ✘: one application per part |
| Unhandled promise rejection, Node | ✔: captured | ✘: missed in this test |
| Browser source maps | ✔: CLI upload | ✔: manual upload on the trial, API on paid plans |
| Backend source lines | ✔: shown | ✘: file and line only |
| Breadcrumbs | ✔: browser and request-scoped backend | ✔: browser and request-scoped backend |
| Browser to backend link | ✔: one trace | ✘: separate applications |
| Grouping in this test | One issue per bug, a few duplicates after a code change | Split by URL and by amount, plus duplicates |
| Page performance | ✔: Web Vitals dashboard | ✔: RUM pages, requests and Core Web Vitals |
| Session replay | ✔: video, AI summary, network tab | ✘: session timeline only |
| Releases | ✔: from the SDK | ✔: version from the SDK, deployments by API or form |
| Regression label in the list | ✔: Regressed | ✘: row returns to Active |
| Regression detail | ✔: release Regressed tab | ✔: activity feed, deployment Regressions tab |
| Discard old-version events on resolve | ✘: not offered | ✔: checkbox on resolve |
| Server tracing | ✔: from the same SDK | ✔: APM with a separate agent, no SQLite support |
| Release performance comparison | ✔: p95 by release | ✔: RUM Compare, page loads only |
| Logs | ✔: linked to traces | ✘: not offered |
| AI root cause | ✔: Seer, tested | ✔: AI Error Resolution, bring your own key, not tested |
| MCP server | ✔: exists, untested | ✔: exists, untested |
| Free plan | ✔: 1 user | ✘: 14-day trial only |

## Which one should you pick?

Pick Raygun if you want strong page-level performance monitoring and a clean crash reporter, you're happy to keep your frontend and backend in separate applications, and you don't need video replay or logs. Budget for a paid plan from the start, since the trial's locked API makes source maps and deployments a manual chore. If you're on Node.js, test Raygun APM carefully before you install it next to Crash Reporting.

Pick Sentry if your problems cross the line between browser and server, or if your bad releases tend to get slower before they throw. In this test, only Sentry linked a frontend error to its backend cause and found the query behind the slowdown, and it did both from one SDK in one project. You'll trade some page-level polish in RUM for that, and you'll pay more for replay volume as you grow.

This test ran on Node.js and Express. Raygun's APM support, its grouping and Sentry's profiling all vary by language, so check the docs for your stack before you decide.

## Final thoughts

Raygun gives you three good products that don't talk to each other. Sentry gives you one product where the error, the trace and the replay already point at each other. The choice comes down to whether you'd rather assemble answers or be handed them.

When my worst release shipped, **Raygun called it 34.8% faster**. That one line is worth remembering when you read any tool's release comparison.