Sentry vs Airbrake: An Error Monitoring comparison for 2026

Stanley Ulili
Updated on October 21, 2026

Sentry and Airbrake both help you monitor application errors, but they differ in how much information they provide when something breaks. Sentry combines error tracking with distributed tracing, logs, session replay, profiling, and AI-assisted debugging. Airbrake focuses on error monitoring and application performance, giving you error reports, request timings, and route-level statistics without a broader observability platform to configure.

I tested both tools on the same Node.js bookstore application, introducing backend exceptions, failed requests, and recurring bugs to see how accurately they captured, grouped, and explained problems.

Both platforms detected every backend error I introduced, but their grouping results were very different. Sentry correctly separated two unrelated TypeError crashes, while Airbrake combined them into one issue containing 23 occurrences. That meant two separate bugs appeared as a single problem in Airbrake's dashboard.

Sentry also made debugging easier by displaying the failing source code, linking errors to traces and logs, and providing more detailed release tracking. Airbrake had its own advantages, particularly its straightforward setup, built-in route performance monitoring, and error rates displayed directly on individual error pages.

I also tested Sentry's browser monitoring and a deliberately faulty release that introduced a major checkout slowdown. Those scenarios weren't run through Airbrake, so I distinguish the results from the features I could compare directly.

This hands-on comparison covers setup, error capture, debugging, grouping, search and triage, session replay, release tracking, performance, logs, alerts, AI-assisted debugging, and pricing, with screenshots and results from my October 2026 tests.

Sentry vs Airbrake: Results at a glance

Each verdict below reflects one Express backend with a small storefront, configured my way, so your stack may shift a row or two.

Area Better in my test Why
Setup Sentry No card for the trial, and one project took every signal
Error capture Sentry, narrowly Both caught every server bug; Sentry labelled crashes and kept the rejection's frames
Debugging Sentry Inline source, a breadcrumb timeline and errors linked across browser and server
Error grouping Sentry Kept the two TypeErrors apart; Airbrake merged them
Event counts Mixed Sentry dropped repeated events; Airbrake showed no drops but had no logs to check against
Search and triage Sentry Typed queries, owners, priority and archive rules
Session replay and web vitals Sentry Replay and web vitals worked; Airbrake: not tested
Release tracking Sentry Only the resolved bug reopened, with a clear label
Performance Sentry Traces found the slow query; Airbrake gave route percentiles only
Profiling Sentry Found the hot function; Airbrake doesn't offer profiling
Logs and metrics Sentry Both built in; Airbrake has neither
Uptime and alerts Sentry on alerts Rule builder fired as set; uptime not tested in either
AI-assisted debugging Not compared Seer tested; no AI feature found in Airbrake
Starting price Sentry Free Developer plan; Airbrake starts at $19 a month with a card

How I tested Sentry and Airbrake

My test app, monitoring-lab, sells books through an Express and SQLite API, with a Vite storefront in front. It also runs a fake price service that answers slowly or fails, plus a sales report job that runs every minute.

Every bug has a known cause, so I could tell when a tool pointed at the wrong thing.

The planted problems fell into five groups:

  • Server crashes: a TypeError reading title on a missing book, a TypeError reading discount on an unknown coupon, and an unhandled promise rejection from a recommendations call.
  • Handled server errors: an out-of-stock error reported on purpose, a 503 from the price service, and the sales report job, whose message changes on every run.
  • Browser errors: the wishlist button throws, and several storefront fetches fail with 404, 500 or 502.
  • Slow paths: a CPU-heavy search, a slow price lookup and, later, a slow checkout query.
  • Release problems: a resolved bug that ships again unfixed, and a new payment error from a bad release.

Three fake customers named alice, bob and carol shopped through a traffic script, some over the API and some in headless Chromium.

The three releases

Release What I tested
1.0.0 Setup, capture, grouping, stack traces, breadcrumbs, search, triage, route performance, traces, logs and alerts
1.1.0 The coupon crash resolved and then shipped again without a fix
1.2.0 A bad release with a slow checkout query and a payment error on every fifth payment; Sentry only

Release 1.2.0 is the hard one. It brings a new exception that error trackers can see, plus a checkout slowdown that raises nothing.

A tool that only watches exceptions sees half of that release. I ran 1.2.0 and the browser storefront against Sentry only, so every Airbrake row for them reads "Not tested".

SDKs and test limitations

Platform SDKs
Sentry, server @sentry/node and @sentry/profiling-node 11.8.0
Sentry, browser @sentry/browser 11.8.0 with tracing and replay
Airbrake, server @airbrake/node 2.1.9

Keep these limits in mind as you read:

  • Both tools ran on trials. Sentry gave me a 14-day Business trial, and Airbrake gave me 30 days once a card was on file.
  • Airbrake covered the server through release 1.1.0. Its browser notifier, session features and release 1.2.0 weren't part of my test.
  • Event counts come from separate traffic runs. The traffic was random, so the totals in one tool aren't comparable one to one with the other's.
  • My repository has a single commit. Any feature that blames a commit, such as Sentry's suspect commits, has nothing useful to point at here.
  • Only Node.js and Express were tested. Grouping, breadcrumbs and tracing can behave differently in other languages.
  • Some features weren't tested. I didn't connect any chat or ticket integration, and I didn't test uptime monitors in either tool.

Setup and onboarding

Setup decides how fast you see your first error and how many decisions stand between you and it.

Sentry took longer to configure and gave back far more. Airbrake was quick to wire up, but it wanted a card first.

Sentry: No card, and a coding agent offered first

Sentry started a Business trial without asking for payment details. Its onboarding opens with an option to let a coding agent install the SDK for you:

Sentry onboarding recommending setup through a coding agent

The agent path is marked "Recommended", with Claude Code, Codex, Cursor and Grok as choices. I took the manual route so I could see each step.

The next screen asks you to connect a repository:

Sentry onboarding step asking to connect your code

Skipping this step with "Continue without a repo" is allowed, but Seer won't run later and releases show zero commits. Stack traces still showed source lines, because the Node SDK read the files from disk.

The product picker also lists what stays free once the trial ends:

Sentry product picker with free volumes after the trial

Error monitoring, logs, tracing, profiling and application metrics each carry their own free volume, which tells you early how the bill is built.

