Skip to content

[Feat]: Catalog items with no public price ("price on request") #877

Description

@evoleinik

Is your feature request related to a problem? Please describe.

UCP catalog requires a price on every item. product.price_range and variant.price are required, price.amount says "Use 0 for free items", and REST conformance requires "valid Price objects".

Many B2B sellers publish a catalog but no prices. The price depends on the contract, the volume or an NDA, and the buyer gets it from a quote. @juanferrub's B2B note in #812 names contracts and volume tiers among the inputs.

We (AirShelf) built UCP endpoints for two such sellers. One leases office equipment on quoted terms. The other sells security software and shares prices only under NDA. Between them they list 318 products, and none has a price we could send. Each option we had breaks something:

  1. Send amount: 0 with a disclosure warning. It is schema-valid, but 0 means free. A platform that skips messages shows "$0.00" on a leased printer.
  2. Omit price and send a disclosure warning. It is honest, and it is what we built. It fails the schema, and @ucp-js/sdk 0.5.1 rejects any response with an unpriced variant.
  3. Skip catalog and offer only ask. It conforms, but catalog-first platforms cannot list the products at all.

Nearby work covers other steps. Identity linking lets a signed-in buyer see member pricing, and we use it for buyers who sign the NDA, but public discovery still has no price. #845 and #812 cover terms once a quote exists, and this gap is one step earlier, at listing. #810 keeps price required on each offer.

Price has been required since the first catalog PR (#55), which modelled a single seller's DTC catalog. B2B implementers so far add RFQ as vendor extensions, such as Shopware's com.shopware.quote and UCPReady's com.ucpready.procurement (#93). Both add a quote flow. Neither can remove the price requirement from the listing, for the reason below.

Describe the solution you'd like

A structured way for a Business to say "no public price for this item", so a Platform never has to read it from prose. One possible shape:

  • variant.price and product.price_range become optional only when the variant says why, for example "pricing": "on_request".
  • A Platform MUST NOT show a price for such a variant, and MUST NOT treat the missing price as 0.
  • Price filters exclude such variants.
  • The price reaches the buyer through identity linking or a quote ([Proposal]: Accepted commercial term handoff into UCP Cart/Checkout #845), never through catalog.

A well-known message code such as price_on_request with presentation: "disclosure" could carry the wording a Platform shows the buyer.

Describe alternatives you've considered

The three options above. A vendor extension cannot fix this, because an extension composes with allOf and can add a field but cannot relax a required one. So every B2B seller hits the same wall until core allows it.

Additional context

Happy to share our implementation and the responses it sends.

Code of Conduct

  • I agree to follow this project's Code of Conduct

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions