The cents test
The cents test is a two-minute check for whether a published price dataset was measured or typed. Count how many values have a final digit of zero. In genuine auction data that digit is close to uniform, so about one value in ten ends in zero. In numbers a person invented, it is usually three to six in ten, because people reach for round cents without noticing they are doing it.
I did not learn this from a paper. I learned it by running it against my own site and discovering that every single number I had published was fabricated, including the ones I was certain were real.
How this came up
In July 2026 I sat down to refresh this site's data and asked a boring question first: what does a refresh actually cost in API credits? Answering it meant reading my own collection script for the first time in months.
The seed file for the Meta and TikTok figures had a comment at the top, written by me, stating that the values were estimated from platform ratios. Google CPC multiplied by a coefficient I had chosen. 109 keywords, rendered in a table as though they had been measured.
That made me suspicious of the Google numbers, which I was sure were genuine. They were not, and the cents test is how I proved it to myself.
The numbers from this site
Every CPC value the site had ever published, grouped by where it came from, against the first genuine API pull:
| Source | Values | Ending in 0 | Probability if genuine |
|---|---|---|---|
| Google, hand-written | 105 | 58.1% | 8×10⁻³⁴ |
| Meta, ratio-derived | 57 | 80.7% | 6×10⁻³⁶ |
| TikTok, ratio-derived | 52 | 46.2% | 3×10⁻¹¹ |
| All previously published data | 214 | 61.2% | 1×10⁻⁷⁴ |
| DataForSEO, measured | 98 | 13.3% | 0.18 |
The last row is the control. 13.3% against an expected 10% is ordinary sampling noise, and a binomial test puts it at p = 0.18. Nothing to explain. The rows above it are not close calls.
Why it works
Cost per click is a clearing price from a continuous auction, divided out across clicks and rounded to cents at the end. The final digit carries no information anybody optimises for, so it lands roughly uniformly across the ten possibilities.
Human number generation does not behave that way. Asked to invent something plausible near four dollars, people produce $4.20 or $4.50, rarely $4.17 and almost never $4.03. The bias is unconscious and it survives effort: I knew the numbers needed to look varied, and I still put 58% of them on a zero.
This is a cousin of Benford's law, which looks at leading digits, but it is easier to apply and easier to defend. Leading-digit distributions depend on how the quantity is generated and span several orders of magnitude. The final cent of a rounded price is close to uniform for almost any pricing process, which makes the null hypothesis simple: one in ten.
What the test does not prove
This is the part that matters if you are about to confront a vendor, so read it before you do.
Display rounding produces the same signature. A tool that rounds everything to the nearest $0.10 for readability will show a very high share of zeros while being entirely honest about entirely real data. Check whether the whole set is rounded consistently. If almost no value anywhere has an odd cent, you are looking at formatting, not fabrication.
Aggregation can do it too. Averages published to two decimals from a small number of underlying values, or figures converted between currencies and rounded, drift toward round cents without anyone inventing anything.
A pass is not a clean bill of health. Anyone who knows about the test can generate uniform final digits trivially. The test catches carelessness, not determined deception. It is a smell, not a verdict.
What a failed test justifies is a question, not an accusation. The useful question is: what is the source, and on what date was it collected. A vendor with real data answers that in one sentence.
How many zeros are too many
With a small sample you need a lot of zeros before the result means anything. These are the thresholds at which the result stops being explainable by chance, at p < 0.01 against a uniform final digit:
| Sample size | Threshold | As a share |
|---|---|---|
| 20 | 7 | 35% |
| 30 | 8 | 27% |
| 50 | 11 | 22% |
| 100 | 19 | 19% |
| 200 | 31 | 16% |
Thirty values is enough to be worth doing and is usually what fits in a screenshot of somebody's benchmark table.
How to run it
In a spreadsheet, with your values in column A:
=COUNTIF(ARRAYFORMULA(MOD(ROUND(A1:A100*100,0),10)), 0) / COUNT(A1:A100)
Or, if you would rather see the whole distribution and a p-value:
from collections import Counter
from math import comb
def cents_test(values):
digits = Counter(round(round(v, 2) * 100) % 10 for v in values)
n, k = len(values), digits[0]
p = sum(comb(n, i) * 0.1**i * 0.9**(n - i) for i in range(k, n + 1))
print(f"{k}/{n} end in zero ({k/n:.1%}), p = {p:.3g}")
for d in range(10):
print(f" .{d} {digits[d]/n:6.1%} {'#' * round(digits[d]/n*100)}")
What we did about it
Everything was deleted. All 214 values, including the ones that had been on the site since it launched.
What replaced them is one genuine API pull covering 98 Google Search keywords across 14 industries, stored as a dated snapshot. It cost nine cents, because the API bills per request rather than per keyword, which is another thing I had been getting wrong.
Meta and TikTok are gone entirely rather than re-sourced. Our supplier sells keyword-level cost data for Google Ads and does not sell an equivalent for those platforms at any price, so there is no honest way to fill those columns. They are listed as scope limits on the methodology page, not as coming soon.
The uncomfortable part
None of this happened because I am rigorous. It happened because I asked an inconvenient question about cost and could not stop pulling the thread. The data had been wrong for months, in public, and nobody had complained, because nobody checks.
That is the actual lesson and it is not flattering. If you publish benchmark data, someone should be able to run this test against you and get a boring result. If you consume benchmark data, run it. It takes two minutes and the results are educational.
The current dataset is free, requires no signup, and you can start with the industry reports. Run the test on it. If it fails, write to us.