Sentry-compatible ingestion

Keep your Sentry SDK. Change the DSN.

ZipLogger accepts what Sentry SDKs send: errors, tracing, structured logs and cron check-ins. Swap the DSN for a ZipLogger one and your captureException calls, your tracesSampleRate and your tags keep working as written. The errors then sit next to your logs, traces, metrics and on-call instead of in a separate tool.

Get a DSN Read the setup

One line of config · Same SDK, same calls · Move one service at a time

What carries over

ZipLogger reads the Sentry envelope format that current SDKs send to /api/<project>/envelope/, and the older /store/ endpoint too. Each kind of item goes to the place in ZipLogger that already handles that signal.

What the Sentry SDK sendsWhere it lands in ZipLogger
Errors and captured messages A log line at the event's level: errors at error, captured messages at info unless you pass a level. The stack trace is written the way your language prints it (a Python traceback, a .NET or Java trace, a V8 trace), with the trace id, release and commit attached. An error with an exception is also grouped into an Issue.
Transactions and spans (tracing) Traces: one waterfall per request, with span names, durations, status and HTTP fields named the way OpenTelemetry names them.
Structured logs (Sentry.logger) Log lines, grouped by their message template.
Cron check-ins A log line per check-in. A check-in whose monitor_slug matches a heartbeat also reports that heartbeat’s run, so a missed or failed run opens an incident.
release: "checkout@3f9a2c1" Service checkout, commit 3f9a2c1. That commit is what the git regression engine blames from.
Tags, user, environment Searchable fields: tag.customer_tier, userId, environment. The ZipLogger environment the data lands in comes from the key; the SDK's environment is kept only as a field.

The SDK stays unmodified

The key is read wherever the SDK puts it: the X-Sentry-Auth header, the sentry_key query parameter browser SDKs use, or the DSN inside a tunnelled envelope. Compressed bodies (gzip, brotli, deflate) are read too.

The same rules as every other signal

Same ingest keys, same plan allowance, same durable queue. Rate limits come back in the headers Sentry SDKs obey, and an event re-sent from an SDK's offline cache is stored once.

Errors next to everything else

An error carries its trace id, so it links straight to the request that produced it. Its stack frames and commit feed the same regression engine as your other logs. Errors that carry an exception are grouped into Issues you can assign and resolve, with links to the trace, the logs and the release.

How to switch

  1. Create a workspace, then go to Settings → API keys.
  2. Create a key and leave Can read data unchecked. A DSN ends up in your code and often in a browser, so it should only be able to send.
  3. Copy the Sentry DSN shown under the new key. Like the key, it is shown only once.
  4. Put it in Sentry.init in place of the old one. Nothing else changes.

Set release to <service>@<git sha> if you do not already. ZipLogger has no separate project per service, so it reads the service name and the commit from the release.

The DSN carries your key hex-encoded, because Sentry's JavaScript SDK only accepts letters, digits and underscores in that part of the URL. The project number at the end is always 1.

// JavaScript: @sentry/browser, @sentry/node, @sentry/react ...
Sentry.init({
  dsn: "https://[email protected]/1",
  release: `checkout@${GIT_SHA}`,
  environment: "production",
  tracesSampleRate: 0.2,
})

# Python: sentry-sdk
sentry_sdk.init(
    dsn="https://[email protected]/1",
    release=f"checkout-api@{GIT_SHA}",
    traces_sample_rate=0.2,
)

// .NET: Sentry.AspNetCore
builder.WebHost.UseSentry(o => {
    o.Dsn = "https://[email protected]/1";
    o.Release = $"orders-api@{gitSha}";
});

Setup by language

Each official SDK was run end to end against ZipLogger: the same error twice, an unhandled crash, a transaction with child spans, structured logs, a cron check-in pair and a profile, each read back through ZipLogger. Each page lists what arrived and what did not.

LanguageSDK testedWhat differs
Pythonsentry-sdk 2.72.0Everything in the table above, plus source lines and trace-linked profiles.
Node.js@sentry/node 11.8.0Source lines. Profiles are continuous: flame graphs per service, not linked to one trace.
Gosentry-go 0.50.0No source lines and no profiler in the SDK; panics are reported with a deferred recover.
Javasentry 8.61.0No source lines (source bundles are not accepted). Profiles are continuous, not linked to one trace.
Rubysentry-ruby 7.1.0Source lines and trace-linked profiles (stackprof). Unhandled errors come from the Rack, Rails or Sidekiq integrations.
PHPsentry/sentry 4.34.0Source lines and trace-linked profiles (excimer).
.NETSentry 6.12.1No source lines (the SDK sends none). Trace-linked profiles with Sentry.Profiling.

What does not carry over

Better to read this before you switch than after.

