Skip to content

Hide your price from search engines

Read time: 12 minutes. Who it's for: Merchants on the Professional plan (or above) who need trade prices kept out of Google and other search engines for signed-out visitors - not just hidden visually on the storefront. Plan: Search-engine-safe hiding is a Professional+ feature. Visual price hiding (below) is available from Starter.

Hiding a price visually - swapping it for a "Request a quote" button - controls what your buyers see. It does not control what a search engine reads, because the real number still sits in your page's HTML source. Search-engine-safe hiding closes that gap: it keeps the price out of the HTML that a signed-out visitor (and Googlebot) receives, so there's nothing for a crawler to index. This guide walks through it for any Shopify theme, then shows you how to verify it with QuotWay's built-in leak check.

Visual hide vs. search-engine-safe hide

These are two different things. You'll usually want both.

Visual hide (Starter+) Search-engine-safe hide (Professional+)
What it does Replaces the on-page price with a "Request a quote" button/text Removes the price from the HTML source served to signed-out visitors
How CSS/JavaScript, after the page loads Server-side Liquid gate ({% if customer %}) - the price is never rendered for guests
Hides from buyers? Yes Yes
Hides from Google? No - the price is still in the page source, og:price, and JSON-LD Yes - for the page source, meta tags, and structured data
Setup Toggle in the QuotWay admin A one-time theme edit (this guide) + the QuotWay Price Gate block

Why a theme edit is required. An app can add markup to your theme, but it can't remove your theme's own price element, meta tags, or structured data. Only your theme controls those, so keeping the price out of the source is a short, one-time edit to your theme - QuotWay guides it and then verifies it for you.

What "search-engine-safe" covers - and what it can't

It removes the price from everything a search engine shows in a snippet, for signed-out visitors:

  • the visible price in the page HTML,
  • the og:price / product:price meta tags (used in link previews and some snippets),
  • the Product JSON-LD (<script type="application/ld+json">) and any itemprop="price" microdata.

It cannot remove two Shopify-managed surfaces - no theme or app can:

  • /products.json - Shopify publishes a public JSON feed of your products (including price) at your-store.com/products/<handle>.json. Only Shopify B2B catalogs or unpublishing the product hide this.
  • Storefront analytics - Shopify's own analytics see prices regardless of your theme.

These are a known residual. They're not what Google puts in a search result, so for keeping prices out of search snippets, the steps below cover it.

Do not use noindex to hide a price. noindex removes the entire product page from search - you lose the page, not just the price. Use the gate below instead.

Before you start

  • You're on the Professional plan or above (or in the 14-day trial of a paid plan).
  • QuotWay is installed with the app embed turned on. See App embed and activation.
  • Visual hide is already on for the buyers you target. See Hide prices and show a "Request a quote" button. This guide adds the search-engine layer on top.
  • Work on a copy of your theme. In Shopify admin → Online Store → Themes → ⋯ → Duplicate, edit the duplicate, then publish it once you've verified. This is standard practice for any theme edit.
  • Basic comfort editing theme code (Online Store → Themes → ⋯ → Edit code). The edits are small; the hardest part is finding the right file, which this guide helps with.

The idea in one line

Wrap the three places your price appears - the visible price, the meta tags, and the structured data - in {% if customer %} … {% endif %} so they render for signed-in customers only, and let QuotWay's Price Gate block show a "Sign in to see pricing" message to everyone else. When a signed-out visitor (or a crawler) loads the page, no price is in the source at all.


Step 1 - Add the QuotWay Price Gate block

The Price Gate block renders a "Sign in to see pricing" message (you can change the wording) - and no price - for signed-out visitors and search engines. It's what your guests see where the price used to be.

  1. In QuotWay, go to Quote button → Pricing and, under Hide price from search engines, click Add the price-gate block. This opens your theme editor with the block ready to place. (Or add it manually: Online Store → Themes → Customize → Product template → Add blockAppsQuotWay Price Gate.)
  2. Drag the block to where the price sits on your product page.
  3. Open the block's settings:
    • Signed-out message - the text guests and crawlers see (default: "Sign in to see pricing"). Change it to anything, e.g. "Request a quote for trade pricing".
    • Show price to signed-in customers - leave this off if you'll wrap the theme's own price in {% if customer %} (Step 2, Style A). Turn it on only if you hide the theme's Price block entirely and want the gate block to print the price for signed-in customers (Step 2, Style B).
    • Required customer tag (optional) - restrict the price to signed-in customers who carry a tag (e.g. wholesale).
  4. Save the theme.

Step 2 - Hide your theme's price for guests

