Method
How the coverage numbers are made.
The whole method behind every speed, tier and sample count on this site, including the parts that make our own figures look worse.
Who wrote this
Mara Ellison, Head of Measurement
Built the passive measurement pipeline described on the method page and signs off every coverage row before it publishes.
Responsible for
- The coverage measurement method
- Country speed rows and sample counts
- The public coverage dataset
Reviewed by Jonah Reyes
Passive measurement, not a speed test
A synthetic speed test opens a connection, floods it and records the peak. It measures the best a network can do for a few seconds while somebody is watching, and it spends your data to do it. We do not run them.
We record what already happened instead. When your phone loads a map tile, opens a page or carries a call, the operating system already knows how many bytes moved and how long they took. We take that and only that: bytes, duration, the network the phone was attached to, the radio it used, and a coarse location. No packet contents, no addresses, no page names.
The consequence is worth saying plainly. Our numbers come out lower than a speed test would give. A speed test on the same network in the same street prints a bigger figure because it is measuring a different thing. We publish the throughput you actually got while using your phone normally, which is the number that decides whether the video call holds.
Location is blurred before it is stored
Session location is rounded to a grid of about 1 km on a side on the phone, before anything is written anywhere. The precise coordinate is discarded on the device and never leaves it, so there is no fine trail to leak, to subpoena or to sell.
That is why we publish a country and a city and never a street. A cell of 1 km in central Tokyo holds tens of thousands of people, which is enough to say something useful about a network and not enough to say anything at all about you.
Aggregation sits on top of that. A row needs 25 distinct devices before it exists at all, so one traveller's week in a small town never becomes a public number about that town.
The rules that throw measurements away
Most of the method is deletion. Four rules decide what survives, and each of them exists because keeping the data made the published number wrong.
Every one of these rules lowers our headline figures. That is the test of whether a filter is honest: a filter that only ever raises your own numbers is not a filter, it is a selection.
- Sessions that moved less than 2 MB are dropped. A transfer that small finishes before the radio has ramped up, so it measures the ramp rather than the network.
- The first 60 seconds after the phone attaches to a network are dropped. Attach, authentication and the first bearer setup are slow by design and they are not what your afternoon looks like.
- A row built from fewer than 25 distinct devices is never published. Devices, not sessions, so one heavy user cannot turn into a country.
- Sessions where the phone is tethering a laptop are kept, because travellers really do that, and tagged, so we can check whether they are pulling a market up or down.
The filters, and the threshold each one uses
| Rule | Threshold | Why it exists |
|---|---|---|
| Minimum session size | 2 MB | Smaller transfers finish before the radio has ramped up |
| Warm up window | 60 seconds after attach | Attach and authentication are slow by design |
| Minimum distinct devices | 25 | One heavy traveller must never become a country |
| Location precision | About 1 km | Coarse enough to describe a network, not a person |
| Publication window | 90 days | Long enough to be stable, short enough to still be true |
Recomputed monthly. A row that stops meeting a threshold is withdrawn rather than frozen.
Why the tenth percentile matters more than the median
The median is the middle of your day. Half your sessions were faster and half were slower. It is a fair summary and it is not the number you feel.
What you feel is the bad ten minutes. The call that broke up in the taxi, the boarding pass that would not load at the gate, the map that stalled at the junction. Those live in the bottom tenth of the distribution and a median hides them completely. Two countries can post the same median and feel nothing like each other, because one of them has a long slow tail and the other does not.
So every row publishes both. The tenth percentile is the figure to read when you need the connection to work rather than to be fast: one session in ten was slower than that. When the two numbers sit far apart, the network is unreliable rather than slow, which is a different problem and usually the worse one.
It is also the number that flatters us least, which is the reason to believe we publish it.
75,333
Sessions behind the published rows
145
Destinations with measurements
25
Distinct devices before we publish a row
1 km
Location grid before anything is stored
What a published row contains
A row is a country and a carrier over a window of 90 days. It carries both figures, both counts and the radio mix, because a figure without its sample size is an opinion.
What every published row carries
| Field | What it means |
|---|---|
| Median Mbps | Half of the measured sessions were faster than this |
| Tenth percentile Mbps | One session in ten was slower than this |
| Distinct devices | How many separate phones the row is built from |
| Sessions | How many measured transfers survived the filters |
| Carriers | The upstream networks we attach to in that country |
| Window | The period the row covers, currently 90 days |
What this method cannot see
Passive measurement inherits the shape of our customers. It sees where they went, when they went and what they did there, and it is blind to everywhere else. The blind spots below are structural, so no amount of extra traffic removes them.
- Places our customers do not go. Heavy coverage of two cities tells you nothing about the third.
- Networks we have no agreement with. We only measure the carriers we attach to, so a rival network in the same country may well be better and we would not know.
- The ceiling of a network. Nobody was downloading hard enough to find it, so our figure is a floor on what the network can do rather than a limit.
- Indoors against outdoors. We do not know whether you were in a basement, and a basement is most of the reason a number comes out low.
- Anything before we had customers in a market. A destination that went live last month has a short window and a thin sample, and both are printed on the page.
- Congestion nobody of ours sat in. If none of our travellers were in the stadium at kick off, the stadium is not in the data.
Where the method is weakest
Three weaknesses change how you should read a row, so they belong here rather than in a footnote.
The first is thin markets. 5 of our 145 destinations run on a single upstream network, and there the number describes one carrier rather than a country. The second is device mix. iOS and Android report timing slightly differently, and our correction for that gap is an estimate rather than a measurement, so a market that leans hard to one platform carries more error than its sample count suggests. The third is time of day. We publish a 90 day window with no adjustment for the hour, so a country whose travellers mostly arrive on weekend evenings looks slower than one whose travellers arrive on Tuesday mornings.
None of these get fixed by a bigger sample. They are limits of the design, and a number that arrives with its limits attached is worth more than one that does not.
Consent, and how to leave
Measurement is on by default and off in one tap in the app, under privacy. Turning it off changes nothing about your service, your price or your support queue.
A device that has opted out sends nothing, including the coarse location, and we delete what it sent before. We do not sell any of this. The aggregate is free for anybody to use, which is the opposite of a data business and is deliberate: the dataset is worth more to us as a public argument than as a private asset.
How to cite these numbers, and how to challenge them
This page is the citation target. If you are quoting a figure from a coverage page, cite that page and the date you read it, because rows are recomputed monthly and the number will move.
The full dataset is JSON at /api/coverage with no key and no rate limit, and the machine readable summary is at /llms.txt. The attribution we ask for is a link to the page the number came from. That is the whole licence.
If you can show that a figure is wrong, tell us. Corrections go on the truth report with the date and what changed, whether or not the correction makes us look good. That is the only way a published number means anything.
Questions people ask about the method
Do you run speed tests on my phone?
Can you see which sites I visited?
Why is your figure lower than the speed test I just ran?
What does the tenth percentile actually mean?
Why is a country missing from the coverage pages?
Can I turn measurement off?
Can I reuse your data?
Check a country before you buy it.
Every destination page prints the carriers we use, the median, the tenth percentile and the sample count, including the markets where we come out badly.