Data package
Pricing-page corpus: the data
Two rows per vendor, one per language arm, every field machine-derived from a rendered page that is archived. The definition is stricter than most published counts, which is part of why the rate here is lower: a fact about definitions, not a claim that anyone else is wrong.
What was measured
The unit is the pricing page a visitor reaches from the vendor's own homepage navigation: English under Accept-Language: en-US, German under de-DE. Not “a pricing page exists somewhere”: a page nobody can navigate to is not a disclosure.
The frame is frame.md, the vendor list, fixed before any page was opened. Every observation carries the language the page actually came back in, detected from the text, rather than the language that was asked for, and 19 of 34 German-arm pages came back in English.
The contact-wall figure is two fields, not one. The first version of this corpus reported the loose code as a single number and should not have: 16 of the 27 pages it counted carry the same phrase on the vendor's homepage, where there are no tiers at all, so the loose code cannot separate a tier-level contact wall from site-wide chrome. Both codes are published and the honest statement is the range between them.
Files
Text and CSV throughout. Nothing here needs an account or a tool to open.
- codebook.md 3 kB The definition, every field, why the contact wall is two fields, the two collection defects, and the standing limitations.
- corpus.csv 13 kB The corpus. Two rows per vendor:
arm,status,valid,content_lang,shows_price, both contact-wall codes,n_price_pointsand the rendered-DOM hash. - frame.md 3 kB The vendor list, fixed before any page was opened. Also the frame the gross-margin panel reuses.
valid is false when the fetch never returned a real page. That is missing data, never a negative: 21 of 128 observations across 13 vendors are unmeasured and carry an UNMEASURED_* status rather than being counted as opacity.
Two collection defects, recorded rather than buried
Both were found after a first collection and are stated here because a corpus whose defects are only in its author’s head is not checkable.
1. A first collection scored 53 CDN challenge pages and consent interstitials as vendors with no pricing link. Cause: an unfingerprinted headless browser and no validity screen on a render. Every observation now passes an anchor-count and byte floor with one retry; anything that still fails is UNMEASURED_*. 2. A same-domain filter rejected vendor subdomains, discarding DocuSign's "Plans & Pricing" link because it points at ecom.docusign.com.
Full archives of every rendered page, the collector as run, and the audit that caught the first defect are retained in the source library alongside the published files.
Standing limitations
- Collection ran from a German IP, so geo-routing and
Accept-Languagecan disagree. This is measured rather than assumed:content_langrecords what actually came back, and 19 of 34 German-arm pages came back in English. - One observation per vendor per arm, on one day. Page churn is unmeasured.
- Contact-CTA detection is an English/German phrase list. Unusual wording reads as no wall.
n_price_pointsis a proxy for priced tiers, not a tier count. Add-ons and monthly/annual pairs inflate it.- The frame is US-listed public cloud companies. It is not “SaaS” and generalises to nothing wider.
Licence and citation
Released under CC BY 4.0: reuse it, including to disagree with it.
Isoglu, S. (2026). Pricing-page corpus: what listed cloud vendors show on the page a visitor can reach. isoglu.com.