Epure
Guide

Switch from Sentry to Epure and keep the Sentry SDK

The switch is a DSN change plus three sample rates. This guide gives the diffs for @sentry/nextjs, @sentry/node and Python sentry-sdk, the staging check, the rollback, and the list of what stays behind in Sentry.

An indigo connection arches between two sockets, while a small tab marks a reversible route.
Editorial illustration
On this pageShow
  1. Can you switch from Sentry and keep the Sentry SDK?
  2. How do you switch @sentry/nextjs to Epure?
  3. How do you switch @sentry/node or Python sentry-sdk to Epure?
  4. Should you set tracesSampleRate to 0 after switching?
  5. How do you confirm the switch worked in staging?
  6. What does not move from Sentry to Epure?
  7. How do you roll back from Epure to Sentry?
  8. When should you stay on Sentry instead?
  9. What does Epure cost once you switch?
  10. Questions
The switch in six steps, each with its check

1. Copy the Epure DSN

Do
Create a project, open its Client Keys settings, copy the DSN
Confirm
Shape: https://<public-key>@app.epure.sh/<project-id>
If it fails
404 project_not_found means the number after the last slash is wrong

2. Replace the DSN

Do
Put the Epure DSN in every Sentry.init, or in SENTRY_DSN and NEXT_PUBLIC_SENTRY_DSN
Confirm
SDK requests go to app.epure.sh/api/<project-id>/envelope/
If it fails
Requests still reach ingest.sentry.io: rebuild the browser bundle, remove tunnelRoute

3. Turn off performance data

Do
tracesSampleRate 0, remove the replay and profiling integrations
Confirm
Only error envelopes leave the app
If it fails
Harmless if missed: Epure answers 202 and stores nothing

4. Send one staging error

Do
Throw a named test error from the staging deploy
Confirm
202 response, then one issue under Staging
If it fails
Read the response code, then the verify-ingest guide

5. Recreate alerts

Do
Add Slack, Discord, Telegram, email or a signed webhook
Confirm
The next new issue posts once
If it fails
Sentry alert rules do not import; set them again

6. Keep a rollback

Do
Keep the old Sentry DSN and project untouched
Confirm
Restoring the old value and redeploying sends to Sentry again
If it fails
Browser values are fixed at build time: rebuild, not just restart
DimensionDoConfirmIf it fails
1. Copy the Epure DSNCreate a project, open its Client Keys settings, copy the DSNShape: https://<public-key>@app.epure.sh/<project-id>404 project_not_found means the number after the last slash is wrong
2. Replace the DSNPut the Epure DSN in every Sentry.init, or in SENTRY_DSN and NEXT_PUBLIC_SENTRY_DSNSDK requests go to app.epure.sh/api/<project-id>/envelope/Requests still reach ingest.sentry.io: rebuild the browser bundle, remove tunnelRoute
3. Turn off performance datatracesSampleRate 0, remove the replay and profiling integrationsOnly error envelopes leave the appHarmless if missed: Epure answers 202 and stores nothing
4. Send one staging errorThrow a named test error from the staging deploy202 response, then one issue under StagingRead the response code, then the verify-ingest guide
5. Recreate alertsAdd Slack, Discord, Telegram, email or a signed webhookThe next new issue posts onceSentry alert rules do not import; set them again
6. Keep a rollbackKeep the old Sentry DSN and project untouchedRestoring the old value and redeploying sends to Sentry againBrowser values are fixed at build time: rebuild, not just restart

Status codes and paths from the Epure v0.2.0 ingest route (crates/server/src/routes/ingest.rs), checked 6 Nov 2026. Self-hosted: replace app.epure.sh with your own host.

A typical case: a Next.js app with @sentry/nextjs installed by Sentry's wizard, one founder, and a Sentry plan whose only used tab is Issues. The DSN sits in three Sentry.init calls, tracesSampleRate is 0.1, and replay records 10% of sessions. Moving that app to Epure takes one deploy to staging, one test error, and one deploy to production. The code you wrote around Sentry, such as captureException calls, beforeSend and tags, stays as it is.

Can you switch from Sentry and keep the Sentry SDK?

Epure error tracking accepts the Sentry SDK you already run, so switching from Sentry means pointing the DSN at Epure and leaving the package in place. Epure answers on the same paths the SDK already calls, /api/<project-id>/envelope/ and the older /api/<project-id>/store/, and authenticates with the public key in the DSN. The engine's test suite posts 102 envelopes from 22 SDK fixture families, raw and gzip, and checks that each one is accepted and stored. There is no Epure SDK to install.

The fixtures cover the packages most small SaaS teams use: @sentry/nextjs from 7.120.0 to 11.10.0, @sentry/node and @sentry/browser from 6.19.7 to 11.10.0, and Python sentry-sdk from 1.0.0 to 2.73.0. The full table, with Go, Ruby, PHP, Java and .NET, is on the Sentry SDK compatibility matrix. Epure is not alone here. GlitchTip and Bugsink also accept Sentry SDKs; our Epure vs GlitchTip and Epure vs Bugsink pages compare them line by line.

