---
title: "Hide your price from search engines (search-engine-safe hiding)"
description: "Keep trade prices out of Google for signed-out visitors - add the QuotWay Price Gate block, gate the price, og:price, and JSON-LD, then run the leak check."
url: "https://www.quotway.com/docs/storefront/hide-price-from-search-engines"
type: "documentation"
category: "storefront"
updated: "2026-07-09"
locale: "en"
source: "QuotWay - B2B Quote & Negotiation App for Shopify"
---

# 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](./app-embed-and-activation.md).
- **Visual hide is already on** for the buyers you target. See [Hide prices and show a "Request a quote" button](./hide-prices.md). 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 block** → **Apps** → **QuotWay 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.

### Style A - Wrap the theme's price in `{% if customer %}` (recommended)

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:

   ```liquid
   {% 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 %}`:

   ```liquid
   {% 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:

   ```liquid
   {
     "@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](https://search.google.com/test/rich-results) - 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:

```liquid
{% 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.

## Related articles

- [Hide prices and show a "Request a quote" button](./hide-prices.md) - the visual hide and "Request a quote" button this builds on.
- [Quote button placement](./quote-button-placement.md) - where the button shows on your storefront.
- [Plans, trial, and billing](../billing/plans-trial-and-billing.md) - which plan unlocks search-engine-safe hiding.
