Changelog

WHAT WE'VE BURIED LATELY.

Every release, exhumed. Follow along as Tombstack gets sharper at catching what kills your game.

vPlatform

Crash rate now means crashes — and a new panel for where players quit

FIXEDEXPECT YOUR CRASH RATE TO FALL, and your crash-free percentage to rise. Neither is an improvement in your game; the numbers were measuring the wrong thing. Crash rate counted every report your game filed, and most auto-captured reports are handled exceptions — errors your code caught and carried on from, where nobody lost anything. So the headline was a blend of “players lost the app” and “a caught error was logged”, two things that move for entirely unrelated reasons: add exception reporting to one screen and your crash rate climbed without a single extra crash. A crash now means the process died — a hard crash or an unclean shutdown. The size of the drop is the size of your exception volume.
NEWAll errors, as its own metric beside the crash rate, with the per-kind split. This is what the crash rate used to be, kept because the total volume of things going wrong is a real signal — it just is not the crash rate, and mixing them meant neither question could be answered. Crash-spike alerts now state both, so you can tell a crash surge from an error surge without opening the dashboard.
FIXEDCrash-free sessions, crash-free players, per-build release health and the crash-exposed audiences all used the old definition, so one caught exception marked a whole session as crashed. Release health moves most visibly: a build that merely logs more caught errors no longer looks less stable than one that actually dies more often — the judgement that table exists to support during a rollout. The audience effect is worth stating plainly: “crash affected” was selecting players who had a perfectly good session with one caught error, and those people were being sent an apology for a crash they never saw.
NEWA “Where players quit” panel: how many left, how long they lasted, how many sessions they played, and — the part you can act on — what the last thing they did was. Crash-on-exit is shown beside the same figure for players who stayed, because the gap is the signal and the number alone is just your crash rate in a scarier font. Players who left without firing any event get their own line rather than being hidden, since “we cannot see where they went” is itself worth knowing, and usually means the game is not instrumented at the point people are leaving. No SDK update needed; instrumenting progression events makes it far more specific.
NEWLive Fleet answers what is actually happening right now: which servers are up, which are running matches, who is in them, and who is having a bad time — crashes as they land, the signatures behind them, frame rates, and the players below a playable framerate. Servers running matches was never a missing feature; your SDK has been sending the match id all along and nothing on our side read it back. Refreshes every 10 seconds. An idle server is shown separately from one with players but no match reported — the first is capacity you are paying for, the second usually means match correlation is not wired up.
NEWWhy the process died, on the crash breakdown: exit type, the raw OS reason, and the signal. Your SDK has been sending this on Android since 0.17 and nothing read it. On mobile it is the most useful fact about an unclean shutdown — the OS killed you for memory, you hung and got ANR'd, and you took a SIGSEGV are three different bugs with three different owners, and the graveyard showed all three identically.
FIXEDDedicated servers were being recorded as players with an install date. A server's heartbeats carry a real user id, so “has an id” was being read as “is a person”. Your displayed numbers were never affected — retention, new users, DAU and the concurrency we bill on all excluded servers correctly — but the underlying records were wrong, and they are now being cleaned up automatically.
NEWMore ways to build an audience: players who returned two or more times in their first 24 hours, total visits, country, and players whose typical framerate sits below a threshold. Plus a day-one panel showing how many new players came back a second, third, fourth or fifth time within a day of installing — the earliest honest signal that a campaign bought you players who actually want the game.
vPlatform

A Funnels board, and an AI that can build funnels instead of just reading them