When I created a second project later, Sentry spotted the GitHub repository on its own and suggested both platforms for it. One project accepted both SDKs, so browser and server errors landed in one list.

The setup snippet already held the DSN and switched on errors, logs, metrics, tracing and profiling. Profiling needs one extra package, @sentry/profiling-node.

Airbrake: A card before the trial, then very little to configure

Airbrake wouldn't activate the account until I added payment details:

Airbrake activation form asking for a password and card details

The form reads "Create a password and add payment information to finish your Airbrake account activation", with card fields right under the password. If your company needs approval for every card entered into a vendor form, this step can hold you up for days.

After activation, Airbrake creates an empty project called "First project". My data went to a project I named Monitoring, so the first one stayed at zero errors for the whole test.

The Express middleware gave me errors and route performance with nothing else to set. There's no product picker, because errors and performance are the only things Airbrake collects.

What each SDK gives you out of the box

How I wired each SDK is my own choice, so the fair question is what each one offers before you write extra code.

SDK feature Sentry Airbrake
Express error capture ✔: handler after routes ✔: middleware before and after routes
User on each error ✔: setUser call ✘: add it to context yourself
Breadcrumbs ✔: addBreadcrumb call ✘: no breadcrumb call in the Node notifier
Custom spans ✔: startSpan call ✘: route timings only
Logs and metrics ✔: logger and metrics calls ✘: not offered
Profiling ✔: extra package ✘: not offered
Release value ✔: set in init ✔: version in context, deploys sent separately

Airbrake's Node notifier has no breadcrumb or user call, so I sent both as plain data on each error. That choice is why they show up as JSON later in this article.

Setup comparison

Area Sentry Airbrake
Card for the trial ✘: not needed ✔: required
Trial length 14 days 30 days
Onboarding Coding agent or manual steps Notifier snippet
Browser and server One project for both Server only in my test
Default signals All five signal types Errors plus route timings
Amount to configure More Less

Verdict: Sentry. A trial without a card and one project for every signal outweigh Airbrake's shorter setup. Airbrake is quicker to wire into an Express app, but you can't try it until finance approves the card.

Error capture

Both tools caught every server bug I planted. The difference was in what they recorded about each one.

Sentry: Every bug, with crashes marked

Sentry's issue list held one issue per planted server bug:

Sentry issues list with six server issues

The title crash and the discount crash sit on separate rows, and four rows carry the red "Unhandled" label. Rows for the out-of-stock error and the failing job stay unlabelled, since my own code sent those two deliberately.

Once the storefront reported too, browser errors joined the same project:

Sentry issues list with browser and server issues together

The list grew to 11 issues, with the wishlist TypeError and the failed fetches next to the server crashes. Browser rows also carry a replay counter, which reads "▷ 7" for the wishlist crash.

The broken cover image created no issue at all. It only surfaced as a 404 in a session replay's network list, which I cover later.

The unhandled promise rejection arrived with its mechanism named:

Sentry unhandled promise rejection with its mechanism and source line

Its tag reads auto.node.onunhandledrejection, and the frame server.js:144:9 in loadRecommendations shows the code on line 144.

One detail on this event didn't add up. The user panel showed only the IP ::1, while the tag drawer listed bob@example.com, so check the raw event before you trust user attribution on a rejection.

Airbrake: Every bug, with less to tell them apart

Airbrake received every server bug, but crashes and deliberate reports look the same. My out-of-stock error, which my code reported by hand, carries severity "error" like the crashes, and nothing marks either kind.

Manual notices also lose their route:

Airbrake parameters on a manually reported out-of-stock error

Context shows "route": "UNKNOWN", and my custom fields are mixed alphabetically into notifier data such as os and process. The email field sits below the fold, with quantity last of all.

The promise rejection arrived with much less than Sentry gave me:

Airbrake unhandled rejection with a single backtrace frame

Airbrake titled it "Recommendation engine timed out for user anonymous" and kept one frame, server.js:144:9 in loadRecommendations. It carried no request context and no sign that nothing caught it.

The route table also listed /broken-promise with 0 errors, so the rejection wasn't tied back to the request that triggered it.

Error capture comparison

Test Sentry Airbrake
Server crashes Captured Captured
Handled errors Captured Captured
Unhandled promise rejection Captured with mechanism Captured, one frame
Handled vs unhandled ✔: red Unhandled label ✘: no distinction
Route on manual reports ✔: kept ✘: shows UNKNOWN
Browser errors Captured in the same project Not tested
Broken image ✘: no issue, seen in replay only Not tested

Verdict: Sentry, narrowly. Both caught every server bug. Sentry told me which ones crashed the request, and it kept enough of the rejection to follow it.

Debugging an error

A captured error only helps if the page explains what happened. I compared stack traces, breadcrumbs, user details and the links between related errors.

Stack traces: Sentry showed the code, Airbrake showed a path

Sentry showed the crashing line with the code around it:

Sentry stack trace with inline source and collapsed framework frames

The app frame at server.js:81:45 opens with eleven lines of code around it, and the failing line is highlighted. Eight Express frames sit collapsed under "Hide 8 frames", so the one frame you care about stands alone.

Airbrake pointed at the same line with no code:

Airbrake backtrace with a file path and no source lines

The top frame is a file:/// path ending in server.js:81:45, followed by nine router frames, and clicking a frame does nothing. The reason sits inside the raw JSON as sourceMapErrors: "unsupported URL scheme file".

Airbrake fetches source remotely and can't read local file paths. With source served over HTTP or uploaded maps, it may show code, but my setup never got that far.

Browser source maps in Sentry

Sentry also mapped the minified storefront back to its source after I uploaded maps with sentry-cli:

Sentry browser error with a source-mapped frame

Line 122 of pages.js is highlighted, the wishlist.items.push call that fails, so the minified bundle never gets in your way. Airbrake's browser notifier wasn't part of my test.

My checkout code drops two breadcrumbs on the way to the coupon crash, and Sentry drew them as a timeline:

Sentry breadcrumb timeline before the coupon crash

"checkout started {bookId: 1, coupon: BLACKFRIDAY, quantity: 1}" sits a millisecond before the exception, so the bad coupon is visible before you open the code.

In the browser, Sentry recorded breadcrumbs without any code from me:

Sentry browser error header with automatic breadcrumbs

