Blog/P50 vs P95 vs P99: Why Averages Lie
API Monitoring

P50 vs P95 vs P99: Why Averages Lie

A 100ms delay can cost 7% of conversions, and your average latency hides it. Here is how P50, P95, and P99 read, and where real users actually churn.

MS
Merse Sárvári, Founder, Statvisor
28 July 2026 · 8 min read

TL;DR

P50 is your median; P95 and P99 are the slow tail where users churn. Averages bury your worst requests, so alert on P95, investigate P99, and always read latency per route rather than as one blended number.

Your dashboard says the API averages 80ms. Your users say it is slow. Both are right. The average is a single number smeared across every request, and it quietly buries the slow ones that actually lose you customers.

Why Does the Slow Tail Hurt Most?

7%
conversion drop from a 100ms delay
53%
of mobile visitors leave a page slower than 3s
8.4%
retail conversion lift from a 0.1s speedup

A 100ms delay is invisible in your local terminal and expensive in production. We once shipped a /checkout route that averaged a healthy 40ms and still bled sales, because its P99 sat at 2 seconds. The visitors who abandon are almost never hitting your median request. They are hitting the tail, the slowest slice an average never shows you.

Developer laptop showing lines of code and a terminal
Local latency lies. Production percentiles tell the truth.

How Do You Read P50, P95, and P99?

PercentileMeaningWhat it tells you
P50 (median)Half of requests are fasterYour typical case, and an optimist
P951 in 20 requests is slowerWhere real users start to feel drag
P991 in 100 is slowerPower users and loud complaints live here
Three numbers that describe an API far better than one average.

Chase P95 and P99, not the mean. If P50 is 40ms and P99 is 2 seconds, you do not have a fast API. You have a fast demo and a slow product.

The arithmetic on a tiny sample makes it concrete. Take twenty request times: nineteen sit between 30 and 60ms, and one lands at 900ms. The average works out near 100ms, which looks acceptable and is a lie. The P50 is about 45ms. The P95, the line the slowest one-in-twenty crosses, is that 900ms request. A single outlier the mean quietly folds away is the whole P95 story, and it is the request a paying user just sat through.

Why Does Field Data Beat Synthetic Checks?

A synthetic ping from one clean region tells you the happy path works. It says nothing about the visitor on hotel wifi, the phone two hardware generations behind, or the request that hit a cold serverless function while the connection pool was still warming up. Those are the sessions that decide whether someone stays or leaves, and a scripted check never sees them. Real-user measurement, taken from actual production traffic, captures every one of them. It is also the version Google trusts: Core Web Vitals are graded at the 75th percentile of field data collected from real Chrome users, not from a lab run on a fast machine over a fast connection. When the slow tail turns out to be a database call rather than the network, the Supabase and Prisma latency guide walks through pinning the exact query.

Latency distribution chart with a long tail highlighted
The median sits on the left. Your churn lives out in the tail.

See Percentiles Per Route

Percentiles are only useful per route. An aggregate P99 hides which endpoint is the problem. If you run Express, Fastify, or NestJS, the Node framework monitoring guide shows the exact one-liner. Track them where the work happens:

typescript
import { Statvisor } from "@statvisor/sdk";

const sv = new Statvisor({ apiKey: process.env.STATVISOR_API_KEY! });

// P50/P95/P99 recorded for every route automatically
app.use(sv.express());

Statvisor breaks P50/P95/P99 down per route from real traffic, so a 2-second tail on /checkout stands out instead of dissolving into a healthy-looking average.

The One Habit Worth Keeping

Delete the average from your mental model. Alert on P95, investigate P99, and read them per endpoint. For how backend tails drag your frontend score, see how slow API routes kill your Core Web Vitals.

Ready to monitor your API in production?

Statvisor gives you latency percentiles, error rates, and request volume for every route, in minutes, not days.

Get started free →
MS

Written by

Merse Sárvári, Founder, Statvisor

Merse builds Statvisor and has spent years instrumenting JavaScript APIs and frontends for solo products and small teams.

Every post is written from hands-on experience building and running JavaScript apps, and reviewed for accuracy before publishing.