Accepted, not stored

  • Native crash reports (minidumps) and other attachments.
  • User feedback. Sessions are kept: they feed release health (crash-free sessions and users per release), and profiles feed continuous profiling.
  • Session replays recorded by the Sentry SDK. ZipLogger's own browser SDK records replays; Sentry's recordings are not converted.

The SDK gets a normal success response for these, so nothing errors or retries. The response lists what was left out.

Works differently

  • Issues. ZipLogger groups errors into Issues per service and environment, which you assign, resolve (now, in a release, or in the next release) or ignore, and it reopens them on a regression. The grouping is ZipLogger's own; your fingerprint is honored. Ownership rules, merges and splits you made in Sentry, and your Sentry tracker links do not carry over. An Issue can create or link a GitHub, Jira Cloud or Linear issue, without two-way status sync, and takes comments and bulk resolve, ignore, assign and merge. Issue trackers
  • Source maps uploaded with sentry-cli. Those uploads are not accepted. ZipLogger has its own upload (a curl call from CI, or the Source maps page), keyed by the same release; see Source maps. Debug IDs are not used for matching. Mapped frames are shown on the Issue page; commit blame still reads the frames as received.
  • Alerts. Your Sentry alert rules stay in Sentry. Recreate the ones you need as ZipLogger alert rules.
  • Missed cron runs. To be paged when a job does not run at all, give a heartbeat the same slug as your Sentry monitor, or send a monitor_config and the heartbeat is created for you. Sentry’s failure_issue_threshold and recovery_threshold are not used: the first missed or failed run opens an incident. As in Sentry, every check_in_id is a run of its own, and a run that never reports back fails after its max_runtime (30 minutes when the SDK sends none).
  • History. Past events stay in Sentry. Nothing is imported.

Which tool is right for you

Sentry is a very good error tracker, and it attributes errors to suspect commits too. The honest split:

Choose ZipLogger when

  • You want errors, logs, traces, metrics, product events and on-call in one system and one bill
  • Some of your errors never pass through an error SDK. ZipLogger blames commits from log patterns, whatever produced the line: a shipper, OpenTelemetry, or a language with no SDK
  • You want the error, the trace, the release and the incident on one page
  • Your Sentry usage is mostly server-side and web errors plus tracing

Stay with Sentry when

  • You ship mobile or native apps and depend on crash symbolication or minidumps
  • You rely on sentry-cli or debug-ID based source-map uploads, or on source maps in commit attribution
  • Your issue workflow depends on ownership rules, two-way status sync with your tracker, Jira Server or Data Center, or creating GitLab issues
  • You depend on Sentry’s own profiling views: ZipLogger keeps Sentry profiles as wall-time flame graphs only

A Sentry SDK sends to one DSN, so the easy way to compare is by service: move one service to ZipLogger, keep the rest on Sentry for a week, then decide.

Questions

Migrate from Sentry, answered plainly

Do I have to change my code to move from Sentry to ZipLogger?

No. Replace the DSN in Sentry.init with the one ZipLogger shows when you create an ingest key. Your captureException calls, tracing and tags stay as they are. Setting release to service@git-sha is recommended, because ZipLogger reads the service name and the commit from it.

Which Sentry SDKs work with ZipLogger?

The official server SDKs for Python, Node.js, Go, Java, Ruby, PHP and .NET were each run end to end against ZipLogger on 2026-10-21 (sentry-sdk 2.72.0, @sentry/node 11.8.0, sentry-go 0.50.0, sentry-java 8.61.0, sentry-ruby 7.1.0, sentry/sentry 4.34.0, Sentry for .NET 6.12.1), and every request they sent is replayed by ZipLogger's test suite. Errors, Issues, tracing, structured logs and cron check-ins work with all seven; source lines and profiles depend on the SDK, and each language page says which. Other current Sentry SDKs send the same envelope format; mobile and native SDKs were not tested.

What happens to Sentry data ZipLogger does not store?

Sessions are stored and feed release health: crash-free sessions and users per release under Issues, Releases. Profiles are stored for continuous profiling, as wall-time flame graphs. Client reports, attachments, replays and user feedback are acknowledged with a normal success response, so the SDK does not retry or log errors; they are not stored, billed or imported. The response lists which item types were left out.

Does ZipLogger link errors to commits like Sentry does?

Yes, in a different way. Sentry attributes the exceptions its SDK captured. ZipLogger blames from an Issue or from a log pattern, so it works for errors from a Sentry SDK and for error lines from anything else, reading your repository over the GitHub or GitLab API. It needs the commit, which it takes from a release such as api@3f9a2c1, and frames that name your source files: minified browser frames cannot be blamed.

Can I send to Sentry and ZipLogger at the same time?

A Sentry SDK sends to one DSN, so the simple way is service by service: point one service at ZipLogger, keep the others on Sentry, and compare. Nothing on the ZipLogger side stops you running both for as long as you like.