The fetch and the click, recorded with its CSS selector, sit just above my own wishlist breadcrumb and the exception. Seer's sidebar on this page was still waiting for setup.

Airbrake kept the same server breadcrumbs as a parameter:

Airbrake breadcrumbs stored as raw JSON in parameters

Both entries are there, with coupon "FREEBOOKS" in the first, but you have to expand "+ Parameters" and read pretty-printed JSON. No breadcrumb panel appeared for Node events, even though Airbrake's plan page lists breadcrumbs as a feature.

Who hit the error, and how often

Sentry shows the user as a tag and in a User context panel, and my out-of-stock details got their own panel with bookId 7 and quantity 1. Airbrake put the user email inside the raw Context JSON and in Aggregations, with no labelled field.

Airbrake answers one question Sentry doesn't, on the error page itself:

Airbrake error overview with the route error rate

The ROUTE field puts the failure share at 11.76% across 85 checkout requests. You learn how widespread the bug is before you click anything else.

Sentry's issue page answers with links to related data:

Sentry issue page with related logs, trace preview and request body

The log line "POST /checkout failed", a trace preview with the db.query span and the request body all sit on the same page as the stack trace.

From the browser error to the server error

Sentry connected a failed checkout in the browser to the server crash behind it:

Sentry browser ApiError linked to the backend TypeError in the same trace

The browser ApiError for the failed checkout lists one more issue in its trace, and that issue is the discount TypeError. The server issue links back the same way.

The trace itself runs through both sides:

Sentry trace from a browser click to a database query

The click "place order", the browser's http.client request, the server's http.server span, the handler and the db.query span form one trace of 12 spans. Airbrake wasn't tested for this, and it offers no tracing to link errors with.

Debugging comparison

Capability Sentry Airbrake
Server source lines ✔: 11 lines inline ✘: path and line only in my setup
Framework frames ✔: collapsed by default Listed in full
Browser source maps ✔: worked after upload Not tested
Breadcrumbs ✔: timeline, automatic in the browser ✘: JSON inside parameters
User details ✔: tag and User panel ✘: raw Context JSON
Route error rate on the error ✘: not shown ✔: 11.76% from 85 requests
Related logs and trace ✔: on the issue page ✘: not available
Browser error linked to server error ✔: same trace Not tested

Verdict: Sentry. Inline source, readable breadcrumbs and the link from browser to server made each investigation shorter. Airbrake's route error rate is a useful extra that Sentry doesn't match.

Error grouping

Grouping decides whether one row in your inbox means one bug. It can fail by merging different bugs into one row, or by splitting one bug across several.

My test caught each tool making one of those mistakes.

Diagram of two TypeErrors kept apart in Sentry and merged in Airbrake

The diagram shows the opening finding: two different crashes became two Sentry issues and one Airbrake group.

Airbrake merged two crashes by their message

Airbrake normalizes error messages into a pattern. Both crashes became "Cannot read properties of undefined (reading {})", so they shared one group of 23.

The Aggregations tab is where the second bug shows up:

Airbrake Aggregations showing two message params inside one group

Message params split 13 title and 10 discount, and the Files and Routes breakdowns repeat that split across /books/:id and /checkout. Six known bugs became five groups.

The group title also follows the latest occurrence, so the same row switches between the title and discount messages depending on timing.

Resolving the coupon crash resolved the book crash too, because they share a row. I found no split, unmerge or merge action anywhere in Airbrake's interface.

The same pattern logic worked in Airbrake's favor on the sales report job. Each run fails with a different message, and messagePattern "Sales report run {} failed: {}" kept every run in one group.

Sentry kept them apart, then split two bugs after a code change

Sentry kept the title and discount crashes in separate issues in every run I made. The sales report job also stayed in one issue.

Release 1.2.0 changed the checkout code path, and that changed Sentry's result:

Sentry issues after release 1.2.0 with duplicate groups

A second "TypeError reading 'discount'" and a second out-of-stock issue sit next to the originals. The new checkout stack made them look new to Sentry, so two old bugs now take four rows.

The new payment error stayed in one issue across different charge amounts, with 13 events. A browser group moved the other way: the ApiError for a failed checkout now carries the payment message, because Sentry groups it by browser stack and both failures come from the same fetch.

Sentry lets you fold the duplicates back together with merge in the bulk bar. Airbrake wasn't tested on 1.2.0, so I can't say how it would have grouped the changed code.

Sentry dropped repeated errors before counting them

Counts matter when you rank bugs by how often they happen. Sentry's SDK drops identical errors that arrive back to back, and its Stats page records them:

Sentry Stats showing client discards from the event processor

For one hour, the tooltip counts 54 accepted errors and 9 discarded by the event processor. Across my first run, 12 of 58 request errors never reached an issue.

My app also writes a log line for each failure, and Sentry's logs skip that dedupe step. Comparing the two in one run, the title crash had 14 log lines and 10 events, while discount had 12 log lines and 9 events.

Release 1.1.0 repeated the pattern:

Sentry Stats for release 1.1.0 with nine client discards

The 1.1.0 traffic burst shows 46 accepted and 9 discarded. The logs give the matching picture:

Sentry logs for release 1.1.0 grouped by message

"POST /checkout failed" appears 11 times, against 9 coupon events. Errors with changing messages, such as the 503s and the rejections, matched their log lines one for one.

Airbrake showed no discard counter, and its group counts added up to its dashboard total of 54. I couldn't check them against log lines, because Airbrake has no logs.

Error grouping comparison

Test Sentry Airbrake
Two TypeErrors with the same message pattern ✔: two issues ✘: one merged group
Sales report job with changing messages ✔: one issue ✔: one group via messagePattern
Old bugs after the 1.2.0 code change ✘: two duplicate issues Not tested
Payment error with changing amounts ✔: one issue Not tested
Merge or split controls ✔: merge in the bulk bar ✘: none found
Repeated identical errors ✘: some dropped by the SDK No drops shown
Count check against logs ✔: possible through logs ✘: no logs

Verdict: Sentry. It kept different bugs apart, and its duplicates after 1.2.0 can be merged. Airbrake's merge hid a real bug, and it gave me no tool to undo it.

Airbrake merged two different crashes, and Sentry split two old bugs into duplicates once the checkout code changed. I also sent the same releases to Better Stack through the same Sentry SDK, and its error list avoided both mistakes.

Better Stack error list with browser and backend errors

