All things Shopify and commerce
Is it possible to create a list showing items that are shown in Products but NOT showing in Collections? I have had occasion where I am missing an item on in my Shop and when I look at the product it has no Collection assigned to it. To save myself time and to ensure I don't miss any, a list would be so handy to have. Any help on this would be really appreciated. Many thanks in advance.
Hello @DaniHud , would you like to explain more about how you want to show the products that are not part of any collection? You can always visit to products tab in the Shopify dashboard and check products manually.
if you want to have a count then simply you can add every product of the store to a main collection let's say "Home Collection" and then count all other collection items. But, it has some limitations, it's only suitable if you have distinguished products in all the collections. And, if you have a product that could be in multiple collections then this will not be a suitable approach.
Regards,
Osama Farooqi
Not the poster... I just want to find out what products are not in a collection so I can update the tags so that they show up in a collection. It should be a simple canned report that shows products and collections. I dont want to go down through over 100 products to look at each one and see if it is in a collection.
Even the ability to add collection column to the product list....
Hello,
Another option would be to use our Ablestar Bulk Product Editor app which can search for products with no collections:
Once you've identified those products you can either:
Some apps might create Automated Collections (a common one that we see is named "Smart Products Filter Index - Do not delete"). If you want to exclude these collections the app also has a filter for 'Not in any Manual Collection' which should work.
Best,
Daniel
Here we are in mid 2024 and this easy to fix and obviously needed capability has exactly zero progress.
If this company employs any usability testers, ux researchers, or anything of the like, I would be interested to know why they still have their jobs.
I totally agree. Coming from WooCommerce I find Shopify frustrating.
Why would Shopify display Categories in the Products listing page and not Collections?
I don't think anyone in Shopify Dev has ever run their own shop.
I found that the Ablestar plugin worked for me.
Here we are in mid 2024 and this easy to fix and obviously needed capability has exactly zero progress. I cannot believe the reply was "why would you want that?" when the incredibly obvious answer is to make sure everything gets assigned to a collection without visiting each and every item separately.
If this company employs any usability testers, ux researchers, or anything of the like, I would be interested to know why they still have their jobs.
Here I am in mid 2025 looking for the same functionality and cannot quite believe its impossible to simply show all products that are not assigned to a collection!
I guess I'll have to get AI to write some code to do it....
Paste this code into a 'custom liquid' section on a page template and you'll get something like this:
{% assign all_products = collections.all.products %}
{% assign products_in_collections = '' %}
{% comment %}
First, gather all product handles that are in at least one collection
{% endcomment %}
{% for collection in collections %}
{% unless collection.handle == 'all' %}
{% for product in collection.products %}
{% assign products_in_collections = products_in_collections | append: product.handle | append: ',' %}
{% endfor %}
{% endunless %}
{% endfor %}
<style>
.orphaned-products-container {
max-width: 1600px;
margin: 0 auto;
overflow-x: auto;
}
.orphaned-products-table {
width: 100%;
max-width: 100%;
border-collapse: collapse;
margin: 20px 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.orphaned-products-table th {
background-color: #f8f8f8;
padding: 12px 15px;
text-align: left;
border-bottom: 2px solid #e1e1e1;
font-weight: 600;
}
.orphaned-products-table td {
padding: 10px 15px;
border-bottom: 1px solid #e1e1e1;
vertical-align: middle;
}
.orphaned-products-table tr:hover {
background-color: #f9f9f9;
}
.product-link {
color: #3a7bd5;
text-decoration: none;
font-weight: 500;
}
.product-link:hover {
text-decoration: underline;
}
.product-handle {
color: #666;
font-size: 0.9em;
}
.no-orphaned-products {
padding: 20px;
background-color: #f8f8f8;
border-radius: 4px;
text-align: center;
color: #666;
max-width: 1600px;
margin: 0 auto;
}
@media screen and (max-width: 768px) {
.orphaned-products-table {
font-size: 0.9em;
}
.orphaned-products-table th,
.orphaned-products-table td {
padding: 8px 10px;
}
}
</style>
<div style="max-width: 1600px; margin: 0 auto; padding: 0 15px;">
{% assign orphaned_products_count = 0 %}
<div class="orphaned-products-container">
<table class="orphaned-products-table">
<thead>
<tr>
<th>Product Title</th>
<th>Handle</th>
<th>Link</th>
</tr>
</thead>
<tbody>
{% for product in all_products %}
{% unless products_in_collections contains product.handle %}
{% assign orphaned_products_count = orphaned_products_count | plus: 1 %}
<tr>
<td>{{ product.title }}</td>
<td class="product-handle">{{ product.handle }}</td>
<td>
<a href="{{ product.url }}" class="product-link" target="_blank">
View Product →
</a>
</td>
</tr>
{% endunless %}
{% endfor %}
</tbody>
</table>
</div>
{% if orphaned_products_count == 0 %}
<div class="no-orphaned-products">
All products are included in at least one collection.
</div>
{% endif %}
<div style="margin-top: 15px; color: #666; font-size: 0.9em;">
Found {{ orphaned_products_count }} products not in any collection.
</div>
</div>
There's some issues with the code above, so I've updated the way it works, so no products are missed:
{% comment %}
Use pagination to access ALL products in the store
Collect all orphaned products across all pages and display them in one list
{% endcomment %}
{% paginate collections.all.products by 1000 %}
<div style="max-width: 1600px; margin: 0 auto; padding: 0 15px;">
<div class="summary-box">
<h3>🔍 Orphaned Products Scanner</h3>
</div>
{% assign total_products_scanned = 0 %}
{% assign orphaned_products_count = 0 %}
<div class="orphaned-products-container">
<table class="orphaned-products-table">
<thead>
<tr>
<th style="width: 5%;">#</th>
<th style="width: 25%;">Product Title</th>
<th style="width: 20%;">Handle</th>
<th style="width: 15%;">SKU</th>
<th style="width: 15%;">Product Type</th>
<th style="width: 15%;">Category</th>
<th style="width: 10%;">Link</th>
</tr>
</thead>
<tbody>
{% for product in collections.all.products %}
{% assign total_products_scanned = total_products_scanned | plus: 1 %}
{% comment %} Count real collections (excluding 'all') {% endcomment %}
{% assign real_collection_count = 0 %}
{% for collection in product.collections %}
{% unless collection.handle == 'all' %}
{% assign real_collection_count = real_collection_count | plus: 1 %}
{% endunless %}
{% endfor %}
{% comment %} Show product if it has no real collections {% endcomment %}
{% if real_collection_count == 0 %}
{% assign orphaned_products_count = orphaned_products_count | plus: 1 %}
<tr>
<td style="text-align: center;">{{ orphaned_products_count }}</td>
<td>{{ product.title }}</td>
<td class="product-handle">{{ product.handle }}</td>
<td class="product-handle">
{% if product.variants.first.sku != blank %}
{{ product.variants.first.sku }}
{% else %}
<em>No SKU</em>
{% endif %}
</td>
<td>
{% if product.type != blank %}
{{ product.type }}
{% else %}
<em>No Type</em>
{% endif %}
</td>
<td>
{% if product.product_category != blank %}
{{ product.product_category }}
{% else %}
<em>No Category</em>
{% endif %}
</td>
<td>
<a href="{{ product.url }}" class="product-link" target="_blank">View</a>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
<div style="background-color: #f8f9fa; border: 2px solid #6c757d; border-radius: 4px; padding: 20px; margin: 20px 0; text-align: center;">
<p><strong>Page {{ paginate.current_page }} Results</strong></p>
<p><strong>{{ orphaned_products_count }}</strong> orphaned products found on this page</p>
<p>Out of <strong>{{ total_products_scanned }}</strong> products scanned on this page</p>
<p><strong>Store totals:</strong> {{ paginate.items }} active products across {{ paginate.pages }} pages</p>
{% if paginate.pages > 1 %}
<div class="pagination-nav">
{% if paginate.previous %}
<a href="{{ paginate.previous.url }}" class="page-btn">« Previous Page</a>
{% endif %}
<span class="page-btn current-page">Page {{ paginate.current_page }} of {{ paginate.pages }}</span>
{% if paginate.next %}
<a href="{{ paginate.next.url }}" class="page-btn">Next Page »</a>
{% endif %}
</div> </div>
{% endif %}
</div>
{% endpaginate %}
<style>
.orphaned-products-container {
max-width: 1600px;
margin: 0 auto;
overflow-x: auto;
}
.orphaned-products-table {
width: 100%;
max-width: 100%;
border-collapse: collapse;
margin: 20px 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.orphaned-products-table th {
background-color: #f8f8f8;
padding: 12px 15px;
text-align: left;
border-bottom: 2px solid #e1e1e1;
font-weight: 600;
position: sticky;
top: 0;
z-index: 10;
}
.orphaned-products-table td {
padding: 10px 15px;
border-bottom: 1px solid #e1e1e1;
vertical-align: middle;
}
.orphaned-products-table tr:hover {
background-color: #f0f8ff;
}
.orphaned-products-table tr:nth-child(even) {
background-color: #f9f9f9;
}
.product-link {
color: #3a7bd5;
text-decoration: none;
font-weight: 500;
}
.product-link:hover {
text-decoration: underline;
}
.product-handle {
color: #666;
font-size: 0.9em;
}
.no-orphaned-products {
padding: 20px;
background-color: #f8f8f8;
border-radius: 4px;
text-align: center;
color: #666;
max-width: 1600px;
margin: 0 auto;
}
.summary-box {
background-color: #e7f3ff;
border: 1px solid #b3d7ff;
border-radius: 4px;
padding: 20px;
margin: 20px 0;
}
.warning-box {
background-color: #fff3cd;
border: 1px solid #ffeaa7;
border-radius: 4px;
padding: 20px;
margin: 20px 0;
}
.sa6009-highlight {
background-color: #d4edda !important;
border-left: 4px solid #28a745;
}
.scan-info {
background-color: #d1ecf1;
border: 1px solid #bee5eb;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
}
.pagination-nav {
text-align: center;
padding: 20px;
background-color: #f8f9fa;
border-radius: 4px;
margin: 20px 0;
}
.page-btn {
display: inline-block;
padding: 10px 20px;
margin: 0 10px;
background-color: #007bff;
color: white;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
}
.page-btn:hover {
background-color: #0056b3;
color: white;
}
.current-page {
background-color: #28a745;
}
@media screen and (max-width: 768px) {
.orphaned-products-table {
font-size: 0.9em;
}
.orphaned-products-table th,
.orphaned-products-table td {
padding: 8px 10px;
}
}
</style>
June brought summer energy to our community. Members jumped in with solutions, clicked ...
By JasonH Jun 5, 2025Learn how to build powerful custom workflows in Shopify Flow with expert guidance from ...
By Jacqui May 7, 2025Did You Know? May is named after Maia, the Roman goddess of growth and flourishing! ...
By JasonH May 2, 2025