CALIPRY

Why Splash quotes some products instead of selling them

Last checked against Splash 1.0.0 / 2026-08-15

Some work cannot be priced until it has been scoped. A pool design, a construction job, an installation: the figure depends on the site, and there is no honest number to put in a cart. Splash handles that work by replacing the buying interface with a request.

The mechanism is small on purpose. One tag marks a product as quoted, one page receives every request, and one form asks the questions. Nothing else about the product changes, and nothing has to be defined in Shopify before the tag works.

The chain, end to end

Four things connect, in this order.

A product tag

Add the tag named in Quote-only product tag to a product in Shopify admin. The theme ships with quote-only. From that moment the product is quoted rather than sold, everywhere in the store it appears.

One destination page

Quote request page in Theme settings is where every quote button in the store leads. There is one destination, not one per product.

The Quote theme template

That page needs the quote theme template, chosen in the page's Theme template dropdown. The template is what puts the Form builder section on the page. A page left on Default shows its body text and no form.

Shopify's own contact form

The form posts through Shopify's contact endpoint, so every answer arrives as an email under the label you typed on the field, sent to the store's contact address.

Requires The email address that receives requests is not a theme setting. It is the store's contact address in Shopify admin under Settings. Send yourself a test request before going live.

Step-by-step instructions for each link in that chain are on Quote-only products and Build the quote request form. The four settings themselves are defined in the Theme settings reference.

What the tag actually switches

The tag is matched against the product's tags whole, ignoring capitalization and surrounding spaces. Quote-Only matches. quote-only-legacy and quoted do not. Clearing the Quote-only product tag setting switches the feature off for every product at once, because there is no tag left to match.

On a product that matches, the theme removes the parts of the interface that assume a price and a stock level:

  • The price is replaced by the words Price on request, on the product page, in every product grid, in quick view, in search suggestions, in the article product cards and in accessory rows.
  • The whole buy stack goes: no add to cart, no quantity field, no accelerated checkout button, no tax note. A quote panel stands in its place, carrying the quote button and the note under it.
  • The sticky buy bar on the product page carries the same quote link rather than an add-to-cart button, and reads Price on request beside it.
  • In product grids the card loses its sale badge, its sold-out badge and its stock line. Availability is not a fact about work that has not been scoped yet.
  • The pickup availability block does not render at all.
  • The social preview tags omit the price, so a quoted job shared to a feed does not carry a price of zero beside its title.

Price on request is a translated string rather than a setting. Change it under Online Store, Themes, Edit default theme content if you want different wording.

What it deliberately leaves alone

A quoted job still has facts about it, so the theme keeps everything that states one:

  • The variant picker, if the product has options.
  • The specification table and the spec bars.
  • Package contents and the add-ons list.
  • The description, both the short and long blocks.
  • The Shipping and returns band.

That last one is worth a decision rather than a shrug. If a quoted service should not be talking about delivery windows and return periods, there are three ways out. Give the product its own custom.shipping_note metafield, which replaces the store's handling and transit day counts on that product alone and leaves every other product untouched. Assign quoted products a second product template with the block removed. Or remove the block from the product template outright, which takes the band off every product using that template. Quote-only products sets out all three, and Arrange the product page covers the block itself.

Note Marking a product quote-only changes the interface, not Shopify's record of it. The product still exists at its stored price, still sits in its collections, still returns in search, and is still purchasable through any route that bypasses the theme. If that matters, handle it in Shopify admin: leave the price at zero, or unpublish the product from sales channels you do not control.

Three things the theme will not invent

Each of these is an absence you would notice eventually. Each one is deliberate, and the reasoning is the same in all three cases: the theme states what is true and prints nothing where it has nothing.

No product structured data on a quoted product

Shopify records a quoted job at a price of zero, because there is nothing to charge until the work is scoped. Publishing that as structured data would tell a search engine that a build worth tens of thousands is free and out of stock, on a page whose only control is a request button. There is no way in the vocabulary search engines read to say "price on request": an offer requires a price. Withholding only the price is not an option either, because a product listing with no offer, no review and no rating is not a valid listing at all, so it produces an error against the URL rather than a quieter result.

