Description
PriceVeil turns a WooCommerce store into a price-free catalogue and puts a
Request a quote button where the price used to be. It is built for B2B
ecommerce, wholesale, made-to-order and dealer stores — the shops that publish a
catalogue but price every customer individually.
The five-minute tour: hiding every price, catalog mode, variable products, the
quote request, and pricing a request into a paid order.
It hides price information at every surface a price can leak — not only the
visible label, but the numeric fields in the Store API JSON that block themes
ship to every visitor, in SEO schema, in feeds and in GraphQL.
The approach: find every surface that leaks a price, close it, and prove it
stays closed.
Wholesale pricing, handled by quote
Wholesale pricing is rarely one number. The trade customer, the distributor and
the walk-in each pay something different, and publishing any of it on a public
product page is the thing most B2B ecommerce stores actually want to avoid.
PriceVeil’s answer is not a second price list. It removes the public number
entirely — a call for price / price on request catalogue — and routes the
customer into a quotation system you answer yourself: they ask, you price it,
they pay. Turn WooCommerce catalog mode on and the button goes with the price: hide add to
cart everywhere, so nobody can buy at a number you never agreed to.
If you would rather keep selling to the public and only hide prices from
strangers, switch to guests-only: a login to see price catalogue where signed-in
customers still see prices and check out normally.
Read the full documentation — setup and
settings, what gets hidden and what you should check yourself, catalog mode, who sees
prices, the quote request form and quote orders, and verifying every surface with WP-CLI.
Feature comparison and pricing: erenlabs.net/plugins/priceveil
What it covers
PriceVeil hides prices on every one of these surfaces:
- Storefront: single product, shop loop, related products, grouped products, variable price ranges and the inline variation JSON — numeric fields included, not just the label.
- Store API (block themes): product prices,
price_html, the collection price-range aggregation and cart totals are blanked server-side, so client-rendered themes have nothing to show. - Structured data: WooCommerce core JSON-LD offers, plus Rank Math, Yoast SEO, All in One SEO and Schema & Structured Data for WP product schema.
- WooCommerce REST API (
wc/v3,wc/v2): product and variation price fields, so a read-scoped API key handed to a third-party service reveals nothing. - GraphQL (WPGraphQL / WooGraphQL): product price fields blanked at field resolution.
- Cart, mini-cart, checkout, emails: classic PHP-rendered price output and quote-order customer emails.
- Catalog mode: hide prices and the add-to-cart button together — it disappears from classic and block templates, and the Store API rejects cart writes — the API cannot be used as a side door around the missing button.
Request a quote
Wherever you hide prices, a configurable button and form replace the price on product pages (also available as the [priceveil_form] shortcode). Requests arrive as Quote Request orders in your normal WooCommerce orders screen — HPOS-compatible, never counted as revenue, never in reports — and you get an email with one-click reply to the customer.
The public form is protected by a nonce, a honeypot and a per-IP rate limit.
Speaks your customers’ language
PriceVeil ships in 8 languages — English, Turkish, Spanish, German, French, Italian, Brazilian Portuguese and Arabic (with right-to-left layout). It follows the site language automatically and falls back to English for anything else, and admins can switch the plugin’s own language from a control in the header without changing the rest of wp-admin. (In PriceVeil Pro, the customer’s quote page also detects each visitor’s own language and offers a switcher on the quote itself.)
Honest coverage reporting
The settings screen shows exactly which surfaces hide prices automatically and which you should check once yourself (product feed plugins, custom themes calling get_price() directly, edge caches). With WP-CLI you can run wp priceveil selftest after every WooCommerce update — it re-verifies every server-reachable surface and fails loudly on any leak.
Choose your audience
Hide prices for everyone, or for guests only so logged-in customers can see prices and buy normally.
Screenshots







