Changelog

What we’ve buried lately.

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

Platform · SDK 0.21.6 · CLI 0.3.3

Resent batches are stored once, and Windows and Linux IL2CPP symbols are indexed

FIXEDEXPECT SOME EVENT AND METRIC COUNTS TO READ LOWER. A batch resent after a crash on quit could be stored twice, the copy shifted later in time; the server stopped doing this on Oct 24, and the affected copies were removed. Unity SDK 0.21.6 closes the remaining case, a device whose clock runs ahead, by stamping each send attempt with the time it is actually sent. Daily summaries recompute on their own within a week.
FIXEDSymbol archives from Windows and Linux IL2CPP builds indexed nothing: Windows .pdb files were skipped and Unity’s split Linux .debug files were ignored. Both are now indexed and matched to your shipped binaries by their build ids.
FIXEDCLI 0.3.3: tombstack-symbols-zip exits with an error when an upload indexed nothing, and prints each skipped file with its reason, so a CI step can no longer pass with no symbols uploaded. A per-game token with the read and write scopes is enough to upload.
FIXEDA typed player id (a short lowercase prefix, an underscore and a ULID, for example player_01J…) stored under an id field such as player_id is no longer scrubbed as a secret at ingest. Bare ULIDs and values under credential-like field names are still redacted.
IMPROVEDSecurity hardening: request validation.
Platform

Token rotation, sharper crash and fleet alerts, and stricter day-one retention

NEWRotate a game token from Settings: the replacement is shown once and the old token keeps working for 24 hours, so you can ship the new one without a gap. When you create a token you choose its scopes (ingest by default, read and write for CI), and every token row shows them.
NEWGodot and Web are now engines you can pick for a game, at creation or later in Settings, and the setup steps hand you the matching SDK and snippet instead of the native C SDK.
FIXEDCrash-spike alerts now count crashes only, so one crash beside a run of handled exceptions no longer pages a critical spike. Release-risk alerts fire only when a build is measurably worse than the rest of your fleet, which cuts false alarms on builds with few sessions. A game that sends crashes without session heartbeats now gets crash alerts instead of none.
FIXEDFleet metric rules judge each server: one server at a low tick rate among healthy ones now breaches the rule instead of disappearing into an average, and CCU rules add servers up.
FIXEDEXPECT D1 AND D30 TO READ LOWER IN PLACES. A sitting that ran past UTC midnight counted as a day-one return, and a player who installed before the read window could enter a cohort without the install-day peers who had already left. D30 on a 30-day read now shows no data instead of an inflated rate.
NEWTombstack announcements now appear as a dismissible banner in your dashboard. Deleting a game asks you to type its name.
IMPROVEDSecurity hardening: team roles and chat webhook payloads. Only a studio owner now manages admins; admins manage members and can still leave.
Platform

Webhooks with event subscriptions, signatures, retries and a delivery log

NEWWebhooks, rebuilt. A studio can have up to 25 endpoints on the Integrations page, each for one game or all of them, subscribed to the events you choose (seven alert types, issue status changes and new player bug reports), with a minimum severity and optional environments. Formats are signed JSON, Discord, Slack and Microsoft Teams, and your existing single webhook URL keeps working.
NEWEach endpoint has its own signing secret you can reveal and rotate, retries at 1 and 5 minutes, then 30 minutes, 2 hours and 6 hours (Retry-After is honoured), a delivery log with the response, redelivery and a test button. An endpoint is disabled after 20 failed deliveries. Bug-report webhooks send only reports received after you subscribed.
IMPROVEDLess permanent text in the dashboard: methodology and coverage notes on fourteen pages moved behind info buttons and expandable panels. Markers such as withheld, partial or sample stay visible, with their explanation one click away.
FIXEDAccessibility: an automated WCAG 2.2 AA audit of 18 dashboard routes found 54 issues on 7 of them, all fixed, including player links too small to tap and links told apart by colour alone.
NEWGame settings, Billing & Usage, now shows the ingest capacity and session budget that apply to your game.
NEWA redesigned public site, an RSS feed for the blog, and /llms.txt and /llms-full.txt so AI assistants can read what Tombstack does.
SDK 0.21.2 · Web SDK 0.1.3 · Godot SDK 0.1.3

Unity SDK 0.21.2 keeps launch events, the Web SDK adds consent, Godot stops calling quits crashes