How do you switch @sentry/nextjs to Epure?

A @sentry/nextjs app keeps its DSN in three Sentry.init calls: instrumentation-client.ts (older setups use sentry.client.config.ts), sentry.server.config.ts and sentry.edge.config.ts, as Sentry's Next.js manual setup shows. Sentry's samples write the DSN into each file as a string. Move it into two environment variables, set the environment name, turn tracing down to 0, and delete tunnelRoute from next.config.ts:

  // instrumentation-client.ts
  Sentry.init({
-   dsn: "https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
-   tracesSampleRate: 0.1,
-   replaysSessionSampleRate: 0.1,
-   replaysOnErrorSampleRate: 1.0,
-   integrations: [Sentry.replayIntegration()],
+   dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
+   environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
+   tracesSampleRate: 0,
  });

  // sentry.server.config.ts and sentry.edge.config.ts
  Sentry.init({
-   dsn: "https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
-   tracesSampleRate: 0.1,
+   dsn: process.env.SENTRY_DSN,
+   tracesSampleRate: 0,
  });

  // next.config.ts
  export default withSentryConfig(nextConfig, {
-   tunnelRoute: "/sentry-tunnel",
  });

  # .env.staging (or your host's environment settings)
+ SENTRY_DSN=https://<public-key>@app.epure.sh/<project-id>
+ NEXT_PUBLIC_SENTRY_DSN=https://<public-key>@app.epure.sh/<project-id>
+ SENTRY_ENVIRONMENT=staging
+ NEXT_PUBLIC_SENTRY_ENVIRONMENT=staging

The tunnelRoute line matters. In its default rewrite mode, Sentry documents that the tunnel "works only with Sentry SaaS DSNs" (Next.js build options, checked 6 Nov 2026), so browser errors would keep flowing to Sentry. NEXT_PUBLIC_SENTRY_DSN is inlined into the client bundle at next build (Next.js docs), so changing it needs a rebuild. NEXT_PUBLIC_SENTRY_ENVIRONMENT is a name you define and pass in yourself.

Set the environment on purpose. In Epure v0.2.0 the Issues view shows one environment at a time, Production, Staging or Local, and matches the event's environment value exactly. Left unset, the @sentry/nextjs server SDK uses SENTRY_ENVIRONMENT, then the Vercel environment, then NODE_ENV (SDK source, checked 6 Nov 2026). Server errors from next dev then arrive as development and Vercel previews as preview, and neither appears under those three filters. Use production, staging or local.

How do you switch @sentry/node or Python sentry-sdk to Epure?

A server on @sentry/node or Python sentry-sdk usually needs no code change at all. Both SDKs read SENTRY_DSN and SENTRY_ENVIRONMENT from the process environment when init gets no value, as Sentry's Node options and Python options pages list. Python defaults the environment to production. Change the variable, restart the process, and the next exception goes to Epure. If the DSN is written in code, edit it there:

  // instrument.js (@sentry/node), loaded before the app
  Sentry.init({
-   dsn: "https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
-   tracesSampleRate: 1.0,
+   dsn: process.env.SENTRY_DSN, // https://<public-key>@app.epure.sh/<project-id>
+   environment: "production",
+   tracesSampleRate: 0,
  });

  # settings.py or app startup (Python sentry-sdk)
  sentry_sdk.init(
-     dsn="https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
-     traces_sample_rate=1.0,
-     profiles_sample_rate=1.0,
+     dsn=os.environ["SENTRY_DSN"],
+     environment="production",
+     traces_sample_rate=0.0,
  )

Short-lived processes need one more line. A CLI script, a queue job or a serverless function can exit before the SDK sends its queue; call Sentry.flush() in Node or sentry_sdk.flush() in Python before exit. Go, Ruby, PHP, Java and .NET follow the same pattern: swap the DSN and keep the package. Their pages are under platform setup.

Should you set tracesSampleRate to 0 after switching?

Epure error tracking keeps errors and drops performance data, so tracesSampleRate: 0 (Python: traces_sample_rate=0.0) saves your users the upload. The engine's envelope parser treats transaction, replay_event, profile, profile_chunk and statsd items as non-error items: an envelope that holds only those gets 202 Accepted and nothing is stored. Logs sent with enableLogs are dropped the same way, so the SDK spends bandwidth on data nobody reads.

Some items do keep working. Sentry Crons check-ins become Epure cron monitors, within your plan's monitor limit. User feedback from feedbackIntegration() is stored, and an SDK fingerprint you set yourself is respected. If you want to stay on Sentry and only cut the performance bill, our guide to turning off Sentry tracing, replay and profiling covers that without any switch.

How do you confirm the switch worked in staging?

