We could not find a public dataset of how SaaS vendors actually price and actually cancel. There are surveys of what buyers report, and there are vendor pricing pages, and there is nothing in between that a person can download and check.
So we built one, by hand, and published it under CC BY with the CSV attached. This is the part that does not fit on the report page: what it cost, and what we got wrong.
Reading pages by hand does not scale, which is the point
We read the published pricing of 30 vendors and recorded every tier — 143 of them — along with the conditions attached to each price. Separately we walked 13 cancellation flows step by step, clicking through each one and writing down what happened.
None of it was scraped. A scraper would have collected the numbers and lost exactly the thing that mattered: whether a given number is a price or a price conditional on annual prepayment, a seat minimum, or a separately-sold add-on. That distinction is a judgment call on prose, and it is where 29 of our tier records came from.
The cost of doing it by hand is that the dataset is small and dated. The pricing observations carry the date we verified them (May 20, 2026) precisely because they will rot, and a dataset that hides its own staleness is worse than a small one that admits it.
We retracted our own findings, in two different ways
The first way was a definition. We published a share of price tiers “carrying a condition” that had been counted off any tier with a footnote of any kind — and most footnotes turned out to describe what the tier includes, not what changes what you pay. The number was large and meaningless. Fixing it meant splitting the footnotes into two kinds and allowing only one of them into a published statistic — a named kind on every annotated tier now, with a test that refuses one left unlabelled.
The second way was a sentence. We had a taxonomy of 16 kinds of renewal mechanic, and we kept writing sentences of the form “each one a way the bill grows quietly” — a universal claim over a set whose members do not share the property.
They do not. An annual commitment billed monthly does not make the bill grow at all; the bill is identical every month and the commitment is what is invisible. An onboarding fee and an over-bought seat block are charges you agreed to at purchase, so no decision was outlived and nobody spent more than they chose.
Those sentences were true of most of the set, read well, and were false. They came out, more than once, including after this post was drafted. The counter-examples now sit in a comment in the source, beside both the labels the taxonomy renders and the figure those sentences cite, so the next person to write one finds the reason not to before they ship it.
The blanks are not zeros
The CSV has empty cells. A vendor whose cancellation flow we have not walked has no step count — not a step count of zero. That distinction survives fine on a rendered page, where the cell is visibly empty, and is destroyed the moment someone loads the file into a spreadsheet and averages a column.
So the dataset ships with a column dictionary that says, per column, what a blank means, and the same dictionary is published in the page’s machine-readable metadata. It is the least interesting part of the work and the part most likely to prevent someone from citing a number we did not measure.
Take it
The report is at the State of Subscription Waste, the CSV is linked from it, and the licence is CC BY — use it, cite it, and tell us if you find something in it that is wrong.