FIXEDUnity SDK 0.21.2 no longer drops events and metrics on the device before the server has said which session budget applies. A game that fired many events at launch, funnel steps first, lost them on every launch even when the server would have accepted them.
NEWUnity SDK 0.21.1 adds a Welcome window in the Editor (Tools > AnkleBreaker > Tombstack > Welcome): sign in, link the project to a game and watch reports arrive in Live Tail. It also shows AnkleBreaker Studio news and catalogue, and asks for a review three days after first use, at most twice. It opens once per project, never in batch mode, and never opens a web page by itself.
NEWWeb SDK 0.1.3 adds consent gating: with requireConsent, nothing is sent and no device id is stored until setConsent(true). Error reports are rate-limited (deduplicated per signature for a minute, at most 10 a minute), so an error thrown every frame no longer floods your ingest.
FIXEDGodot SDK 0.1.3 no longer takes over your game’s quit flow, so your own confirm dialog and Android back-button setting work. Normal quits from a menu and mobile background kills are no longer reported as crashes.
FIXEDBoth the Web and Godot SDKs clamp a bug report’s category to 32 characters, the server’s limit, so a longer category no longer gets the report rejected.
Platform

Funnels count each person once, as a cohort, on the builds you ship

FIXEDEXPECT YOUR FUNNEL NUMBERS TO MOVE. A funnel now counts one person across sessions: a player who started signed out and continued after signing in was counted as two, one dropping at step 1 and one entering at step 2. Dedicated servers are no longer counted as players, and one event can satisfy only one step.
IMPROVEDThe range you pick is now a cohort: players who started the funnel inside it, with later steps counted up to the end of the range plus the conversion window, and attempts whose window is still open shown as in progress. Before, a player who finished just after the range counted as a drop-out.
IMPROVEDFunnels get a 24-hour conversion window by default in the builder, the API and MCP, funnels with no window are flagged, and the window carries between the board and Analytics. Funnels also default to your current production builds, each player counted on the build they entered on, with an all-builds toggle.
FIXEDAttribute conditions: true and false match regardless of case, != requires the key to be present, and you can test for a key’s presence (key) or absence (!key). A saved step that stopped matching while its event keeps firing, typically after a build renamed an attribute value, is now flagged.
IMPROVEDThe board names the biggest loss in players and, separately, the steepest step by rate, and every percentage states its base.
IMPROVEDThe Graveyard, the live Fleet page and crash detail pages send much less data: the issue list is paged, the live player list is capped at what the table shows, and a crash page loads one occurrence and fetches the others when you open them. Dashboard tabs left open in the background no longer keep the CPU busy with decorative animation.
IMPROVEDSecurity hardening: studio invitations, webhook settings, CSV exports and the hosted MCP endpoint.
SDK 0.21.0

Unity SDK 0.21.0: crash reports survive a wrong clock, exception storms and a full queue

FIXEDA wrong device clock no longer deletes crash reports. The SDK learns the server’s time from each reply and signs with it, a rejected signature is retried instead of being treated as poison, and a crash or bug report is never deleted over a 401: it stays on disk and is retried at the next launch.
FIXEDException storms are bounded: a repeated exception is recognised by its type and top frames even when its message carries a changing value, distinct exceptions share a limit of 10 reports a minute, and refused reports are counted rather than lost silently. A fatal exception is never held back.
FIXEDCrashes keep room in the offline queue: events and metrics may use at most half of it, and when it is full a crash or bug report evicts the oldest analytics file, never the reverse.
IMPROVEDThe SDK now applies the session budget the server announces for your studio, and drops nothing on the device when the server announces none. The 0.20.x releases applied the budget on every device whatever the server said.
FIXEDAlso: a buildVersion longer than 64 characters is trimmed instead of getting every payload of that build rejected, Play Mode with domain reload disabled no longer sends nothing on the second run, and the offline queue is read off the main thread at startup.
Platform

A funnel builder, and triage that defaults to the builds you ship today