Confirm the Epure switch with one named error from the deployed staging build, not from your laptop. Throw it, then check two things: the SDK request got 202 Accepted with an id in the body, and one issue appeared in the project with the Staging filter selected. Ingest accepts first and groups right after, so the issue can lag the response by a moment. Sending the same error again raises that issue's count instead of creating a second row.

// Any route or button in the staging build
Sentry.captureException(new Error("Epure switch check: staging"));

// Network tab, request to app.epure.sh/api/<project-id>/envelope/
// HTTP/1.1 202 Accepted
// {"id":"<event-uuid>"}

Any other status names its cause: 401 invalid_dsn for a wrong key, 403 dsn_revoked for a rotated one, 404 project_not_found for a wrong project number. A 202 with an empty Issues view usually means the environment filter. Each case, with its check and fix, is in event sent but no issue in Epure. For minified JavaScript, upload source maps for the same release and check a readable frame (source maps); Epure symbolicates JS and TS only, other languages show raw frames.

What does not move from Sentry to Epure?

A DSN change moves new errors only. Epure has no importer, so everything Sentry already holds stays in Sentry, and some Sentry features have no Epure equivalent. Write this list down before the production deploy and keep your Sentry account readable until you no longer need its history.

  • Issue history. Past issues, counts and comments stay in Sentry. Epure starts from the first event after the switch.
  • Alert rules and integrations. Recreate them. Epure alerts on a new issue, a regression or a velocity spike, to Slack, Discord, Telegram, email or signed webhooks (how Epure alerts work).
  • Tracing, replay, profiling and logs. Not stored. If you open them during incidents, keep Sentry for them.
  • Grouping. Epure computes its own fingerprints, so one Sentry issue can map to one or several Epure issues. Merge and split fix it by hand; an SDK fingerprint pins it.
  • Mobile and native symbolication. Not supported. iOS, Android and native frames stay unsymbolicated.
  • Seer and Sentry's hosted AI. Not replaced. Epure gives your coding agent the issue through MCP or the CLI instead (connect Claude Code or Cursor).
  • SSO. Not available. Sign-in is password, magic link, Google or GitHub, with TOTP two-factor.

How do you roll back from Epure to Sentry?

Rolling back from Epure to Sentry is the same edit in reverse, which is why step 6 says to keep the old project. Restore the previous SENTRY_DSN and NEXT_PUBLIC_SENTRY_DSN values, put back tunnelRoute and any sample rates you removed, then rebuild and redeploy. A restart alone is not enough for the browser bundle, because its DSN was fixed at build time. Confirm with one error that arrives in Sentry.

A DSN change sends to one place at a time; it never copies events to both. To compare the two side by side, run staging on Epure and production on Sentry for a week, then move production. That costs nothing extra, because Sentry keeps receiving production errors during the overlap.

When should you stay on Sentry instead?

Sentry stays the better tool when errors are not the whole job. If you read traces to find a slow endpoint or ship a mobile app that needs dSYM or ProGuard symbolication, Epure has neither. Sentry's grouping has had many more years of tuning than ours, and Seer runs inside its product with no extra wiring. Epure also has no SSO, so a team that requires single sign-on should not switch. The line-by-line comparison is on Epure vs Sentry.

What does Epure cost once you switch?

Epure Cloud Pro costs $29 a month for 200,000 events with unlimited seats, billed monthly, and never bills overage automatically. Past the quota, every occurrence is still counted and the first event of each new or regressed issue is still stored, up to a grace of 5% of the quota. A new Cloud workspace starts with a 14-day trial on Pro limits, no card. Self-hosting is free under AGPL-3.0. Plans are on Epure pricing; the Sentry cost calculator compares a month at your volume.

Questions

Do I need an Epure SDK or npm package to switch from Sentry?
No. Epure error tracking reads events from the official Sentry SDKs, so you keep @sentry/nextjs, @sentry/node, sentry-sdk or whichever package you run. The packages @epure-sh/cli and @epure-sh/mcp exist for your coding agent, not for sending errors. The only required change is the DSN.
Can I send errors to Sentry and Epure at the same time?
Not with a DSN change: one Sentry.init sends to one DSN. The simple way to compare is an overlap week, with staging on Epure and production still on Sentry. Once the staging issues look right and alerts stay quiet, move production and keep the Sentry project for rollback.
Will my Sentry issue history move to Epure?
No. Epure has no importer for Sentry issues, comments or alert rules, so history stays in Sentry and Epure starts with the first event after the switch. Keep read access to Sentry until you no longer need the old issues, then close the account.
Does Epure group errors the same way Sentry does?
No. Epure computes its own fingerprint from the exception and its throw site, so a Sentry issue can become one or several Epure issues. You can merge or split issues in the dashboard, and a fingerprint set in the SDK is respected as is.
Is there a Sentry alternative that uses the Sentry SDK?
Yes, several. Epure, GlitchTip and Bugsink all accept events from the official Sentry SDKs, so switching is a DSN change for each. They differ on price, hosting and noise handling; our comparisons put them side by side with check dates.