NEWFunnels, as their own screen. Every funnel you have saved, run over the same window and sorted so the biggest single drop in your game is the first thing on the page — with that step named, the share of players it loses, and a sample of who stalled there linking straight into the session where each of them last got that far. Until now a saved funnel could only be opened one at a time on the Analytics page, which answers “how is this funnel doing” but never “of everything we track, where are we bleeding the most players”.
NEWThe AI can now build the funnel, not just read yours. Over MCP it can save a funnel, run it, see which step loses people, rewrite the steps and run it again — so a hypothesis becomes a measured funnel inside one conversation, and the result appears on your Funnels board for the team. It can also create and evaluate audiences, and ask directly where players quit. Ten new tools, twenty-six in total.
IMPROVEDWhat the AI can delete is worth stating plainly: funnels and audiences are definitions — a name and some steps, a set of rules — and deleting one removes a saved question, never an answer. Every event it counted stays in storage, and recreating the same definition reproduces the identical numbers. No tool we expose to an AI can delete telemetry, and every delete it performs reports that it did not.
FIXEDFunnels run through the AI now read the same fields the dashboard does, so a funnel an agent reports and the same funnel on your screen cannot disagree. Where the event scan hits its cap, the answer says so and says which direction it errs — newest-first paging drops the oldest events, which are step one of every journey, so a truncated funnel reads better than reality rather than worse.
FIXEDEXPECT YOUR PEAK CCU TO READ LOWER, AND YOUR BILL WITH IT. CCU is meant to be concurrent players — it is what the Terms say and what the pricing page sells — but it counted concurrent sessions, and those are not the same number. A heartbeat keeps a session alive for five minutes, so a player who crashed and relaunched had a dead session sitting beside their live one and was billed as two people for the rest of that window. On a crash-monitoring product that lands exactly the wrong way round: the buggier your build, the more you paid us. Two devices, or an unclean shutdown followed by a relaunch, did the same. One player is now one CCU however many sessions they open, dedicated servers are still excluded, and Live CCU on the overview uses the identical definition so the two finally reconcile. The correction cannot reduce an invoice already in flight — the metered quantity only ever rises within a billing period — so it takes effect at your next period. If the drop looks larger than you expect, it is a measure of how often your players were relaunching.
vPlatform

New users and retention now know an install from a return

FIXEDEXPECT YOUR “NEW USERS” NUMBER TO FALL SHARPLY — that is the fix, not a fault. A player's install day was taken from the earliest activity we happened to have loaded for the chart you were looking at: a 30-day window at best, and often far less. Anyone quieter than that window looked brand new every single time they came back. So “new users” counted returning players as installs over and over, landing closer to your monthly active players than to your actual new ones, and the drop you will see is roughly the size of that error. Nothing about your game changed today; the number stopped flattering it.
FIXEDDaily cohorts and D1/D7 were distorted by the same cause, in a way that made your onboarding look worse than it is. Every returning veteran was added to the cohort of the day they resurfaced, inflating its size — then counted as churned when they did not come back the next day. People who already love the game, scored as new players who bounced. Those cohorts now hold only genuine first-time installs, so the rates should read higher and, more importantly, mean what they say.
FIXEDD30 becomes measurable where it previously could not be. A player whose install day was believed to be yesterday can never be mature for a 30-day horizon, so long-lived players were excluded from the one metric they were best placed to answer. With a real install date they now count.
IMPROVEDThe first-session (onboarding) panel no longer treats a veteran's return as somebody's first session. First-session length, and the crashed-versus-clean split, now describe actual first sessions.
IMPROVEDWe remember each player's first-seen date for exactly as long as we keep their telemetry — your retention window, not longer — and it is deleted with everything else when you erase a player. It is derived from data already stored, so nothing new is collected and no SDK update is required. One honest limit: a player away for longer than your entire retention window can still look new when they return, because by then their telemetry is gone too and there is nothing left to tell us otherwise.
vSDK 0.19.4

Paused players stopped counting — and your peak CCU is what we bill on

FIXEDA player sitting in your pause menu stopped sending heartbeats, dropped out of live CCU after five minutes, and stopped counting toward the monthly peak concurrency we invoice on. The heartbeat timer ran on game time rather than wall-clock time, so the near-universal way to pause a game — setting Time.timeScale to 0 — froze it outright. The effect scales with how much time your players actually spend paused, which makes it largest on games with heavy inventory, map or settings use, and it was invisible from either side: the player is present, the session simply stops reporting. To be unambiguous about the direction, because this touches your bill: peak CCU was understated, never inflated. If a past invoice looks low against the concurrency you know you had, this is the likely reason — talk to us. It needs the SDK update; beats that were never sent cannot be recovered server-side.
FIXEDFailed uploads — including crash reports — could sit unretried for as long as the game stayed paused, for the same reason: the retry backoff also ran on game time. Nothing was lost, only delayed until the player unpaused.
IMPROVEDIf you install by UPM git URL, this release is also the first to carry two earlier fixes that had never reached the public package: consent granted before initialization is no longer silently reverted (a build with Require Consent ticked could otherwise report nothing at all), and the heartbeat interval is now capped at 240s so a session cannot blink out between its own beats. Tarball users already had both.
vPlatform