NEWA funnel builder: up to ten steps, repeated events, guided attribute conditions, a conversion window, undo and redo, and a draft kept in your browser. If someone else saved the same funnel while you were editing, you are told and can save yours as a copy instead of overwriting theirs.
NEWIssues and bug reports now default to your current production builds, inferred from the last 72 hours of sessions separately for each OS and for clients and servers, with history one click away. Automatic crash alerts use the same scope. One honest limit: this is inferred from traffic, not from a release registry, and when the read is incomplete the page says so and keeps showing history.
NEWThe five MCP triage tools (crash summary, crash list, bug reports, signatures, release health) default to current production builds too, and a new get_current_builds tool shows the evidence. Read API routes keep their all-builds default unless you pass buildScope=current.
FIXEDA funnel’s daily summary kept at most 64 arrivals per player, step and day, so late conversions on busy days disappeared. Every arrival is now kept, with millisecond timing.
NEWSessions compares today’s new players with yesterday at the same elapsed time of day, so a morning reading is not set against a full day.
FIXEDRetention rates are withheld, and say why, when the history that links a player’s devices to one identity could not be read completely, instead of being published from a partial set.
Platform

A retention workbench, automatic retention comparisons and a dashboard studio

NEWA Retention page that compares up to four named cohorts, each with its own first-seen dates and up to four filters across country, OS, device and build, showing D1, D7 and D30, the difference from a reference cohort, denominators and overlaps. Analyses can be saved, renamed, pinned, shared by link and exported as CSV. The same calculation is available over the read API and the compare_retention_cohorts MCP tool.
NEWAutomatic comparisons: with no setup, the Retention page builds twelve tables by OS, mobile model, country, platform, hardware, build and engine, and every group opens a dated D0 to D30 matrix by day or week, with CSV export. One honest limit: D30 needs 31 complete days inside the history your plan keeps.
NEWSessions compares two first-seen periods side by side at D1 and D7, with the same scope and a CSV export.
NEWA dashboard studio: seven starter layouts you can preview, a searchable library of all sixteen widget types, drag and keyboard reordering, and undo and redo. Since Sep 22, unsaved edits are kept in your browser and offered back, and if a teammate saved the same dashboard meanwhile you can keep both versions.
NEWPinned pages, recent pages and a command palette for moving around the dashboard. These preferences are personal to your account and browser, not shared with your studio.
SDK 0.20.1 · Web SDK 0.1.2 · Godot SDK 0.1.2

Tombstack for browser games and Godot 4, and Unity SDK 0.20.1

NEWA Web SDK for browser games (three.js, Babylon, PlayCanvas, Phaser, raw WebGL or WebGPU, and Unity or Godot web exports): sessions and heartbeats with frame stats, uncaught errors, events, metrics, breadcrumbs and bug reports, with no dependencies, from the Download page. One honest limit: a browser gives no signal when a tab crashes or is killed, so there is no unclean-shutdown detection, and where localStorage is blocked (some portals’ iframes) every page load looks like a new player unless you call setUser.
NEWA Godot 4 addon in GDScript: sessions and heartbeats, unclean-shutdown detection, events, metrics, breadcrumbs and bug reports. One honest limit: Godot gives addons no hook for script errors, so errors are reported only where you call capture_exception.
IMPROVEDUnity SDK 0.20.1 sends events and metrics every 60 seconds instead of every 10; pause, quit and the pre-crash path still flush at once, so nothing waits longer at risk. It also splits a batch at the API’s 512 KiB limit, where an oversized batch used to be rejected and discarded.
NEWUnity SDK 0.20.1 also applies the per-session budget for custom events and metrics on the device, so rows the server would refuse are not sent, and counts them as tombstack.dropped_session_budget on your Fleet page. Crashes, bug reports and heartbeats are never affected.
IMPROVEDSecurity hardening: webhook delivery and saved views.
Platform

A per-session budget for custom telemetry, graded server crash-free rates, and corrected MCP tools

NEWCustom events and metrics now have a per-session budget of 60 rows per session per 30 minutes. Crashes, bug reports and heartbeats never count against it, so crash reporting and your CCU are untouched. Rows over the budget are answered as not stored rather than rejected, so the SDK does not retry them, and the refusals are counted on your game’s Fleet page. If a build goes over, it is usually one Track call inside a per-frame loop. Since September 25 the budget applies only to studios without a paid subscription.
IMPROVEDBreaking for read API users: GET /api/v1/read/servers and /read/servers/{id} no longer return a bare crashFreeRate. Each server carries crashFree { rate, sessionsBasis, graded, quotable, verdictText }, and a rate measured on too few sessions is marked not quotable, as on the Servers page. The list_servers and get_server MCP tools tell the model to check quotable first.
FIXEDWe checked every hosted MCP tool description against the route it calls and fixed 25 places where a description promised a field the route does not return, or a parameter the tool could not send, on both the hosted and the stdio server. analyze_funnel now evaluates a cross-actor funnel per match instead of per player.
FIXEDPlayers-affected and regression alerts now apply your saved issue merges, as the new-issue alert already did. A merged issue whose members each stayed under the threshold could cross it together without any alert firing.
Platform

