Shopify: 5 Ways to Hide Products (With Code)
March 30, 2026Most Shopify store owners eventually need to hide a product. Maybe it's out of stock, maybe it's a gift-with-purchase that shouldn't appear in your catalog, or maybe you're building a VIP collection that's only accessible via direct link.
The problem is Shopify doesn't have a single "hide" button. There are multiple ways to control product visibility, and each one behaves differently. Use the wrong method and your product disappears from checkout too — or worse, stays indexed in Google while hidden from your store.
This guide covers every method for hiding products on Shopify, when to use each one, and which ones need code versus just admin clicks.
Understanding Shopify's Product Visibility States
Before diving into methods, it helps to understand how Shopify thinks about product visibility. Every product has a status and sales channel assignments that work together:
| State | Visible in store? | Buyable via link? | Appears in search engines? | |---|---|---|---| | Active + Online Store channel | Yes | Yes | Yes | | Active, removed from Online Store | No | Yes (direct URL still works) | Depends on prior indexing | | Draft | No | No | No | | Archived | No | No | No (delisted) |
The distinction between "visible" and "buyable" matters. A product can be hidden from your collections and search but still purchasable if someone has the direct link. That's useful for bundles, VIP products, and gift items.
Method 1: Remove From the Online Store Sales Channel
Best for: VIP products, exclusive links, bundle components, wholesale items
Needs code: No
This is the most common way to hide a product while keeping it buyable. The product stays Active but isn't published to your Online Store.
How to do it:
- Go to Products in your Shopify admin
- Click on the product you want to hide
- In the Publishing section (right sidebar), click Manage
- Uncheck Online Store
- Save
The product won't appear in collections, search results, or anywhere on your storefront. But the direct product URL still works — anyone with the link can view and buy it.
When to use this: You want the product purchasable but not browsable. Common for gift-with-purchase items, bundle components sold separately, or products shared only via email/WhatsApp links.
Watch out: If the product was previously indexed by Google, the listing may persist in search results for a while. See Method 5 if you need to control that.
Method 2: Set to Draft
Best for: Upcoming products, seasonal items not yet ready, products being reworked
Needs code: No
Draft products are completely invisible. They don't appear anywhere on the storefront, can't be purchased, and won't be indexed by search engines.
How to do it:
- Go to Products in your Shopify admin
- Click on the product
- Change the Status dropdown from "Active" to "Draft"
- Save
When to use this: The product isn't ready to sell yet. You're still uploading images, writing the description, or waiting for stock to arrive. Draft is a staging state.
Don't use this if you still want the product buyable via direct link — Draft kills that completely.
Method 3: Hide From Collections Using Liquid
Best for: Gift products, free items, products that should be buyable but never browsable
Needs code: Yes (Liquid template editing)
This method keeps the product Active and published but filters it out of collection pages using Liquid template code. The product page itself still works — it just won't show up when customers browse your collections.
How to do it:
Tag the products you want to hide with a consistent tag like
hiddenIn your collection template (usually
sections/collection-template.liquidsnippets/product-card.liquid{% for product in collection.products %} {% unless product.tags contains 'hidden' %} <!-- Your existing product card code --> {% render 'product-card', product: product %} {% endunless %} {% endfor %}
This approach is flexible. You can use any tag name and apply it to as many products as you want without changing the code again.
For hiding specific products by ID (useful when you only have one or two):
{% for product in collection.products %} {% if product.id == 12345678 %} {% continue %} {% endif %} {% render 'product-card', product: product %} {% endfor %}
Replace
12345678When to use this: You want the product to stay fully functional — buyable, indexed, accessible via direct URL — but invisible in your catalog. This is the go-to for hiding gift products and free items included with orders.
Watch out: If your theme uses AJAX filtering or predictive search, you may also need to filter those separately. This method only hides from collection loops.
Method 4: Hide Out-of-Stock Products Automatically
Best for: Stores with fluctuating inventory, dropshipping, made-to-order products
Needs code: Sometimes
Many Shopify themes have a built-in setting for this:
- Go to Online Store > Themes > Customize
- Look for Collection pages settings
- Find a toggle like "Hide out of stock products" or "Show sold out products"
If your theme doesn't have this option, you can add it with Liquid:
{% for product in collection.products %} {% if product.available %} {% render 'product-card', product: product %} {% endif %} {% endfor %}
product.availabletrueWhen to use this: You don't want customers browsing products they can't buy. Particularly useful for stores with large catalogs and fast-moving inventory.
Method 5: Hide From Search Engines
Best for: Products that should be on your store but not in Google results
Needs code: Yes (theme.liquid edit)
Sometimes you want a product visible on your store but invisible to Google. Maybe it's a duplicate, a landing-page-specific offer, or a temporary promotion.
Add a
noindextheme.liquidproduct.liquid{% if product.tags contains 'noindex' %} <meta name="robots" content="noindex, nofollow"> {% endif %}
Tag any product with
noindexWhen to use this: The product is live on your store and buyable, but you don't want it competing with other pages in Google or appearing in search results.
Quick Comparison: Which Method Should You Use?
| Method | Visible in store? | Buyable? | Needs code? | Best for | |---|---|---|---|---| | Remove from sales channel | No | Yes (via link) | No | VIP, bundles, gifts | | Set to Draft | No | No | No | Upcoming, seasonal | | Liquid filtering | No (in collections) | Yes | Yes | Gift products, free items | | Hide out-of-stock | Auto-hidden when sold out | No (sold out) | Sometimes | Large catalogs | | Noindex meta tag | Yes | Yes | Yes | SEO control |
When You Actually Need an App
The methods above cover most use cases. But there are situations where a dedicated app makes sense:
- Customer-specific product visibility — showing different products to different customer groups (wholesale vs retail). This requires login detection that Liquid can't handle alone.
- Scheduled visibility — automatically showing/hiding products at specific dates and times. Shopify Flow can handle some of this, but a dedicated app gives you more control.
- Password-protected products — requiring a code or login to view specific products.
For everything else — hiding gifts, managing out-of-stock items, controlling search visibility — native Shopify features and a few lines of Liquid are all you need.
Wrapping Up
Shopify gives you more control over product visibility than most store owners realize. The key is matching the method to your use case:
- Need it buyable but not browsable? Remove from the Online Store channel.
- Not ready to sell yet? Set it to Draft.
- Want it active but filtered from collections? Use Liquid tags.
- Want to auto-hide sold-out items? Check your theme settings first, then add Liquid if needed.
- Need to control Google indexing? Add a noindex tag.
If you're running into a more complex scenario or need help implementing any of these methods, get in touch — I build and maintain Shopify stores and can set this up for you.