Crash grouping fixed for shipping builds, app hangs, crash-free players

FIXEDCrashes from RELEASE builds were grouped wrong — and this is the big one, because it affects the majority of real player telemetry. A shipping (IL2CPP/AOT) build writes stack frames like “at Game.Player.Update () [0x00010] in <8f4a2b1c…>:0”, where that hex value is an id for the compilation, not for your code. We were including it in the grouping hash, so the SAME bug produced a DIFFERENT signature in every build you shipped: it kept reappearing as a brand-new “first seen” issue, occurrence counts were split across releases, and regression detection could not see that a bug had come back. Editor-reproduced crashes also grouped separately from the identical crash arriving from a shipping build. Both are fixed, and the fix applies to builds already in players' hands — we regroup server-side on ingestion, so there is no SDK update to install. ONE-TIME EFFECT WORTH KNOWING: signatures computed from now on differ from the old ones, so a currently-open issue will start collecting under a new row, and triage state (resolved / assigned) does not carry across. Expect a burst of “new” signatures that are really your existing bugs, correctly grouped for the first time.
NEWApp hangs are now a first-class card on Analytics — count, players hit, median / p95 / worst stall, and the worst scenes ranked. Your SDK has been detecting main-thread freezes since 0.11 and sending them, but nothing on our side read them: they landed as anonymous custom events you would only find by digging through the event browser. A freeze produces no crash report and no stack trace, so this was the single failure your players call “the game is broken” that the dashboard never mentioned. Nothing to instrument — detection is on by default with a 5 second threshold. One limit worth stating plainly, because it is the opposite of what you would assume: a hang is reported when the main thread RESUMES, so the card holds the freezes your players sat through and waited out. A freeze they force-quit through never sends its report — which means the most severe cases, the ones that end a session and cause a refund, are the ones missing. Those still arrive as an unclean shutdown, without the stall duration or the scene. On Android an OS-level kill is additionally captured as anr-kill; elsewhere it is not. Persisting the stall across a launch so the terminal case reports on next start is on our list.
NEWCrash-free PLAYERS, alongside crash-free sessions on your Command Center. Sessions tell you how often the game fails; players tell you how many people it failed — and they can be very far apart. A bug that crashes one unlucky player forty times barely dents crash-free sessions on a busy game, and reads as a healthy 99%; the player figure shows that person for what they are, a whole player having a bad time. Read the two together: a wide gap means your crashes are concentrated in a minority of players, which is the shape that quietly drives churn and refunds.
FIXEDARPDAU · 24h was understated on high-volume games. Its numerator (purchases) comes from the analytics page's event budget, which on a busy game does not reach back a full 24 hours, while its denominator (active players) always did — so a partial day of revenue was divided by a whole day of players, by a factor nobody could see. Where the events cannot span 24 hours the figure is now withheld and labelled “withheld · window too dense”, with an explanation on hover, instead of showing a number that is quietly low. Narrowing the range or applying a build/platform filter brings it back. Every other revenue figure on the card was already scoped honestly to the events it had.
FIXEDA play session that ran across UTC midnight was counted as two sessions in the crash-rate denominator — once on each side of midnight — so every crash rate was understated by roughly the share of your sessions that straddle midnight. Rates and per-build rates will therefore read slightly HIGHER than before; they were too low, and this is the correction. Crash counts, crash-free percentages and session lists were never affected. If your game has long sessions the change is larger, because more of them cross midnight.
IMPROVEDNothing about how you are billed has changed. What changed is that the two rules protecting your invoice are now covered by tests instead of by inspection: within a billing period the reported peak can only ever RISE, so a temporary dip in our own measurement (a row ageing out, a query hitting a size limit, a player exercising erasure) can never quietly move your bill — and at the start of a new period it resets to that period's own peak instead of carrying the previous one forward. Both rules already worked; neither was verified automatically, on the one code path where a silent mistake becomes a wrong invoice.
IMPROVEDA studio on a negotiated price is now provably excluded from automatic metering, including the free-forever case — zero is exactly the value a careless check would read as “unset” and bill at the full published ladder.
vPlatform

Accuracy pass — some of your numbers will change

