What analytics cannot tell you

Analytics counts events, and an event is a record of something that happened. That single fact draws a hard line around what any analytics tool can ever report. It cannot tell you about a screen nobody reached, because a thing that did not occur leaves nothing to count. It cannot tell you what a screen asked of somebody before they gave up. It cannot tell you which of the things you built are unreachable. Every one of those answers lives in your source code instead, and no amount of better dashboards moves them across.

Why can analytics not tell me about a screen nobody reached?

Because there is nothing to count. Analytics is built from events, and an event is a record that something occurred. A screen nobody visited produces no event, so in the data it is indistinguishable from a screen that does not exist at all.

This is not a gap any tool can close by trying harder. It is what counting things means. You can improve the dashboard, sample less, buy the expensive tier, and a screen with no visitors will still be absent rather than reported.

It matters because unreachable screens are common and expensive. Somebody changes a redirect and a whole onboarding step stops being linked. A feature ships and nothing in the navigation points at it. The team believes it is live. The traffic says nothing, because there is nothing to say.

What else falls in the gap?

What a screen asked for. You can see that four in ten people left the sign-up form. You cannot see that it demanded a phone number and a company name, because the demand is not an event.

Who was refused. A password rule, an email domain check, a country restriction. Somebody tried, the code said no, they left. Unless a developer thought to record that specific failure, it happened invisibly.

What people can press but never do. A button that exists in your product and has never once been used. Analytics can only compare presses against other presses; it has no list of the things that were pressable.

What changed, and what it did to people. A deployment is not an event in your product. So the connection between the thing you shipped on Tuesday and the fall that began on Tuesday is one somebody has to make by hand, from memory.

Where do those answers live instead?

In the source code, every time. The code is a complete statement of what was meant to happen: which screens exist, what links to what, what each form requires, which rules can refuse somebody, and what changed between one version and the next.

That is the useful way to think about the two halves. Your code is what you meant. Your analytics is what happened. Neither is the whole picture, and the interesting things are almost always where they disagree: a screen your code says is reachable and your traffic says nobody reached, or a button that exists in the source and has never been pressed.

Does that mean analytics is not worth having?

No, and it would be a silly conclusion to draw. Everything in the "what happened" half is real and you cannot get it any other way. Counting visitors is the first thing any product should do and it takes about a minute.

The point is narrower: it is one of two halves, and the missing half is not a smaller or more advanced version of the same thing. It is a different source entirely, and it is one you already have sitting in a repository.

Putting the two together is what userdrift does. It reads your code, draws your product as a map, and puts the visitor numbers you already collect on every screen. It reads your app and never changes it.

The tool this describes

userdrift tells you which screen is losing you the most users, why, and gives you the fix to paste into Lovable, Bolt, v0 or Cursor. Paste the link to your app and the first answer arrives in about a minute. Nothing to install, and nothing in your app changes until you say so.

Show me my app

Written by the team at userdrift. Last updated 2026-08-28. If something here is wrong, write to hello@userdrift.com and we will correct it.