The title and discount crashes arrive as separate errors, and the coupon crash stayed one error through 1.0.0, 1.1.0 and 1.2.0. The concession: caught browser errors don't appear in this list, because the JavaScript tag, still in beta, has no call for reporting them.

Better Stack payment error page with its source code

The new payment error held 10 exceptions in one group across every charge amount, with the failing line of code right on the page.

Group errors once, across every release

Search, filters and triage

Once errors pile up, you need to find the right ones and decide who handles them.

Sentry gives you a query language and a full set of ownership controls. Airbrake gives you filter chips with useful counts and a single Resolve button.

Search: A typed query against 27 chips

My test question for both tools was to find every checkout error bob hit in development on 1.0.0. Sentry took it as one query:

Sentry search filtered by user, environment, release and URL

Four chips, user.email, environment, release and url is *checkout*, returned two issues, with "1 / 9" and "6 / 15" showing how many events matched in each.

Airbrake has no typed syntax. Typing route:/check came back as "No matching errors to display", because it was read as free text.

Its filters come from a list of keys that opens when you click the search box:

Airbrake search box with its filter suggestions

I counted 27 keys in that list, covering people, versions, routes and message values, and "★ Add custom filters" lets you add your own.

The counts are where the chips pay off:

Airbrake error list filtered to one user

With "User: carol@example.com" applied, the out-of-stock error reads "5 of 16" and the TypeError group "4 of 23". You see how much of each group one person caused without opening anything.

Airbrake's custom aggregations go deeper than the chips. Charting params.breadcrumbs.0.data.coupon broke the merged group down by coupon code, which is how I confirmed the hidden coupon bug.

Triage: Ownership controls against one button

Sentry's Resolve menu lets you tie a fix to a release or a commit:

Sentry Resolve menu with release and commit options

You can mark it fixed in the next release, in the current 1.0.0 release, in any other release, or at a specific commit.

Archive handles noise you want out of the queue until something changes:

Sentry Archive menu with five conditions

Its five choices include archiving until the issue escalates, forever, or until it reaches more users. Sentry also has priority, an assignee field, and merge in the bulk bar.

Airbrake's Resolve has no options at all:

Airbrake error resolved with an Undo toast

One click shows "Error was resolved. Undo", and the button flips to "Unresolve". Nothing asks which release fixed it.

Selecting rows in the list brings up the bulk bar:

Airbrake bulk Resolve and the Comments tab

With two rows ticked, the bar offers "Resolve 2" and nothing else. Comments support Markdown, and each error can be muted or deleted, but there's no assignee, priority, snooze or merge.

Search and triage comparison

Capability Sentry Airbrake
Typed query syntax ✔: field:value ✘: chips only
Filter by user, release and route ✔: supported ✔: supported
Match counts per group ✔: events matched ✔: N of M per group
Custom breakdowns ✔: tags panel ✔: custom aggregations
Resolve options ✔: next release, release or commit ✘: one click
Assign an owner ✔: assignee field ✘: not available
Priority ✔: high, medium, low ✘: not available
Archive or snooze ✔: five conditions ✘: mute only
Bulk actions ✔: resolve, archive, merge, priority ✘: resolve only

Verdict: Sentry. A shared backlog needs owners and priorities, and Airbrake has neither. Airbrake's "N of M" counts are a good touch that Sentry's suggestions don't offer.

Real user monitoring and session replay

Session replay records what a visitor did in the browser, and real user monitoring measures how fast pages felt. Both help when a bug report says "checkout broke" and nothing else.

I tested both in Sentry. Airbrake doesn't list either feature, and its browser notifier wasn't part of my test.

Sentry: A replay with an AI summary

Every browser session was recorded, and each replay opens on an AI summary:

Sentry session replay with its AI summary timeline

The summary gives one paragraph and four timed steps, with the wishlist crash marked in red at 00:04. Every step matched what the session did.

All text is masked with asterisks by default, and an "Unmask non-sensitive text" banner lets you relax that. The header counts dead clicks, rage clicks and errors.

The Network tab caught the one problem no error tracker reported:

Sentry replay Network tab listing every request

Each request shows method, status, path, type, size and duration, and the broken cover image appears as a 404 img request. That row was the only place the missing image ever showed up.

The replay also reached the server side. My storefront sent the replay ID in the baggage header, so the server TypeError carried the shopper's session:

Sentry backend TypeError with the browser replay attached

Alice's replay plays inline on the server crash, above the request body carrying the FREEBOOKS coupon. The click that submitted that coupon is right there, one panel above the stack trace.

Sentry: Web vitals, with a catch for hash routes

Sentry's prebuilt web vitals dashboard filled in without extra setup:

Sentry Web Vitals dashboard with a score of 90

It scored 90 overall. LCP, INP and CLS looked healthy, while a P75 TTFB of 2.51 s stood out, since my server was busy with the CPU-heavy search.

The page breakdown was less useful for my storefront:

Sentry web vitals grouped as Pageload and Navigation

Pages are grouped as "Pageload" and "Navigation", because a hash-routed app names every transaction /. My slow book page can't be singled out here unless you set custom transaction names.

Real user monitoring comparison

Capability Sentry Airbrake
Session replay ✔: every session recorded Not tested, not listed
AI replay summary ✔: accurate in my test Not tested
Network requests in replay ✔: caught the broken image Not tested
Replay on server errors ✔: through the baggage header Not tested
Web vitals ✔: score, LCP, INP, CLS, TTFB Not tested, not listed
Per-route vitals for hash routes ✘: needs custom names Not tested

Verdict: Sentry. Its replay and web vitals worked, and the replay even reached server errors. Airbrake wasn't tested here and doesn't list either feature.

Airbrake had nothing to show for the browser, and Sentry's vitals lumped every hash route into /. I ran the same storefront through Better Stack, and its AI SRE named the slowest route by LCP from a single question.

Better Stack AI SRE ranking routes by LCP

It put /#/orders first, at an LCP p75 of 1948 ms over 8 loads, and traced the delay to server time spent behind the CPU-heavy search. It still missed the slow book page, and that question cost $0.62.

Better Stack session with frontend and backend spans together

The replay's timeline holds 30 frontend spans and 7 backend spans in one view, so a slow click leads straight to the server work behind it.

Replay sessions with their backend traces

Release tracking and regressions