FIXEDCrash rates filtered by build (or by the legacy exact platform filter) divided that build's crashes by EVERY build's sessions — so a build at 10% adoption showed roughly a tenth of its real rate. Both sides of the rate are now scoped to the filter, which means filtered rates read HIGHER than before. They were understated; this is the correction.
FIXEDThe sidebar crash-free gauge used a different formula from the crash-free number on your overview, and because it divided by zero sessions it showed a reassuring “100.0%” for a game that had never sent any telemetry. Every surface now uses one definition — the share of player sessions that ended without a crash — and shows “—” when there is nothing to divide by, instead of green.
FIXEDPer-build session counts on the releases page counted dedicated-server boots as player sessions, which deflated each build's crash rate and disagreed with the crash-free column beside it. Servers are now excluded from both sides.
FIXEDOn very large games, 24-hour reads (sessions, live CCU, DAU) could sample the oldest rows in the window instead of the most recent. They now always keep the current window.
IMPROVEDThe status page is a live probe of the database, telemetry store and blob storage on every request rather than a static list — it can and will show a degradation.
IMPROVEDCrash / exception / unclean-shutdown chips explain themselves on hover wherever they appear, the Graveyard opens on the review queue instead of a mixed list, and a crash's session link now lands on that session's timeline at the moment of the crash.
NEWPublished our sub-processor list at /legal/subprocessors (AWS, Stripe, and Anthropic if you use the AI assistant), with the exact data each receives and where it sits. The privacy policy now states plainly that telemetry stays in the EU and that only an assistant question leaves it.
FIXEDUsage metering is now reported before alerting runs, not after. Previously a long alerting pass could consume the scheduled job's whole time budget, and any studio whose metering was skipped that way was simply never metered. If that applied to you, your usage will now be reported accurately — which for a small number of studios means an invoice that reflects real peak concurrency for the first time. If a bill looks unexpected, contact us and we will walk through the numbers with you.
IMPROVEDThe Unity in-editor hub now reports the same crash-free percentage as the dashboard. It had been deriving it from the crash rate, which is a different measurement, so the two could disagree for the same game.
vPlatform

A proper devblog — illustrated, and on film

NEW“Everything Tombstack does” — a full written tour of the platform: what the SDK captures, how a crash becomes a grouped issue, how a dead server names the players who were on it, and what the analytics, alerting, MCP and billing layers actually do (including what is still on the roadmap)
NEWA 3-minute narrated film of that same tour, embedded in the article
IMPROVEDEvery article now carries real diagrams and cover art instead of placeholder graphics — the ingest path, report anatomy, multiplayer correlation, analytics, integration surfaces, the pricing ladder and the architecture are each drawn out
FIXEDRetired an old post whose central latency claim was never measured, and corrected the symbolication write-up so it no longer implies server-side minidump symbolication ships today
vPlatform

Platform-native webhook alerts

NEWDiscord webhooks now get rich embeds — severity colors, structured fields, and deep links that land straight on the exact signature, fleet, or analytics page the alert concerns
NEWSlack webhooks get native Block Kit formatting (header, fields, context footer) with a plain-text fallback
IMPROVEDCustom endpoints keep the plain payload unchanged and gain a structured `tombstack` JSON object (title, severity, url, fields) that integrations can parse instead of scraping text
vPlatform

Funnels that explain their losses + a bigger chart kit

NEWFunnel drop-off drill-down — every step shows WHO stalled there, what they did instead (their last action before going silent), and a one-click jump to the exact session timeline at the drop-off moment
NEWNew chart kinds: hour-of-week activity heatmap, ranked horizontal bars, and a timeline strip with event markers — plus a moving-average smoothing option on line charts
NEWTwo dashboard widgets: Activity heatmap and Top events
IMPROVED70+ quality-of-life touches across analytics, explore, dashboards, sessions and fleet — CSV exports, search and sort, copy-link, step reordering, actionable empty states, and more
vPlatform

Hosted MCP — AI access as a service

NEWThe MCP server is now hosted by Tombstack — point Claude, Cursor or any MCP client at tombstack.com/api/mcp; nothing to download, build or run
NEWMint MCP keys from your billing page, scoped to all your games or locked to a single game; revoke instantly
NEWMCP access is a €20/month add-on per studio, on top of your usage plan — enable and disable any time
IMPROVED16 AI tools including one-call signature analysis, retention cohorts, server-fleet triage, and read+write triage actions
vPlatform

Configurable data retention

NEWChoose how long your telemetry is kept — 30 to 90 days — from your Billing page; older data is then deleted automatically to keep only what's useful
NEWFree studios keep 30 days; upgrade to a paid plan to extend the window up to 90 days
vSDK 0.19.1