One date-range control across the dashboard, and issue merges that apply everywhere

NEWOne shared time control on the command centre, Sessions, Audiences, Analytics and the Funnels board, including a custom from/to range, up to the history your plan keeps. Analytics and its CSV exports now reach 90 days on plans that keep 90 days, instead of stopping at 30. The command centre also accepts a 24-hour window, and withholds only the figures that need 7 days.
NEWFunnels compare builds: each player is counted on the build they entered the funnel on, so you can see whether a release moved a step.
FIXEDIssue merges now apply everywhere: the read API, the Top signatures on your command centre, the MCP tools and the new-issue alert all see the merged issue instead of its separate members.
FIXEDBreaking for read API users on a plan that keeps 30 days: days=90 returned 30 days of data under a 90-day label, so per-day rates read low; a days value beyond your plan’s retention is now refused with an explanation. The Issues page likewise offers only the ranges your plan keeps.
SDK 0.19.6 · CLI 0.3.1

Unity SDK 0.19.5 and 0.19.6: the last mobile batch arrives, and dropped telemetry is counted

FIXEDEXPECT MORE EVENTS AT THE END OF MOBILE SESSIONS once you update. Every mobile session lost its last batch when the app went to the background: the pause path queued it behind work that only runs on resume, and the OS usually kills a backgrounded app first. Since 0.19.5 that batch is written to disk and sent at once, as on quit.
NEWDropped telemetry is counted. When the SDK has to discard a payload (offline queue full, send queue full, rejected by the server, or a batch buffer overflow) it reports a tombstack.dropped_* metric by reason on the next successful upload, visible on your Fleet page and in the metric explorer. A game that drops nothing sends nothing.
FIXEDWith the zero-code setup, a Tombstack config asset still holding its placeholder endpoint or token started the SDK and sent everything nowhere, silently. The SDK now refuses to start and logs an error in the Console saying what to fill in, and the docs include that step.
IMPROVED0.19.6 names its version in an X-Tombstack-Client header on every upload, so a wire problem can be traced to a release, and the Documentation button in Unity’s Package Manager opens tombstack.com instead of a page that returned 404.
FIXEDCLI 0.3.1: tombstack-doctor reported FAIL on a healthy integration run with an ingest-only token, because it treated the read-back’s expected 403 as an error. It now marks that check as skipped and passes, so it can gate a CI pipeline.
Platform

Better crash grouping for new games, email and bad-build alerts, and release health over the API

NEWNew games use a second grouping version: when a report has a stack, the message no longer takes part in the issue key and only your own frames are hashed, so one bug with a number in its message, built on different machines or reached through different call paths, is one issue. Reports with no stack group as before. Existing games keep their grouping unless an owner or admin switches it in game settings; switching starts new issues and does not move old ones.
NEWMerging duplicate issues is now saved for your studio rather than living in the page URL, so a merge you make is what your colleagues see too.
NEWEmail alerts, and a real delivery log: every alert actually sent is recorded, instead of the history being reconstructed from current data after the fact. The players-affected threshold now counts the same crashes as the alert’s own window.
NEWBad-build alerts: the release-risk verdict from the Releases page now raises an alert when a build is crashing more than the rest of your fleet, instead of only showing on the page.
NEWRelease health is available in the read API (GET /api/v1/read/releases) and over MCP (get_release_health), graded by the same rule as the page. MCP also gains tools for metrics, matches, server detail and log-pull requests.
NEWRead API paging and fixed windows: crashes, bug reports and events take a cursor, so you can page past the newest 200 rows and export your history, and every read route accepts from and to (ISO-8601, UTC) beside days, so a report can be reproduced the next day. The MCP tools can use both.
IMPROVEDSecurity hardening: rate limiting.
Platform

Pages that paint at once, a searchable Graveyard, saved triage views and funnel exports