Pick one of these. Style A is recommended because it keeps your theme's normal, variant-aware price for signed-in customers.

  1. Online Store → Themes → ⋯ → Edit code.

  2. Find where your product template renders the price. In most Online Store 2.0 themes (Dawn, Horizon, and similar) this is a price snippet - look for snippets/price.liquid or a price block inside sections/main-product.liquid (search the theme for | money).

  3. Wrap the price output so only signed-in customers get it:

    {% if customer %}
      {{ product.selected_or_first_available_variant.price | money }}
    {% endif %}
    

    (Adapt to your theme's existing markup - just add the {% if customer %} / {% endif %} around whatever renders the price.)

  4. Leave "Show price to signed-in customers" off in the Price Gate block (the theme now handles the signed-in price).

  5. Save.

Style B - No-code hide + let the gate block show the price

  1. In Customize → Product, hide your theme's native Price block (or set it to not display).
  2. In the QuotWay Price Gate block, turn "Show price to signed-in customers" on. The block will print the selected/first-variant price to signed-in customers and the gate message to everyone else.
  3. Save. (Style B shows the first/selected variant price rather than fully variant-reactive pricing - fine for most catalogs; use Style A if you need per-variant price updates as customers switch options.)

Step 3 - Clear the price from meta tags & structured data

This is the step that actually removes the price from search snippets. The visible price is gone after Step 2, but themes also emit the price in two machine-readable places that crawlers read.

3a - Open Graph / meta price tags

  1. In Edit code, open your theme's meta-tags snippet - usually snippets/meta-tags.liquid (some themes put these in layout/theme.liquid's <head>). Search the theme for og:price or product:price.

  2. Wrap the price meta tags in {% if customer %}:

    {% if customer %}
      <meta property="og:price:amount" content="{{ product.price | money_without_currency | strip_html }}">
      <meta property="og:price:currency" content="{{ cart.currency.iso_code }}">
    {% endif %}
    

3b - Product structured data (JSON-LD)

  1. Find where your theme outputs Product JSON-LD - commonly snippets/structured-data.liquid, or a {% render 'structured-data' %} / inline <script type="application/ld+json"> in sections/main-product.liquid. Search the theme for application/ld+json and "@type": "Product".

  2. Gate the offer (which carries the price) behind {% if customer %}. Because JSON must stay valid (no dangling commas), the cleanest approach is to include the offers block only for signed-in customers:

    {
      "@context": "https://schema.org/",
      "@type": "Product",
      "name": {{ product.title | json }}{% if customer %},
      "offers": {
        "@type": "Offer",
        "price": "{{ product.price | money_without_currency | strip_html }}",
        "priceCurrency": "{{ cart.currency.iso_code }}",
        "availability": "https://schema.org/InStock"
      }{% endif %}
    }
    

    If your theme builds the JSON-LD a different way, the rule is the same: the price / offers must not render for guests. Validate the guest output with Google's Rich Results Test - it should show the product with no price when signed out.

3c - Microdata (older themes)

If your theme uses inline microdata, wrap the itemprop="price" element in {% if customer %} too:

{% if customer %}
  <span itemprop="price" content="{{ product.price | money_without_currency }}">{{ product.price | money }}</span>
{% endif %}

Save the theme after each edit.

Step 4 - Run the leak check

QuotWay confirms your work by fetching the page as a signed-out visitor - exactly what Google sees - and reporting any price still in the source.

  1. In QuotWay, go to Quote button → Pricing → Search-engine leak check.

  2. Enter (or confirm) the product handle to check and click Run check.

  3. Read the results. The check looks for five things:

    Check Severity Fix
    og:price meta tag Critical Step 3a
    Product JSON-LD price Critical Step 3b
    itemprop="price" microdata Critical Step 3c
    Visible price text Critical Step 2
    Public /products.json Info Shopify-managed residual (see below) - not fixable by theme
  4. Fix any Critical leaks it flags, then re-run until only the /products.json Info line remains. That's your "search-engine-safe" state.

If the check says the storefront is password-protected, it can't read the page as a guest - remove the storefront password (or check a published theme) and run it again.

What's left after this (and why it's OK)

  • /products.json still exposes the price. No theme or app edit removes it - only a Shopify B2B catalog (which prices per company) or unpublishing the product does. It's a raw data feed, not something Google shows in a search result, so it doesn't affect your search snippets.
  • Shopify's storefront analytics still record prices. That's internal to Shopify and never public.

For most merchants, keeping the price out of the page source, meta tags, and structured data (Steps 1-3, verified in Step 4) is exactly what "keep my trade pricing off Google" means.

Verify it yourself

  • View source as a guest. Open your product page in a private/incognito window, right-click → View page source, and search (⌘/Ctrl-F) for the price number. After the steps above, it shouldn't appear.
  • Google Search Console. Use URL Inspection → Test live URL → View crawled page to see what Googlebot renders. Re-request indexing so Google re-crawls the price-free page.
  • Re-run the leak check any time you change themes or theme versions - a theme update can re-introduce a price element.

Gotchas

  • A theme update re-added the price. Theme upgrades replace snippets, which can undo your {% if customer %} edits. Re-run the leak check after any theme change and re-apply Steps 2-3 if needed.
  • The price still shows for you. If you're signed in as a customer, you'll see the price - that's correct. Test signed out (incognito) to see what guests and crawlers see.
  • JSON-LD is invalid after editing. A stray comma breaks the whole block. Paste the guest output into the Rich Results Test to validate; use the offers-level gate shown in 3b to avoid dangling commas.
  • Two prices on the page. If both your theme's price and the gate block's price show for signed-in customers, you've done both Style A and Style B - turn "Show price to signed-in customers" off (Style A) or hide the theme Price block (Style B), not both.
  • Custom / headless themes. The same rule applies - gate the price, og:price, and JSON-LD for guests wherever your framework renders them. The leak check works on any Shopify storefront URL.

Still need a hand? The team is happy to help.