Release tracking should answer two questions: did this deploy add a bug, and did a fixed bug come back?

I resolved the coupon crash on 1.0.0 and then shipped 1.1.0 with the same broken code. A good tool reopens that one bug and leaves the others alone.

Sentry: Releases from the SDK, and only one reopen

Sentry builds releases from the release value in the SDK. When the app restarted on 1.1.0, the new release appeared within seconds, with no deploy command.

The Resolve menu on the coupon issue offered a release-aware option:

Sentry Resolve menu with The next release selected

I picked "The next release", which tells Sentry to expect the fix in a later version. A plain "Resolve" behaves differently: in an earlier run it reopened on the next event, still on 1.0.0.

That earlier reopen looked like this:

Sentry coupon issue regressed within release 1.0.0

The Activity feed reads "Regressed in 1.0.0" above my "Resolved" entry, so a plain resolve is a bet that the bug will never happen again.

After the 1.1.0 traffic, the coupon issue came back on its own:

Sentry coupon issue marked Regressed in 1.1.0

The header shows "Unhandled | Regressed", and Activity records "Regressed in 1.1.0" directly above the resolve. The other five issues, which I'd left open, stayed as they were.

The release tag split shows where the events came from:

Sentry release tag split on the coupon issue

Of the issue's 30 events, 21 came from 1.0.0 and 9 from 1.1.0, so one bug keeps its history across both versions.

The releases list compared the two versions:

Sentry releases list with 1.0.0 and 1.1.0

Release 1.0.0 shows a 90.364% crash-free rate with 6 new issues, and 1.1.0 shows 90% with 0 new issues. Zero is correct, because 1.1.0 only shipped the old bug again.

Each release page breaks its issues into tabs:

Sentry release 1.1.0 overview with issue tabs

Six issues appear under All Issues, with one under Regressed and none under New. Commits and Files Changed show 0, because the repository wasn't linked to the release yet.

The Regressed tab holds only the bug that came back:

Sentry Regressed tab with the coupon issue and failing transactions

The coupon TypeError is the only row. Below it, a failing transactions table ranks checkout first with 30 failures in this release.

One wording quirk showed up in a later run: the activity entry compared 1.1.0 with itself, where it should have named 1.0.0.

Airbrake: Deploys you send, and every group reopened

Airbrake keeps versions and deploys apart. Sending a version on each error doesn't create a deploy, so the Deploys page stays empty until you call its CLI or API.

Project settings hide a default that shaped the whole regression test:

Airbrake project settings with deploy auto-resolve

"Resolve all errors in environment after a deploy" was on by default. When I sent the 1.1.0 deploy, Activity read "Deployed to development (resolving 4 errors)".

None of those four bugs were fixed, so all of them came back within minutes. With the coupon crash I'd resolved myself, all five groups reopened.

The reopened coupon group looked like any other row:

Airbrake TypeError group after the regression

Its occurrence count now reads 46, with 23 of them since the last deploy, and the version shows 1.1.0. Airbrake adds no label, filter or Activity line to mark the group as returned.

The merged group made this worse. To learn which bug had come back, I had to open Aggregations again, where 1.1.0 added 16 title and 7 discount occurrences.

The deploy history recorded both deploys:

Airbrake Deploys list after release 1.1.0

Both deploys are listed with their author and environment, while the fixed and introduced columns hold only dashes. The summary counts "0 Deploys with new errors".

The deploy detail page contradicted the Activity feed:

Airbrake deploy detail with zero fixed and introduced errors

It shows "Fixed errors 0" and "Introduced errors 0" with "Nothing to compare", even though Activity said the deploy resolved four. Both deploys used the same revision, so the compare view had nothing to diff in my test.

Airbrake does give per-version counts inside each group, through Aggregations > Versions, and a Version filter on the list. Both are useful, but neither marks a bug as returned.

Release tracking comparison

Capability Sentry Airbrake
Release created ✔: from the SDK release value ✘: deploy must be sent
Resolve for a later release ✔: next release, release or commit ✘: not available
Auto-resolve on deploy ✘: not done ✔: on by default
What reopened after 1.1.0 ✔: only the resolved coupon issue ✘: all five groups
Regression label ✔: Regressed in header, list and release ✘: count only
New issues per release ✔: correctly 0 for 1.1.0 ✘: both deploy columns empty
Per-version counts ✔: release tag split on each issue ✔: Versions aggregation in each group
Crash-free rate ✔: per release ✘: not available

Verdict: Sentry. Only the bug I resolved came back, and it came back labelled. Airbrake's auto-resolve turned one regression into five, with no label on any of them.

If you want to see how Airbrake's release handling holds up against another error tracker, our Honeybadger vs Airbrake comparison ran the same reopen test.

Performance monitoring

Some bugs never throw. A route gets slower, users wait, and the error inbox stays quiet.

Airbrake measures route timings automatically. Sentry traces each request, so it can show which part of the request took the time.

Airbrake: Apdex and route percentiles with no setup

Airbrake's Performance page filled in from the same middleware that catches errors:

Airbrake Performance overview with Apdex and request totals

Set to one hour, the page scored Apdex 0.92 at a 0.5 s threshold across 270 requests, averaging 239.04 ms per request with 10% failing. It opens on 90 days, so narrow the range first.

The routes table pointed at both slow paths:

Airbrake routes sorted by p95 latency

GET /search at p95 1.90 s and GET /prices/:id at p95 1.70 s are highlighted orange at the top. Each row also carries its error rate, such as 26.53% for GET /books/:id.

Clicking a slow route ended the trail:

Airbrake route detail for GET /search with no breakdown

The mean response time is a dash over an empty bar, and the query list is blank. The Queries and Jobs tabs stayed empty for the whole test.

Two numbers didn't line up either. For one window, the account dashboard put Apdex at 0.82 while the project page said 0.92.

Sentry: Traces that show where the time went

Sentry's trace explorer ranked endpoints by p95:

Sentry trace explorer with p95 per endpoint

GET /prices/:id leads at 3.58 s and GET /search follows at 1.95 s, with the sales report job at 909.96 ms. Airbrake never tracked the job, and its Jobs tab stayed empty.

The routes ranked the same way in both tools:

