Skip to content

Changelog

  • Revenue is an event. Money comes from the page that completed the purchase, as tracing("purchase", { revenue: 49, currency: "USD" }) or tracing.revenue(49, "USD"). There is no payment processor to connect, no webhook and no ledger; the Revenue screen switches on with the first event. → Tracking revenue
  • One rule of attribution. A revenue event belongs to the visit it fired in, so source, campaign, landing page, country and device come with it and there is no unattributed bucket. → How attribution works
  • The screen, rebuilt. Revenue, transactions, average order, customers and revenue per visitor with deltas; a chart with the previous period; What sold, Acquisition and Audience breakdowns; a transaction list that links to the visit. One currency at a time, as before. → Revenue
  • Gone: the Stripe revenue webhook, the payment and customer ledgers, MRR and ARR, refunds, the “unverified revenue” panel. Account billing is unchanged.
  • A globe. Active visitors are placed on a globe by the city the geo lookup returned, sized by how many are there, with the three live tiles beside it. Coordinates are city-level and are stored on the event. → What is stored
  • Visitor avatars. Every visitor id gets a face drawn from its hash, so a list of visits can be scanned by eye and the same visitor reads the same on every screen. It is a picture of a hash, not of a person.

The release this documentation describes. Substantially every analysis screen was rebuilt, and the documentation site with them.

  • Core Web Vitals. The tracker now measures LCP, INP, CLS, FCP and TTFB on every real page load and sends one report when the page is hidden or closed. Reports are not events and never count toward the plan. → Script configuration
  • Performance screen. Five p75 tiles with Good / Needs work / Poor ratings, the share of loads behind each, a trend chart, and where the slow loads are by page, device, country, browser and OS. → Performance
  • Vitals API. GET /api/v1/sites/:id/vitals returns the same p75s, the previous window, the series and an optional breakdown. → Vitals
  • Settings, four sections. General, Install, Plan & usage and the Danger zone as a row of pills across the top; sharing lives in General and API keys in Install. → Settings
  • Hosted only. The self-hosting chapter is gone; tracing.tools is run as a service.
  • Geo, properly. Country, region and city now resolve through Cloudflare’s edge data first and a local MaxMind GeoLite2 City database second, with a documented order and an honest null third. pnpm geoip:fetch downloads the database; DEV_GEO_IP gives local development real locations. → Geo
  • Time on page fixed. The unload flush used to be sent as a pageview named $duration, which double-counted every view, turned every real bounce into a two-view session and put a phantom step in every journey. It is now a duration hit that tops up the pageview it belongs to and writes no row. Old installs sending the previous shape are accepted and filed correctly. → Pageviews & SPAs
  • Identity is decided server-side. The tracker asks the collector which mode a site is in before its first hit and holds everything until the answer arrives, so the landing hit — the one carrying the campaign — is never filed under a provisional identity. → Script configuration
  • Goals — event and path goals with * wildcards, a detail screen with acquisition, converting pages, who-converts and time-to-convert breakdowns, and a goal filter that re-reads every other screen as “for people who converted”. → Goals
  • Funnels — up to eight ordered steps of pages and events, conversion windows, per-step drop-off with a pinned “Left the site” row, entry-step breakdowns and saved funnels that live in the URL until you name them. → Funnels
  • Retention — day and week cohort grids, visitor and identified modes, a size-weighted curve, D1/D7/D14 and W1/W4/W8 milestones, same-day return and an identity-coverage figure that says how much of your traffic the grid can honestly describe. → Retention
  • Journeys — a padded flow diagram in both directions, anchored on any page or event, with top routes and a per-page neighbour explorer. → Journeys
  • Events — a full explorer: volume, trend and sparkline per event; property keys with coverage, numeric statistics and histograms; a raw occurrence feed; outbound links by host and URL; revenue by event split by currency. → Events
  • Sessions — one row per visit with sortable columns, four quick chips, a search box that matches visitor ids, landing pages and identify() traits, a drawer that replays the visit and walks the result set, and a visits CSV. → Sessions
  • Partitioned by currency. Every revenue figure is reported for one currency at a time, with a switcher when more than one took money. Replaced on 2026-09-17 by event-based revenue; see above.
  • Hobby, Pro, Business and Enterprise, monthly or yearly, with a 14-day trial offered once per account. → Plans & limits
  • Usage counted per UTC month across the account, with a month-end projection, per-site attribution of a spike, and metered overage reported to Stripe in 100k blocks. → Usage & overage
  • A built-in billing sandbox for deployments with no Stripe key, including dev controls for renewal, dunning and cancellation. → Sandbox billing
  • This site, rebuilt on Starlight: search, a sidebar, on-page contents, dark mode, code highlighting and roughly fifty pages written against the code rather than from memory.

No changelog was kept before this release.