The absence of a price looks uniform from outside and is not. When we cannot record a figure for a plan, the reason falls into one of several classes, and the classes tell a buyer different things: one is a commercial decision, one is a rendering choice, one is a broken page, and one is our own limitation rather than the vendor's. Collapsing them into a blank is the least informative thing a comparison site can do, so they are recorded separately and are worth separating when you are reading a pricing page yourself.
The cleanest case is the deliberate one. Twenty-one tiers across eighteen vendors are quote-gated, carrying a contact-sales flag rather than a figure, and that is a finding rather than a gap. A vendor that will not publish its enterprise price has decided that what you should pay depends on who you are, which is standard practice and worth knowing before you invest a fortnight in an evaluation. It also tends to mark the boundary of the self-serve product: below the line you can buy with a card, above it there is a conversation. Where a tier is quote-gated we record it as quote-gated, because 'contact sales' is an answer to the question, not a failure to answer it.
Then there are pages that publish the structure and withhold the numbers. Zoho Mail's pricing page carries its whole plan ladder, its billing basis and its no-monthly-plan flags in the served markup, and every numeric price is an empty placeholder filled in later by script. Capsule CRM does the same: the ladder, the toggle, the savings badge and one add-on figure all arrive, and the per-user plan prices do not. Mangools' table is a component loaded from elsewhere and rendered client-side, so a plain fetch returns plan names with nothing beside them. In every case the price is genuinely on the page for a person with a browser, and genuinely absent from what a simple request receives.
That distinction matters more than it first appears, and one of our own records makes the point against us. Veed's page returned no plan name, tier or amount to a plain fetch, which looks like the same story — except the file already held figures across five markets, collected earlier by a different method. So the page is client-side rendered and the figures are readable anyway. 'JS-gated' therefore describes a limitation of how something was read rather than a property of the vendor's page, and where we can only say the latter we should say the former. A buyer with a browser is not affected by any of this. It is worth knowing chiefly because a comparison table that silently omits such vendors is showing you a shortlist shaped by its own tooling.
A stranger class is the page that answers and the answer is empty. Pingdom's markup contains a currency symbol followed by a unit with nothing at all between them: the price furniture is there, and the figure is not. That is different from a page that never intended to show a number, and it usually means something failed rather than something was withheld. It is also the case most likely to mislead a reader in a hurry, because the shape of a price is present and the eye supplies the rest.
Sometimes the price exists and belongs to another company. Clipchamp names two tiers and delegates its pricing to Microsoft 365, so the figure that governs it lives on a different product's page under a different set of terms. Nothing is hidden and nothing is broken; the question has simply been referred elsewhere. For a buyer this is worth catching early, because the thing being priced is then a bundle you may be paying for already, or one that carries commitments unrelated to the tool you came for.
Occasionally the door is shut. DocSend's pricing page returns a security interstitial asking for JavaScript and cookies rather than any content at all. Nothing was read, and so nothing is recorded — not a zero, not an estimate, not a figure carried over from somewhere else. A vendor is entitled to protect its site, and we are obliged not to publish a number we did not see.
The most curious class is a discount with nothing to discount. Recraft's page advertises an offer with no base price anywhere in the markup, and Vidyard's prints a percentage off with no figure for it to apply to. One of those is an oddity. Two is a pattern, and it is a useful one to carry into any pricing page: an offer is being advertised more prominently than the price it modifies, and until you find the base figure the offer means nothing arithmetically. The same instinct applies to a tier priced by invitation, like Akismet's personal plan, which asks you to name your own amount and prints no floor at all. That is recorded as a plan with no price rather than as a free one, because nothing on the page says the amount may be zero.
It is worth ending on the vendors that do publish, because the contrast is sharper than the categories suggest. NordVPN's entry plan is $3.49 a month on its term rate, and its page prints the renewal price beside each plan, which is unusual and to its credit. Surfshark's entry plan is $2.49, and its pricing page nowhere states what any plan renews at after the introductory term. Same category, same shape of offer, and one of them answers a question the other leaves open. Neither is doing anything improper, and the difference is exactly the kind of thing worth weighing when two products look equivalent on features and price.
So when a price is missing, ask which kind of missing it is. If it is quote-gated, you have learned where the self-serve product ends. If the page shows structure and no numerals, open it in a browser and the number will be there. If the shape of a price is present and empty, treat the page as broken rather than the product as cheap. And if an offer is being advertised without a base price, find the base price before you evaluate the offer, because a percentage of an unknown is not a saving.