Route Airbrake p95 Sentry p95 Airbrake p50
Price lookup 1.70 s 3.58 s 1.00 s
Search 1.90 s 1.95 s 1.50 s
Checkout 4.16 ms 4.96 ms 1.44 ms
Book page 3.17 ms 4.23 ms 0.76 ms
Sales report job Not tracked 909.96 ms Not tracked

These numbers come from separate runs against an upstream with random delays, so read them as rankings. They don't show which tool measures more accurately.

The trace for one slow search explained where the time went:

Sentry trace waterfall for a slow search request

Of the 1.99 s request, the search query used 0.23 ms. The time went into the code around the query.

The price lookup told a different story:

Sentry trace for a price lookup with a failing http.client span

The outbound http.client call took 3.54 s of the request and returned "HTTP 503", which points straight at the upstream service.

Sentry: The bad release, caught in one trace

Release 1.2.0 made checkout slow without throwing anything for the slowdown itself. Sentry's trace of a failing checkout showed both problems:

Sentry trace waterfall for a slow 1.2.0 checkout

Most of this 2.26 s request goes to the book lookup query, at 1.79 s, and the payment span that 1.2.0 added fails after 459 ms. Both problems share one screen.

Grouping the same endpoint by release put a date on the regression:

Sentry p95 of POST /checkout grouped by release

Checkout p95 stays in single-digit milliseconds for the first two releases, then reaches 5.93 s on 1.2.0. Airbrake wasn't tested on 1.2.0.

Sentry didn't open a performance issue for any slow route, though. You only find these slowdowns if you go looking or set a metric alert.

Profiling: Sentry found the hot function

Airbrake doesn't offer profiling, so this part is Sentry alone. With @sentry/profiling-node running, the search profile named the expensive code:

Sentry profile of the search request with its hottest frame

One anonymous function at server.js:98:20 took 1.91 s, or 96.23% of the request. That's the CPU-heavy match I planted.

The background job got the same treatment:

Sentry profile of the sales report job

buildReport took 882 ms, 98.7% of the run, so profiling covered work outside HTTP requests too.

Getting there took some hunting. The transaction summary's own Profiles tab came up empty:

Sentry transaction Profiles tab with no profiles detected

It says "No profiles detected", although the trace's own Profiles tab had samples. Continuous profiles didn't feed this view in my run.

The profiling explorer did aggregate across the test window:

Sentry slowest functions across 30 days of profiles

"Slowest Functions" lists buildReport, withSpan and log at the 30-day range. The search handler never appears there, probably because it has no name.

I didn't profile release 1.2.0, because its checkout sleeps on purpose and burns no CPU.

Performance comparison

Capability Sentry Airbrake
Route percentiles ✔: p50, p75, p95, p99 ✔: p50 and p95
Apdex ✘: not on the default views ✔: 0.92 with a configurable T
Error rate per route ✘: not on the trace list ✔: on the routes table
Per-request traces ✔: waterfall with spans ✘: not available
Database and outbound calls ✔: named spans with timing ✘: Queries tab empty
Background job timing ✔: traced and profiled ✘: Jobs tab empty
Bad release slowdown ✔: slow query visible Not tested
Profiling ✔: found the hot function ✘: not offered
Automatic slow-route issue ✘: none raised ✘: none raised

Verdict: Sentry. Airbrake told me which routes were slow with no setup at all. Sentry told me why, down to the query and the function.

Airbrake stopped at a route average, and Sentry's trace held the answer but raised no issue for the slowdown. I sent the same bad release to Better Stack, where the failing payment error opens its own spans in one click from "View related".

Better Stack spans for a failing 1.2.0 checkout

Of this 2.19 s request, the book query took 1.53 s and the payment span 660 ms. The Service column is empty, because the Sentry SDK sets no service name.

Better Stack Live tail filtered to one request's trace

"View logs" jumps into Live tail for the same trace ID, where the slow-query warning and the checkout failure appear together, so the trace and the logs agree on one screen.

Trace a slow request into its logs

Logs and metrics

Logs record what your code was doing between errors, and metrics let you chart business events next to them.

Sentry has both built in. Airbrake has neither, so you'd need a separate tool for this whole section.

Sentry: Structured logs linked to errors and traces

Sentry's Logs explorer held every line my app wrote, with a per-minute chart:

Sentry Logs explorer with an hour of app logs

It held 129 logs in one hour, with severity shown as a colored dot. The sales report job writes one line a minute, "sales report built" or "sales report failed".

Grouping by message gave me the counts I used to check Sentry's error totals:

Sentry logs grouped by message

"order placed" appears 61 times and "POST /checkout failed" 12 times. That 12 is the number that exposed the 3 missing coupon events earlier.

Each log carries attributes such as total, bookId and email, and filtering on them works with one catch:

Sentry logs filtered by message, email and order total

Bob's orders over $50 returned "7 matches of 103 logs", but only with tags[total,number]:>50. A plain total:>50 returned nothing.

Traces hold their own logs, from both sides of the app:

Sentry trace Logs tab with browser and server lines

Lines from the storefront and the API appear in time order, and each failure line links to its error.

Sentry: Metrics for business numbers

My app records each order on a counter and its value on a revenue distribution. Grouping revenue by coupon took a few clicks:

Sentry checkout revenue summed by coupon

Orders with no coupon brought in 2,652.89 of revenue, ahead of SAVE10 at 442.79 and HALFOFF at 118.99.

Logs and metrics comparison

Capability Sentry Airbrake
Structured logs ✔: logger with attributes ✘: not offered
Logs on the error page ✔: inline section ✘: not offered
Logs inside a trace ✔: both sides in order ✘: not offered
Numeric log filters ✔: needs tags syntax ✘: not offered
Counters and distributions ✔: grouped by any attribute ✘: not offered

Verdict: Sentry. You can read the log lines and business numbers behind an error without switching tools. With Airbrake, all of this lives in another product and another bill.

Uptime, alerts and integrations

Alerts decide whether a bug reaches someone, and uptime checks catch an app that stops answering.

I tested one alert rule in Sentry and read Airbrake's notification settings. I didn't test uptime checks or alert delivery to chat in either tool.

Sentry: A rule builder, plus uptime and cron monitors

Sentry's monitor types go beyond errors:

Sentry monitor types including uptime and cron

Metric, Cron, Uptime and Mobile Build monitors sit next to issue alerts. I didn't set up uptime or cron monitors in this test.