Crash kinds + tighter live signal

NEWCrash reports are now classified — Crash (the process died), Exception (managed, the game usually kept running), or Unclean shutdown — labelled distinctly across the dashboard
NEWFilter the Graveyard by kind, so you can triage hard crashes separately from caught exceptions
NEWThe SDK sends a heartbeat when the app is backgrounded and on quit (plus Tombstack.SendHeartbeatNow()), so live CCU and session liveness stay tight
FIXEDLog-pull + retention hardening from an internal audit (past-session delivery, retention=1 edge case)
vPlatform

Analytics: funnels by audience, retention by step, saved views

NEWSplit any funnel by audience or segment, side by side
NEWRetention by funnel step — see which progression gate hurts D1/D7/D30 most
NEWEvent property breakdowns, period-over-period comparison, and saved analytics views
vSDK 0.18.0

Launch-log retention + frame-health detail

NEWThe SDK keeps the last N launch logs (default 3, configurable) keyed by session — so you can pull a specific past session's log even after the player reconnected
NEWA server-session log pull now reaches players who have since disconnected
NEWA per-20-second frame-stats series rides each heartbeat for sub-minute frame-health detail — no extra ingestion cost
vPlatform

Live sessions, country cohorts, environment scoping, multiplayer correlation

NEWLive sessions — see who's playing right now, paginated
NEWPer-country retention cohorts, for tracking country-targeted campaigns
NEWCrash / exception / session numbers are now scoped by environment, and your webhook alerts carry which environment(s) they concern
NEWA server crash lists every client session that was on it when it went down; a client crash links straight to its server session
vBilling

CCU-peak billing goes live

NEWAdd a card at signup; we auto-subscribe off-session the moment your monthly peak crosses the free tier (10 CCU) — no manual upgrade, no interruption
NEWA studio billing page with your card, usage, and invoices; owners are emailed before billing starts
vSDK 0.16–0.17

No-anonymous identity + real OS exit reasons

NEWNo more anonymous players — the SDK mints a persistent, per-game device id that upgrades to your real user id on SetUser, merging the pre-auth telemetry into the same player
NEWUnclean shutdowns on Android now report the real OS exit reason (oom / anr / signal / native crash) instead of one generic bucket
NEWStartSession() gate so the first heartbeat carries the player's identity + environment
vPlatform

Global platform filter & segmented retention

NEWGlobal platform filter (topbar) — scope every dashboard page to windows, macos, linux, android, ios, mobile or desktop; crash rates scope both numerator and session denominator
NEW?platform= on the read API (crashes, crashes/summary, events, metrics, bug-reports, retention) — invalid values are rejected with a 400, never silently ignored
NEWSegmented retention — ?by= splits D1/D7/D30 cohorts by os, mobile-vs-desktop, device model, GPU, RAM/VRAM band, CPU threads or engine; CSV export included
IMPROVEDEvery page that can't honour the platform filter says so with a visible chip — no silently mixed-scope numbers; the filter never changes your bill
vSDK 0.5.0

Fully autonomous SDK + standalone native client

NEWUnity SDK is autonomous after Init — unhandled exceptions, unobserved Tasks and AppDomain errors are captured with no extra code
NEWPlayer log auto-uploaded with every crash and bug report (rolling 512 KB session log)
NEWUnclean-shutdown detection — a hard crash or OOM kill is reported on the next launch with the previous session's log recovered
NEWStandalone C/C++ native SDK (tombstack-native) — a C99 DLL for any engine, CI-verified on Windows, Linux and macOS
vSDK 0.4.0

In-editor Hub & account sign-in

NEWUnity editor plugin — sign in with your Tombstack account, link a game, and watch a live crash dashboard inside the editor (all UI Toolkit)
NEWTrackEvent analytics API + breadcrumb levels
IMPROVEDWrite-ahead crash durability and consent-gated, user-attributed heartbeats
vPlatform

The forge-dark platform

NEWCommand center, the Graveyard, signature autopsy, live fleet, sessions, analytics, releases, symbols, alerts and a tabbed settings hub
NEWAI triage assistant (in-dashboard) and a 12-tool MCP server
NEWGraduated CCU pricing — free up to 10 peak CCU, then a volume-discounted ladder
Subscribe to release events via the MCP / API.