A product page with no price is not a broken product page — it is a different commercial model. The markup answer is short: emit Product for the item itself, omit offers entirely, and describe the commercial terms you can actually state with additionalProperty plus a link to the quote path. Do not put 0 , "N/A" , or "price on request" into a price field.
The cost of that decision is real: these URLs will not be eligible for the product rich result, because that feature is built around an offer with a real price. Take the trade deliberately and write it down in the ticket, or someone will "fix" it in six months by inventing a number.
Here is the process I run on B2B catalogues.
Step 1 — inventory the URL types, not the products
You are deciding markup per template, not per SKU.…