The issue alert builder reads like a sentence:

Sentry issue alert rule for upstream errors

When an event arrives, if the issue has more than 5 events in 5 minutes and the exception type is UpstreamError, Sentry emails me.

The rule fired when it should have:

Sentry alert history with two triggers

"Total Triggers 2" matches the two traffic runs that pushed six or more 503s through in five minutes.

Airbrake: Email toggles and integration switches

Airbrake's alerting is mostly per-user email:

Airbrake email notification settings

You pick a digest schedule, "Inbox saver" is on, and per-project columns switch emails for errors, comments, high volume and production only. There's no rule builder, no threshold and no performance or Apdex alert.

Airbrake keeps no record of sent notifications in its interface, which leaves your inbox as the proof.

The integrations page lists two chat tools, six issue trackers and a webhook. The Jira form has one handy option:

Airbrake Jira integration form

A checkbox reopens the Jira ticket whenever a resolved error comes back, so the ticket follows the error. I didn't save or connect it.

PagerDuty, Opsgenie and Linear weren't in Airbrake's list. Sentry's integrations page listed Linear, Slack, Jira, Teams and GitHub, and I didn't connect any of them.

Alerts comparison

Capability Sentry Airbrake
Alert rules ✔: triggers, filters, throttling ✘: email toggles
Rule fired as set ✔: 2 triggers Not tested
Performance alerts ✔: metric monitors ✘: not offered
Uptime monitors ✔: available, not tested ✘: not offered
Cron monitors ✔: available, not tested ✘: not offered
Notification history ✔: alert history ✘: no log in the UI
Ticket reopen on recurrence Not tested ✔: Jira option
On-call tools Not tested ✘: webhook only

Verdict: Sentry. Its rule builder fired exactly when it should, and it offers uptime and cron monitors Airbrake lacks. I didn't test those monitors, so the uptime part of this verdict is about availability only.

AI-assisted debugging

AI features promise to read the error for you and point at the fix. Sentry's Seer was tested here. I found no AI feature anywhere in Airbrake, so this section isn't a head-to-head.

Sentry: Seer needs your repository

Seer won't start without code to read:

Sentry Seer asking for a connected repository

Until a GitHub or GitLab repository is connected, the panel only offers a link to manage repositories.

I connected my GitHub repository and accepted the AI terms:

Sentry Seer settings with one repository connected

One repository is linked, with automation set to "Stop after PR drafted". That setting lets Seer open a pull request on its own, so check it before you connect a production repository.

Seer on the coupon crash: Right in about 15 seconds

"Start Analysis" on the coupon issue streamed its reasoning, then gave a root cause:

Sentry Seer root cause for the coupon TypeError

Seer said the handler reads .discount from a coupon lookup it never validates, which is right. It pointed at line 150, spotted that FREEBOOKS isn't a known code, and cited the files it read.

The plan that followed was sensible:

Sentry Seer fix plan for the coupon crash

It proposes a 400 response for unknown coupons and optional chaining on line 150. I stopped before asking it to write the fix, since that step can open a pull request on the repository.

Starting the plan made Seer assign the issue to me, labelled "due to Seer Suggestion", so it can change who owns an issue.

Seer on the bad release: Right about the error, wrong about the slowdown

On the new payment error from 1.2.0, Seer found the cause in about 20 seconds:

Sentry Seer root cause for the payment error

It found the paymentAttempts counter and the release gate that fails every fifth payment, and named line 172. It explained the error and said nothing about the slow query.

I then asked the Seer Agent chat, in beta, what changed in 1.2.0 and why checkout felt slower:

Sentry Seer Agent answer with a latency chart by release

It answered in 51.1 seconds, with checkout p95 rising from 3.6 ms to 5.93 s. Its tally of new issue groups for 1.2.0 counted the two duplicates as new bugs.

The bottom of the answer got the cause wrong:

Sentry Seer Agent blaming the payment timeout for the slowdown

It blames the upstream payment timeout for the slowdown. In the trace, though, the book query is about four times slower than the payment span.

I followed up by asking which spans had slowed down:

Sentry Seer Agent span table for POST /checkout

"SELECT book for checkout" went from 0.1 ms to 2,640 ms, and Seer still claimed that removing the payment code would restore every span. The query runs before the payment and is slow on its own.

AI comparison

Capability Sentry Airbrake
In-product AI ✔: Seer Autofix and Seer Agent ✘: none found
Needs a repository ✔: yes Not applicable
Root cause on the coupon crash ✔: correct in about 15 s Not applicable
Root cause on the payment error ✔: correct in about 20 s Not applicable
Cause of the 1.2.0 slowdown ✘: blamed the payment code Not applicable
Cost shown ✘: not shown Not applicable
Pricing Add-on, price not listed Not applicable

Verdict: Not compared. Seer read the code well and found both exceptions fast, but it misread the slowdown twice. Airbrake has no AI feature to set against it.

Airbrake had no AI to ask, and Seer blamed the payment code for a slow database query even after a follow-up. Better Stack's AI SRE got that 1.2.0 question too, with no repository connected, and it kept the slowdown and the payment failures as separate causes.

Better Stack AI SRE comparing release 1.2.0 with 1.1.0

It found the median book query on checkout had climbed to 2.6 s, up from 0.13 ms, while other statements held steady, so it cleared the database host. Seer answered faster; this run needed about four minutes and cost $0.49.

Better Stack AI SRE root cause and recommendations

It flagged the payment span as new in 1.2.0, failing on 10 of 48 calls, and treated it as a second cause tied to the payment error. Without the code, it called the payment failure a short timeout when it's a deliberate fifth-payment failure.

Ask AI SRE what your last release broke

Pricing

I took these numbers from each vendor's pricing page on October 26, 2026, and added what my trial accounts showed. Both change often, so confirm them before you buy.

Sentry bundles tracing, logs and replays into each plan and sells Seer separately. An Airbrake price is a package and an error tier added together.

Free plans and trials

Feature Sentry Airbrake
Permanent free plan ✔: Developer ✘: none
Free plan users 1 Not applicable
Free plan errors 5,000 a month Not applicable
Free plan spans 5M a month Not applicable
Free plan replays 50 a month Not applicable
Free plan logs 5 GB a month Not applicable
Trial 14-day Business trial 30 days
Card for the trial ✘: not needed ✔: required at signup