Blocks
This plugin provides 1 block.
- PriceVeil Quote Form
Installation
- Upload the
priceveil-for-woocommercefolder to/wp-content/plugins/, or install it through the WordPress Plugins screen. - Activate the plugin. WooCommerce must be installed and active.
- Prices are hidden immediately. Fine-tune everything under WooCommerce PriceVeil.
FAQ
-
Does PriceVeil set wholesale price tiers or per-customer price lists?
-
No, and it is worth being clear about it. PriceVeil does not publish a second
set of numbers for trade customers. It handles wholesale pricing the other way
round: the public price comes off the catalogue entirely, the customer requests
a quote, and you price that request individually before it becomes a payable
order. If you need automatic tiered or role-based price lists, that is a
different kind of plugin — and the two can sit side by side. -
Is this a call for price / price on request plugin?
-
Yes, that is exactly the pattern. The price is removed and a button you label
yourself — “Request a quote”, “Call for price”, “Price on request”, whatever
suits your trade — takes its place, with a form behind it. The difference from
most plugins of this kind is where the hiding happens: the number is gone from
the Store API, the JSON-LD schema, the REST API and GraphQL as well as the
visible label, so a block theme or a feed cannot quietly reveal it. -
Both. WooCommerce catalog mode hides the price and the add to cart button together — hide
add to cart and it disappears from classic and block templates, and the Store API rejects cart
writes, so the API cannot be used as a side door around the missing button. And
the audience control lets you run a login to see price catalogue instead: guests
see no prices, signed-in customers see them and buy normally. -
Removed server-side. The price fields are blanked before the HTML or JSON leaves your server, so cached pages, API responses and view-source contain no price at all.
-
Does it work with block themes?
-
Yes. Block themes render prices from the Store API JSON, and PriceVeil blanks the numeric fields in those responses server-side.
-
Can logged-in customers still see prices?
-
Yes — set “Hide prices for” to Guests only and logged-in users get the normal store, including purchasing.
-
Where do quote requests go?
-
They are created as native WooCommerce orders with a special “Quote Request” status: visible in your orders list, excluded from revenue and reports, and announced by email. No extra tables, HPOS-compatible.
-
Do quote orders affect my revenue reports?
-
No. The Quote Request status is excluded from paid statuses and from WooCommerce reports.
-
What is NOT covered automatically?
-
Product feed plugins (they export prices on purpose), custom theme code that calls
$product->get_price()directly, and edge caches primed before activation. The settings screen lists these, andwp priceveil selftestverifies everything that is reachable server-side.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“PriceVeil – Request a Quote, Hide Price & Wholesale Pricing for WooCommerce” is open source software. The following people have contributed to this plugin.
Contributors“PriceVeil – Request a Quote, Hide Price & Wholesale Pricing for WooCommerce” has been translated into 1 locale. Thank you to the translators for their contributions.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.8
- Fixed: the pricing table on the Upgrade screen laid out two columns instead of three, so the third plan sat alone on a second row and the highlighted “Best value” plan ended up in the corner rather than the middle. All three plans now sit on one row, equal height, and collapse to a single column on a narrow screen.
- Fixed: the three quote order statuses – Quote Request, Quote Sent, Quote Declined – showed in English on Arabic, German, Spanish, French, Italian and Portuguese stores, and one of them in Turkish, even though the translations existed. They are carried by every bundled language now.
1.0.7
- New: the Upgrade screen carries a full Eren Labs Store Suite section – what each of the six plugins does, a sample screen, who it is for, its own price, the bundle arithmetic beside the purchase box, and five questions.
- New: an “Upgrading takes a minute” block – pick a licence, activate in WordPress, and what appears once Pro is on. Your settings, your hidden prices and every quote already taken carry over untouched.
- Translations: 178 strings that had no entry in the translation template now have one, in all seven bundled languages – the new section plus older customer-facing quote messages that had always shown in English.
- Hardened: values submitted from the settings form are now sanitized where they are read from the request.
1.0.6
- New: Eren Labs Store Suite — the upgrade screen now shows the six-plugin suite and its single-licence bundle.
- New: the plugin accepts a Store Suite bundle licence; one key activates every Eren Labs plugin installed on the site.
1.0.5
- Compatibility: tested up to WooCommerce 11.1.
- Translations: the free package now bundles the Arabic, German, Spanish, French, Italian, Brazilian Portuguese and Turkish catalogs, so the admin screens follow your site language without waiting for translate.wordpress.org.
1.0.4
- Fixed: Pro group pricing reached the WooCommerce order editor — a shop manager in a customer group was adding lines to a customer’s order at their own discount; the order editor now prices at list, like the till.
1.0.3
- Now installs on PHP 7.4 and 8.0 (was 8.1 or later); verified with PHPCompatibilityWP.
- Fixed: the Pro pricing table listed two outdated plans; it now shows all three at current prices.
- Fixed: Pro group pricing reached the till through the AJAX exception — the till gets list prices, the storefront keeps group prices.
- Fixed: catalog mode removes the add-to-cart form in block themes too, and a cart line loses its totals on every Store API route.
- Fixed: a quote was offered on products the shop sells normally; the quote list appears only where the price is hidden; My Account no longer quotes a price the customer would never pay.
- Fixed: the JSON-LD offer and the GraphQL and third-party SEO schema hiders follow the same per-product targeting as the price; the price filter no longer publishes the range it hides; a category rule covers what is filed under it; changing targeting purges caches.
- Fixed: a quote email WordPress refused is no longer recorded as sent; an answered quote cannot be re-sent; the email goes out in the language the quote opens in; the expiry picker uses the shop’s day; the quote nonce outlives page caches.
- Fixed: an empty cart is not treated as a hidden cart; uninstall removes the per-user preference and completes on multisite.
- Improved: the Free vs Pro table meets WCAG AA contrast.
- Tested with WooCommerce 11 and WordPress 7.1.
1.0.2
- Tested with WooCommerce 11.
- Pro: updated the bundled licensing framework to its latest release.
1.0.1
- The plugin is now called PriceVeil. The text domain, language files and internal identifiers were renamed to match; behaviour and settings are unchanged.
1.0.0
- First public release: leak-tested price hiding across the storefront, Store API, structured data, the WooCommerce REST API and GraphQL; catalog mode; and a request-a-quote flow (nonce, honeypot and per-IP rate limit) that lands as native Quote Request orders excluded from revenue and reports.
- Available in 8 languages — English, Turkish, Spanish, German, French, Italian, Brazilian Portuguese and Arabic (right-to-left) — chosen automatically from the site/visitor language, with a per-user language switcher in the admin header and a language switcher on the customer quote page.
0.10.2
- Pro: the Requests console now spells out that sending a quote e-mails the customer — a note under the Send button shows the exact address the quote goes to, and the confirmation after sending states that it was e-mailed (with the accept/decline link) to that address.
0.10.1
- Pro: preparing a quote in the Requests console no longer reloads the page each time you add or remove a product — lines are added and removed in place and the live customer preview updates instantly.
- Pro: a product you add to a quote now defaults to an “Optional” add-on (the customer can choose to add it); switch it to Required or Alternative from the Type column if you prefer.
0.10.0
- Pro: the multi-product quote list is now a polished slide-in “quote drawer”. Adding a product slides it in from the side with the collected items — each with its thumbnail, a quantity stepper and a remove control — a live count, an empty state, and one clear “Request a quote for these items” action. A floating launcher reopens it anytime. It is a progressive enhancement of an in-flow list (usable without JavaScript), is keyboard-accessible (focus trap, Esc, scroll lock) and supports light and dark. Prices stay hidden throughout.
0.9.9
- Fixed: submitting the “Request a quote” form from the product-page modal failed with a generic “Error”. The form’s request was being sent to the wrong URL (a hidden field named “action” was shadowing the form’s action property in the browser), so no quote was created. Quote requests now submit correctly.
0.9.8
- Fixed: on variable products in catalog (quote) mode the “Add to cart” button could still appear alongside the variations form — it is now fully removed, matching simple products, so only the quote flow remains.
- Pro: the multi-product quote list is now a live mini-cart. Adding or removing a product updates the list and its counter instantly without reloading the page, and the “Add to quote list” button shows a running count and a brief confirmation.
For older releases, see changelog.txt.
