Data packageCollected 9 Aug 2026Two language armsCC BY 4.0
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.
The unit of observation
The pricing page a visitor reaches from the vendor’s own homepage navigation.
- English arm
- Accept-Language: en-US
- German arm
- Accept-Language: de-DE
- Frame
- 64 vendors, fixed before any page was opened
- Folder
- /data/pricing-pages-2026-08/
- Vendors in the frame
- 64BVP Nasdaq Emerging Cloud Index
- Observations
- 128two per vendor, one per arm
- Unmeasured
- 21of 128, across 13 vendors: missing, never negative
- Licence
- CC BY 4.0Reuse it, including to disagree with it.
What was measured
The page a visitor can actually reach.
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 two arms
From 64 vendors to the page that sorts its buyers.
Each arm drawn as the cascade the essay publishes. The marked rows are the ones the argument rests on.
Figure 1The English arm, from index to hybrid pages
Two codes for one question: of the 33 pages that show a price, between 19 and 26 also route some buyers to sales.
Source: author’s own coding, 64 BVP Nasdaq Emerging Cloud Index constituents, English arm, 9 Aug 2026.
Figure 2The German arm: translated, not localised
Fifteen of 64 companies present a genuinely German pricing page, and eight of those fifteen still price in US dollars.
Source: author’s own coding, same 64 constituents, German arm (de-DE), 9 Aug 2026.
Two fields, not one
The contact wall is a range, and the range is the finding.
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.
Figure 3English pages that show a price and also route some buyers to sales
The range between the two codes
The strict code counts a contact prompt within about 1,500 characters of a price, roughly inside the tier block. The loose code counts one anywhere on the page.
Fields: contact_wall_near_price and contact_wall_anywhere. Base: the 33 English-arm pages with at least one rendered price.
Missing data
Unmeasured is never counted as opaque.
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.
Figure 4The status of every observation, by arm
codedno_pricing_link_in_navUNMEASURED_*
English armen-US
German armde-DE
Counted from corpus.csv. Unmeasured: 9 homepages and 12 pricing pages blocked, all kept in the file with that status.
The corpus
Two rows per vendor, as coded.
Ten rows sampled from the file and shown exactly as they appear in it, blanks included.
| symbol | arm | status | valid | content_ | shows_ | n_price_ | contact_wall_ | contact_wall_ | currencies | dom_sha256 |
|---|---|---|---|---|---|---|---|---|---|---|
| ADBE | en | coded | True | en | True | 5 | False | False | USD | 979e5c7a641a096e |
| ADBE | de3 | coded | True | en | False | 0 | False | False | USD | 781958f64ffb2804 |
| AGYS | en | no_pricing_link_in_nav | True | |||||||
| AI | en2 | UNMEASURED_homepage_blocked | False | |||||||
| ASAN | de | coded | True | de | True | 5 | True | True | EUR|USD | 3523a694b4626102 |
| DOCU | en1 | coded | True | de | True | 31 | True | True | EUR|GBP|USD | c97228509df059b9 |
| HUBS | de | coded | True | de | True | 11 | True | True | EUR|USD | ecc4af4f53fc1620 |
| PD | en4 | coded | True | en | True | 16 | False | False | USD | 59e2e92441024aec |
| SHOP | de2 | UNMEASURED_pricing_page_blocked | False | |||||||
| WIX | de | coded | True | de | False | 0 | False | False | EUR | 62b36294961aedd1 |
1DOCU: the “Plans & Pricing” link points at ecom.docusign.com, the subdomain a same-domain filter discarded in the first collection. Asked for in en-US, the page came back in German: collection ran from a German IP.
2AI, SHOP: valid = False. The fetch never returned a real page, so every coded field is blank: missing data, never a negative.
3ADBE de: asked for in de-DE, served in English. 19 of the 34 reachable German-arm pages came back in English.
4PD en: a price on the page and no contact-sales prompt anywhere on it, one of seven such English pages.
The codebook
Every field, machine-derived from an archived render.
- arm
enorde: the language the request asked for.- status
coded,no_pricing_link_in_nav, orUNMEASURED_*.- valid
- False when the fetch never returned a real page. Missing data, never a negative.
- content_lang
- The language the page actually came back in, detected from the text.
- shows_price
- At least one currency amount rendered on the page.
- contact_wall_near_price
- A contact-sales prompt within 1,500 characters of a price: the strict, tier-level reading.
- contact_wall_anywhere
- A contact-sales prompt anywhere on the page: the loose reading.
- n_price_points
- The count of distinct currency amounts. A proxy for priced tiers, not a tier count: add-ons and monthly and annual pairs inflate it.
- dom_sha256
- The first 16 hex characters of the rendered DOM hash.
The frame
Fixed before any page was opened.
The 64 constituents of the BVP Nasdaq Emerging Cloud Index, read from the data payload of cloudindex.bvp.com/companies on 9 August 2026. Chosen because it is public, enumerable, dated and not conditioned on pricing visibility: a universe built by tracking pricing pages cannot contain a vendor that has none.
- 1ADBEAdobeadobe.com
- 2AGYSAgilysysagilysys.com
- 3AIC3.aic3.ai
- 4ALKTAlkamialkami.com
- 5APPFAppFolioappfolio.com
- 6ASANAsanaasana.com
- 7AVPTAvePointavepoint.com
- 8BILLBill.combill.com
- 9BLBlackLineblackline.com
- 10BRZEBrazebraze.com
- 11CLBTCellebritecellebrite.com
- 12CRMSalesforcesalesforce.com
- 13CRWDCrowdstrikecrowdstrike.com
- 14CXMSprinklrsprinklr.com
- 15DDOGDatadogdatadoghq.com
- 16DOCNDigitalOceandigitalocean.com
- 17DOCUDocuSigndocusign.com
- 18DTDynatracedynatrace.com
- 19ESTCElasticelastic.co
- 20FIGFigmafigma.com
- 21FIVNFive9five9.com
- 22FROGJFrogjfrog.com
- 23FRSHFreshworksfreshworks.com
- 24FSLYFastlyfastly.com
- 25GTLBGitlabgitlab.com
- 26HUBSHubSpothubspot.com
- 27INTAIntappintapp.com
- 28IOTSamsarasamsara.com
- 29KVYOKlaviyoklaviyo.com
- 30MDBMongoDBmongodb.com
- 31MNDYMonday.commonday.com
- 32NCNOnCinoncino.com
- 33NETCloudflarecloudflare.com
- 34NOWServiceNowservicenow.com
- 35NTNXNutanixnutanix.com
- 36OKTAOktaokta.com
- 37PANWPalo Alto Networkspaloaltonetworks.com
- 38PATHUiPathuipath.com
- 39PAYCPaycompaycom.com
- 40PCORProcoreprocore.com
- 41PCTYPaylocitypaylocity.com
- 42PDPagerDutypagerduty.com
- 43PLTRPalantirpalantir.com
- 44QLYSQualysqualys.com
- 45QTWOQ2q2.com
- 46RBRKRubrikrubrik.com
- 47RNGRingcentralringcentral.com
- 48SSentinelOnesentinelone.com
- 49SAILSailPointsailpoint.com
- 50SHOPShopifyshopify.com
- 51SNOWSnowflakesnowflake.com
- 52SPSCSPS Commercespscommerce.com
- 53TEAMAtlassianatlassian.com
- 54TENBTenabletenable.com
- 55TOSTToasttoasttab.com
- 56TTANServiceTitanservicetitan.com
- 57TWLOTwiliotwilio.com
- 58VEEVVeeva Systemsveeva.com
- 59WDAYWorkdayworkday.com
- 60WEAVWeavegetweave.com
- 61WIXWixwix.com
- 62WKWorkivaworkiva.com
- 63ZETAZetazetaglobal.com
- 64ZSZscalerzscaler.com
NoteA natural-language read of the same page reported “101 total companies”. The payload holds 64. The list above is the payload.
ReusedThe same frame carries the gross-margin panel
Collection defects
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.
- Defect 1
53 challenge pages scored as vendors with no pricing link.
A first collection scored 53 CDN challenge pages and consent interstitials as vendors with no pricing link. The cause was 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_*. - Defect 2
A same-domain filter rejected vendor subdomains.
It discarded 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
What the corpus cannot carry.
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.
Files
Three files, readable in anything.
Text and CSV throughout. Nothing here needs an account or a tool to open.
- codebook.mdThe definition, every field, why the contact wall is two fields, the two collection defects, and the standing limitations.3 kB Download
- corpus.csvThe corpus. Two rows per vendor:13 kB Download
arm,status,valid,content_lang,shows_price, both contact-wall codes,n_price_pointsand the rendered-DOM hash. - frame.mdThe vendor list, fixed before any page was opened. Also the frame the gross-margin panel reuses.3 kB Download
Licence and citation
Reuse it, including to disagree with it.
Cite the data
Isoglu, S. (2026). Pricing-page corpus: what listed cloud vendors show on the page a visitor can reach. isoglu.com.
Released under CC BY 4.0.
- Package
- pricing-pages-2026-08
- Published
- 9 Aug 2026
- Codebook
- 9 August 2026
- Frame shared with
- Gross-margin panel
- Also in German
- Preisseiten-Korpus
Elsewhere in the data
The argument, and the two packages beside it.
Contact
Bring the question you're working on.
Research, a guest lecture, or a commercial question.