Sentry's trial showed generous quotas next to what I'd used:

Sentry trial usage with product quotas

My whole test used 194 errors against a 1M trial allowance, and every line still cost $0.00. Those trial numbers say nothing about the plan you'd pay for afterwards.

Airbrake's usage page showed its own trial plainly:

Airbrake trial usage and quotas

The page shows 30 trial days left, 0% of the 25K errors and 1% of the 50K performance events used, plus 30 days of error retention.

What the first paid plans include

Feature Sentry Team Airbrake Dev Airbrake Basic
Monthly price $29 $19 $38
Billed annually $26 a month About 10% less About 10% less
Users Not checked 1 Unlimited, 3 teams
Included errors Not checked 25,000 25,000
Error retention Not checked 30 days 30 days
Tracing and logs ✔: included ✘: not offered ✘: not offered
Route performance ✔: through tracing ✔: free APM tier ✔: free APM tier
AI ✘: Seer is an add-on ✘: not offered ✘: not offered

Moving up a tier, Sentry Business is $89 a month, dropping to $80 when paid yearly. Airbrake Pro costs $76 a month with the first error tier.

Airbrake's plan page explains how its prices add up:

Airbrake plan options with Dev, Basic and Pro

Each package price, $0 for Dev, $19 for Basic and $57 for Pro, gets the $19 tier for 25,000 errors added on top. Pro also brings Audit Log and Spike Forgiveness.

What costs extra

Item Sentry Airbrake
More errors Not checked $6.50 per 10,000
AI Seer add-on, price not listed ✘: not offered
Logs and session replay Included in plan quotas ✘: needs another product
Profiling Usage-based ✘: not offered
Audit logs Not checked Pro only
Performance retention Not checked 7 days on my trial

Audit logs are one feature Airbrake keeps behind Pro:

Airbrake audit logs gated behind the Pro plan

The page asks you to upgrade before it shows a single entry, so check which plan holds the features your compliance team needs.

Comparing the actual cost

For one developer, Sentry costs nothing and covers errors, traces, replays and logs. Airbrake's cheapest route is the $19 Dev plan, and you need a card to try it.

For a team, the base prices sit close together: $29 for Sentry Team against $38 for Airbrake Basic. The gap is in what each one covers.

With Airbrake, you'd still pay for a log store, a tracing tool and a session replay product if you want them. Sentry's own catch is the quotas: the free plan holds 50 replays a month, and Seer is priced separately.

If you're mainly weighing Airbrake's price against another error tracker, our BugSnag vs Airbrake comparison breaks down its tiers next to a slider-priced plan.

Verdict: Sentry. It's free to start and covers more for less on a team plan. Airbrake's fixed tiers are easy to budget if errors and route timings are all you need.

Full feature comparison

This table combines everything I observed in the test.

Feature Sentry Airbrake
Card for the trial ✘: not needed ✔: required
Browser and server in one project ✔: one project Server only in my test
Handled vs unhandled label ✔: Unhandled label ✘: no distinction
Unhandled rejection detail ✔: mechanism and frame One frame, no request
Inline server source ✔: from disk ✘: source fetch failed
Browser source maps ✔: worked Not tested
Breadcrumbs ✔: timeline ✘: JSON in parameters
Route error rate on the error ✘: not shown ✔: shown
Browser error linked to server error ✔: same trace Not tested
Two TypeErrors with one message pattern ✔: kept apart ✘: merged
Grouping after a code change ✘: two duplicates in 1.2.0 Not tested
Merge or split ✔: merge ✘: none found
Repeated identical errors ✘: some dropped No drops shown
Typed search ✔: supported ✘: chips only
Owner and priority ✔: supported ✘: not available
Session replay ✔: with AI summary Not tested
Web vitals ✔: dashboard Not tested
Releases without a deploy call ✔: from the SDK ✘: deploy needed
Regression after 1.1.0 ✔: one issue, labelled ✘: five groups, unlabelled
Auto-resolve on deploy ✘: not done ✔: on by default
Route percentiles ✔: p50 to p99 ✔: p50 and p95
Apdex ✘: not on default views ✔: built in
Per-request traces ✔: waterfall ✘: not available
Slow query in 1.2.0 ✔: visible in the trace Not tested
Profiling ✔: continuous ✘: not offered
Logs and metrics ✔: built in ✘: not offered
Alert rule builder ✔: fired as set ✘: email toggles
Uptime and cron monitors ✔: available, not tested ✘: not offered
AI root cause ✔: Seer, needs a repository ✘: none found
Permanent free plan ✔: Developer ✘: none

Which should you choose?

The choice comes down to how much of each investigation you want to do inside the tool.

Choose Sentry if you want the whole story behind each error

Sentry is the better pick when several people share production and need to know why something broke.

In my test, it kept different bugs apart, showed source and breadcrumbs inline, and followed a failed checkout from the browser click to the server crash. Its traces found the slow query in the bad release, and its profiles named the function behind the slow search.

Release tracking was another strength. Only the bug I resolved came back, and it came back labelled in the list, the issue and the release.

The trade-offs are real. Its SDK dropped repeated errors, so issue counts ran low in bursts, and a code change produced duplicate issues. Seer found both exceptions fast and misread the slowdown, and it needs your repository to run at all.

If you're weighing it against another error tracker with replay, our Sentry vs Rollbar comparison ran the same bad release through both.

Choose Airbrake if you want errors and route timings with little to learn

Airbrake fits a small backend team that mainly wants to know when something broke and how often.

It gave me Apdex and route percentiles with no setup beyond the middleware, and every error page carried its route's error rate. Its filter chips and custom aggregations answered "who hit this, and how much" faster than you'd expect from a lean tool.

The limits show up when you need to dig. It merged two different crashes with no way to split them, kept breadcrumbs as raw JSON, and has no traces, logs, replay or profiling.

Its default deploy setting reopened every group after 1.1.0, so switch off "Resolve all errors in environment after a deploy" before you send your first deploy.

Final thoughts

The real decision is where you want the investigation to happen. Airbrake tells you a route is failing and how often, then leaves the why to your editor and your other tools. Sentry keeps going into traces, replays and profiles, but you'll want to check its counts against your logs during bursts.

Both tools saw my two TypeError crashes. Only one of them told me they were two different bugs, and that's the one I'd trust with a busy checkout.