So a quote-only product page emits no product markup. It keeps its breadcrumbs, its FAQs, its page title and its social preview tags. The practical consequence: quoted products will not appear as rich results with a price attached. In collection and search listings the product is still named, imaged and identified by SKU, and asserts nothing about what it costs.

More on what the theme does and does not publish to search engines is on Shipping, returns and search engine details.

No reference number on the confirmation

After a successful send, the form is replaced in place by a confirmation panel: a tick, the heading Request received, your Success message, and a Submit another link back to an empty form. There is no reference number, because Shopify's contact form does not issue one, and a number the theme made up would be a number nobody could look up.

If the send fails, a bordered error panel appears above the form reading "Your message couldn't be sent. Fix the errors below and try again.", followed by Shopify's own error text. A missing or malformed email address is the usual cause.

Every Request a quote button in the store is a plain link to one page. It carries no product handle, no product name and no query string, and the form has no hidden product field. A shopper who arrives from the custom pool design product and a shopper who arrives from the home page land on the identical page, and the email you receive cannot tell you which.

This is the one absence that is likely to matter to you in the first week, and the fix is one field: add a Dropdown to the form listing the services you quote, and ask. That answer arrives in the email under the label you gave it, like every other answer. See Build the quote request form.

Limit There is no per-product quote page and no way to pass the product into the form. One page receives everything.

Why the form branches

A new build, a renovation and a spa each need different questions, and asking all of them at once produces a form nobody finishes. Any field in the Form builder can be set to appear only after another field holds a particular answer, so one form carries several sets of questions and shows one at a time.

Two things follow from how that is built, and both are worth knowing before you design the form.

First, a field's Label is its identity. It is the visible label, it is the heading the answer arrives under in your email, and it is the exact text another field references to depend on it. Renaming a field breaks any condition still pointing at the old name, and splits your own records across two headings.

Second, hidden fields are disabled, so a branch the visitor never opened contributes nothing to the email, not even an empty line. Answers typed into a branch and then abandoned are dropped too.

The full behaviour, including how to reference a checkbox and how conditions nest, is on Conditional form fields.

What happens when JavaScript is off

The branching runs in the browser. With scripting switched off, every field on the form is shown at once, no conditional field is enforced as required, and whatever the visitor fills in is submitted.

That is the intended fallback, not a failure. A visitor who sees a longer form than they needed still sends you a request. A visitor who sees a form that cannot be sent sends you nothing, and you never find out they tried. The trade is made in that direction on purpose.

Where the quote flow appears

Beyond the product surfaces above, two places in the theme point at the quote page and are configured separately from it.

The home page Quote request band

A photograph, a heading, a paragraph and a button. Its Button link is its own setting and is not connected to the global Quote request page. Changing one does not change the other, so check both after moving the page. Covered in Set up the home page.

The contact page callout

The Contact template carries the same Form builder section, configured independently, with a callout panel beside the form. On the demo store that callout is what sends shoppers asking about a build across to the quote page.

The fallback behind that setting is a blank test and nothing more. If Quote request page is empty, or names a page that has been deleted, the setting resolves to nothing and every quote button in the store quietly links to the home page instead. There is no error and no broken link, which makes it easy to miss.

Hiding a page from the online store rather than deleting it is the case the fallback cannot help with, because the theme never asks whether a page is visible, only whether the setting resolved to something. A shopper who follows the button does not reach the form either way, so the request never arrives. Click a quote button on the storefront after renaming, hiding or deleting pages.

Deciding whether to use it

Quote a product when the price genuinely depends on facts you do not have yet: site conditions, dimensions, access, permits, existing plant. Sell a product from the cart when you can state its price, even if that price is large. Splash does not treat a high number as a reason to hide it, and the specification tables exist so that an expensive item can justify itself on the page rather than behind a form.

Related reading: Quote-only products for the setup, Form field reference for every field type and setting, and What Splash never invents for the rest of the theme's absences and the reasoning behind them.

Something wrong here If a step does not match what you see, say so and it gets fixed. Documentation goes stale, which is why the line under the title carries a date.