IMPROVEDDashboard pages now show their navigation and a loading skeleton right away and fill in as data arrives, instead of a blank screen until the slowest read finished. The work behind a heavy page is not faster yet, but you can see where you are and leave while it runs.
NEWIssue triage: text search on the Graveyard, a time range from 24 hours to 90 days, eight sort orders instead of three, and saved views you can name, share with your studio and link to.
NEWConditional mute: mute an issue until it gets N more events or N more players, so a minor exception you silenced comes back if a release makes it worse. A plain mute still lasts until you unmute it.
NEWBreadcrumb search, with level and category filters, on every crash’s 50-entry trail. It searches the redacted text, never the raw values.
NEWFunnels gain CSV export, a comparison with the previous period, a trend, and a warning when your events fire in a different order than the saved steps, which can make a healthy funnel read as a total drop-off. Audiences gain CSV export and behavioural rules: players who did, or did not, fire an event in the last 1 to 30 closed UTC days.
NEWA reporting time zone for your studio, set on the Billing page. New players on the Sessions page is now cut at your studio’s own midnight; other daily figures are still cut in UTC.
IMPROVEDA shared dashboard link now carries the environment and platform it was viewed with, so a colleague who opens it sees the same numbers under the same title.
FIXEDFixes: the Issues OS filter offers Android and iOS instead of filing most mobile crashes under Other; Settings showed a Unity install URL that could not be cloned and now shows the public package URL; a token’s last-used date now updates, so you can tell whether a build still uses it before you revoke it; and a batch of 201 to 256 items, which a Unity build could send after a delayed session start, is accepted instead of rejected.
Platform

Release health that flags a bad build at any adoption, and crash-free players per build

NEWRelease health now compares every build against the rest of your fleet instead of crowning the most-used one. A build crashing far more than the others is flagged red and sorted to the top even at low adoption, so a small rollout cannot hide behind a large healthy build. Under 30 sessions a build is shown as unmeasured, with no verdict, rather than green.
NEWCrash-free players per build, beside crash-free sessions, and the rollout banner now uses each build’s share of the last 24 hours rather than its 30-day share, so it names the build that is actually rolling out. With a platform filter the rates are scoped to that platform instead of being blanked.
NEWYour own crash grouping: a crash sent to the ingest API with a fingerprint field is grouped by that value, whatever its stack says. The field was accepted before but ignored.
IMPROVEDAlert cooldowns can be set per rule, and an alert held back by its cooldown is now shown as withheld instead of disappearing silently.
FIXEDEXPECT THE DAY-ONE RETURN PANEL TO READ HIGHER. It measured from midnight UTC of the install day instead of from the player’s first session, so an evening install had only a few hours to count as a return. It now measures 24 hours from the first session, and only counts players whose 24 hours have passed.
FIXEDThe Sessions page could time out on busy games and show nothing. Its reads are now bounded and keep the most recent data, and the page tells you when its window starts later than the range you asked for.
IMPROVEDSecurity hardening: secret redaction in stored reports.
Platform

Revenue, economy, progression and app hangs read your whole range, and a new Ads panel

FIXEDEXPECT YOUR REVENUE, ECONOMY, PROGRESSION AND APP-HANG PANELS TO SHOW MORE. They were computed from the newest 1,000 events of every kind, which on a busy game is a small part of one day, under a 7- or 30-day label. They now read their own events across the whole range you pick. One honest limit: events stored before this change are not covered by the new read, and each card states the date it is complete from.
NEWAn Ads panel on Analytics. The SDK’s TrackAdImpression calls were stored but never read; you now get impressions, revenue and eCPM by network and by placement. Revenue is shown in micros with no currency, because the SDK is not told the currency, and eCPM divides by priced impressions only, with the unpriced count beside it, since many networks report revenue late or in aggregate.
IMPROVEDOver MCP, list_events can now ask for one event name. The five standard tmb.* events are read across the whole window; a custom name is still filtered from the most recent events, and the tool tells the model to check whether the read was cut short before quoting a count.
Platform

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.
Platform

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.
Platform

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.
SDK 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.
Platform

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.
Platform

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.
Platform

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
Platform

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
Platform

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
Platform

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
Platform

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
SDK 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)
Platform

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
SDK 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
Platform

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
Billing

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
SDK 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
Platform

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
SDK 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
SDK 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
Platform

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, or follow the changelog RSS feed.