Product analytics

Your events and your errors, in the same place.

ZipLogger tracks product events next to the logs, traces and exceptions they happen alongside. So when a funnel drops, you are one click from the errors those people hit, and from the commit most likely behind them.

Start free Read the docs

One SDK for logs and events · Mixpanel-compatible ingestion · No extra product to buy

Event → error correlation

“What were users actually doing?”

Expand any error pattern in Search and ask. ZipLogger correlates the events around that error by trace id and session, and answers with the common journey into it, how many users were affected, and where they were. The regression block sits right next to it, so the path from symptom to cause to commit is one screen.

This is the join a separate analytics product cannot make. Your events and your stack traces have to be in the same system to be asked about together.

  • Common journey into an error, reconstructed from real sessions
  • How many distinct users hit it, and from which countries and devices
  • Correlated by trace id and session, not guessed by timestamp
  • Sits beside the git regression analysis on the same pattern
Payment failed: card_declined — Charge()  214 events · term 31d

Journey into this error
  1. Viewed pricing          214
  2. Started checkout        214
  3. Applied coupon          198  ← 92%
  4. Submitted payment       214

Affected  186 users · top: US 61, DE 24, IL 19
Events explorer

Every event, sliced how you think

Total events, unique users, sessions and events per user across any time range, then group by whatever matters: event name, service, environment, country, device type, browser, or release version. Top events, countries, devices and browsers come as standing panels.

  • Group by event, service, environment, country, device, browser or version
  • Property breakdowns and value distributions on any field
  • Drill from an event into the user who fired it, and their whole history
  • Drill into a single session and read it end to end
  • Your daily quota shown on the page, so volume is never a surprise
Events        1,284,902     Unique users   48,201
Sessions       112,430     Events / user   26.7

Top events
  page_view          812,004
  checkout_started    41,882
  purchase            18,209
  payment_failed         214
Funnels

Where people fall out

Build a funnel from any sequence of events and put it on a dashboard next to your error rates and latency. Two modes: sequential counts the users who did the steps in order, presence counts each step on its own in the window (sessions by default).

Because the dashboard also holds your log and metric panels, a conversion dip and a deploy at the same moment are visible on the same screen. Seeing them together is a lead to check, not proof that the deploy caused the dip.

  • Presence and sequential funnel modes
  • Per-step counts, and drop-off in sequential mode
  • Saved process reports: a conversion window per person, the people at each step, and pending or unknown kept apart from confirmed non-completion (how they count)
  • Lives as a dashboard widget beside log, metric and trace panels
Signup funnel            sequential · 30d

visited_pricing     12,400  ████████████ 100%
started_signup       6,820  ██████▌       55%
verified_email       5,140  ████▉         41%
created_workspace    4,905  ████▋         40%
first_log_received   3,260  ███           26%
Retention & cohorts

Who came back, and who did not

The classic cohort triangle: pick the event that starts a cohort, optionally the event that counts as coming back, and daily or weekly buckets. Each row is everyone whose first cohort event fell in that period; each cell is the share who returned N periods later.

Unfinished periods render as pending rather than as churn, so this week's cohort does not look like a collapse. Identity falls back to the anonymous id, so device-level retention works before anyone signs in.

  • Daily or weekly cohorts, over a configurable number of periods
  • Filter by service, environment, release, country, device, browser or OS
  • Saved cohorts — reusable audiences like “purchased in the last 30 days”, narrowed by property conditions
  • Run retention against a saved cohort instead of a raw event
Retention  cohort: signup · weekly

              W0    W1    W2    W3
Aug 04  1,204  100%  42%   31%   27%
Aug 11  1,388  100%  45%   33%   28%
Aug 18  1,502  100%  44%   30%    ·
Aug 25  1,610  100%  46%    ·     ·

· = period still in progress, not churn
One SDK

Already installed, if you ship logs

The ZipLogger .NET packages register an IEventTracker alongside the logging provider, so Track() and Identify() are injectable next to ILogger, sharing one queue, one connection and one API key. Nothing new to install, no second vendor script on your pages.

Anything else can POST to the events endpoint directly: a single object, a JSON array, or NDJSON: the same shapes the log endpoint accepts.

  • Events ride the same batching, retry and backpressure as your logs
  • Same ingest key, same tenant isolation, same PII redaction
  • Same per-plan quota accounting, shown in the UI
// Injected next to ILogger — same queue, same key.
public CheckoutService(ILogger<CheckoutService> log,
                       IEventTracker events)

events.Identify(userId, new { plan = "team" });
events.Track("checkout_started", new {
    cart  = cart.Id,
    total = cart.Total,
});
Moving from somewhere else

Keep your Mixpanel SDK. Change the host.

ZipLogger accepts Mixpanel-shaped payloads on three routes, so an app already instrumented with Mixpanel can send to ZipLogger by pointing the SDK at a new host and swapping the project token for a ZipLogger ingest key. Event names, properties and identity calls keep working as written. See exactly what is supported →

Honest limits

ZipLogger is an observability platform that also does product analytics. Two things worth knowing before you rely on it:

🎥

Session replay is off until you turn it on

ZipLogger does record real sessions now — but nothing is recorded until an admin enables it for the workspace, and then only the share of sessions you choose. It is a DOM recording rather than video, so a session is a few hundred kilobytes of real text, and everything typed into a field is masked in the browser before it is sent.

What it cannot capture: cross-origin iframes, canvas and the contents of video. Images load from your own origin when a replay is watched, so an expired URL shows as broken. How session replay works →

👤

Profiles are derived, not stored

User profiles are computed from the event stream rather than kept as a mutable document. A Mixpanel $set is accepted and recorded as an event, so the properties stay queryable, but this is not a profile store you can overwrite in place.

Included in every plan

Analytics events are part of the same subscription as your logs, metered separately and shown in the app. Each plan includes a monthly allowance of product-event data, measured in bytes, with a daily safety ceiling; paid plans can opt into per-GB overage (off by default, under a spend cap you set) instead of a hard stop. There is no separate analytics product to buy. See the full table →