Paste a Shopify store URL. This tool reads the public product feed and finds separate products that are really one product in different colourways, the pattern where Sand, Black and Olive each got their own listing instead of becoming three swatches on one. You get a count of how many listings the catalogue could collapse into, and every proposed group shown as real products with thumbnails so you can check the call yourself.
Three signals have to agree before a group is proposed. The products must share a title stem once a trailing colour is stripped off, they must share a vendor and a product type, and they must carry the identical set of option names. All three, every time. That last one does more work than it sounds like. Here is why: a product with Size and a product with Size plus Fit are built differently, so they are not siblings even when the titles line up perfectly.
There is a negative check running alongside, and it matters just as much as the positive one. If a product already carries a Colour option with two or more values, its colourways are already variants of one product. Grouping is the wrong answer there, and the tool says so out loud instead of quietly counting it. That product has a different problem, which is that all of its colours share one gallery, and that is a variant image job rather than a listing job.
We build the combined listings app, so yes, this points at a product we sell. It also has to be right, because a grouping suggestion that turns out to be nonsense costs a merchant an afternoon and costs us the argument. So the detector is deliberately strict, and we tested it against real catalogues before shipping it. Not synthetic ones. Real ones. On a coffee store and a cosmetics store it returns zero groups, which is the correct answer, and it is the result we care about most. A detector that finds something everywhere is a detector that found nothing.
The scan is whole store and zero input. You type one URL, it walks the public feed, and it never asks you to paste a product list or pick a collection. That is the difference between this and the collection tools on our rubikify.com site, which go deeper on one collection at a time. Those answer "how should this collection be grouped". This one answers "does this store have a grouping problem at all, and how big is it". Find first, plan second.
Nothing is written to the store, no login is involved, and no AI is called. The grouping runs in your browser on public data. The fetch itself is normally made by our server, which identifies itself as CraftshiftToolsBot, so pointing this at a store you do not own leaves a line in that store's logs like any other crawler would. If our own endpoint is unavailable or rate limited, the request falls back to a public CORS proxy instead, which means the store URL you typed is handed to a third party service on that path, so do not paste a URL you would not want seen.
| Detail | What this tool does |
|---|---|
| Data source | Public products.json on the storefront. No login, no API key, no app install |
| Products per request | 250, which is what one page of this scan reads |
| Pages read | Up to 8, so up to 2,000 products per run. Bigger catalogues are labelled partial |
| Signal 1 | Title stem, after splitting on the last - , | or in |
| Signal 2 | Shared vendor and shared product type |
| Signal 3 | Identical set of option names |
| Group threshold | 2 or more products agreeing on all three, with 2 or more distinct colour tokens |
| Negative check | A product with a multi value Colour option is excluded and reported as a do not group case |
| Records skipped | Anything with no images and nothing priced above zero, which is a merchandising tile rather than a product. Counted on its own row |
| AI used | None. The grouping is plain string comparison in your browser |
| Changes made to the store | Zero. The scan only reads |
What a combined listing actually is
A combined listing is one shopper facing product that is backed by several separate product records. The shopper sees a row of colour swatches on the product page and on the collection grid. Clicking a swatch moves them to a different product URL, but it does not feel like leaving, because the swatches sit where variant buttons normally sit.
That is different from variants. Variants live inside one product record and share one URL. Shopify allows 3 option types per product, and the variant ceiling was raised to 2,048 in the October 2025 changelog, up from the long standing 100. Liquid still cannot reach past the first 250 variants of a product, and the 250 media per product cap was not raised with it, so a very large variant set brings its own problems even now that the count is allowed.
Shopify does ship a native Combined Listings app. Its App Store listing states plainly that it is "Available on Plus and enterprise commerce plans", so for most stores it is not an option, and that gap is the reason third party grouping apps exist at all. Ours is one of them, and it is named in the results.
The distinction that trips people up: grouping does not merge anything. Each colour keeps its own product record, its own handle, its own URL, its own photos and its own inventory. The grouping layer only changes what the shopper sees. Nothing is deleted, which is why this is a much safer operation than a duplicate cleanup.
The three signals, and why all three are required
Every signal on its own produces garbage. Together they're strict enough to return nothing on a store that has nothing, which is the only test of a detector that means anything.
| Signal | How it is computed | What it would do alone |
|---|---|---|
| Title stem | The title is split at the last - , | or in . Everything before it becomes the stem, normalised for case and whitespace | Groups anything with a shared prefix, so every "Gift Card" and every "Sample Pack" collides |
| Vendor and product type | Both compared after case and whitespace are normalised. Both must match | Groups a Nike hoodie with an Adidas hoodie, which are not the same product in two colours |
| Option name set | Every option name on the product, lowercased and sorted, compared as a set | Nothing on its own. Half a catalogue shares one option set |
| Distinct colour token | The single value of a Colour option if there is one, otherwise the tail that was split off the title | This is a gate, not a grouping signal. A bucket where every member reads one token has no colourway axis at all |
The option name set is the signal people leave out, and leaving it out is what produces the false positives that make these tools untrustworthy. A Size only product and a Size plus Fit product are built by different merchandising decisions. If the store was splitting colour into separate listings deliberately, the resulting listings almost always come out of the same template with the same options. Where the option sets disagree, something else is going on and the tool stays quiet.
The colour token is the last gate. Two products can share a stem, a vendor, a type and an option set and still be two identical listings entered twice, and that is a duplicate rather than a grouping candidate. So a group is only emitted when at least two different tokens are present. When two members inside a proposed group happen to read the same token, the card says so and tells you to open both, which is a flag rather than a verdict. Worth being precise about why: a repeated value in a single value Colour option is routine, because five genuinely different shirt patterns in one range can all be labelled Light Blue. A repeated tail on the end of the title is different, and that one is worth taking to the duplicate finder, so those are the only repeats the card routes there.
The negative check: which products should NOT be grouped
This is the half of the tool we would keep if we could only keep one half.
If a product already has a Colour option with two or more values, its colourways are already variants inside one product record. There is nothing to combine. Pointing a grouping app at it would be pointless at best and confusing at worst, so the scan pulls it out of the candidate pool and reports the count separately, with a sample of the products involved.
Those products usually do have a problem, though. It is just a different one. When ten colours live inside one product, the gallery shows all ten to everyone, so a shopper who picks Olive is scrolling past nine other colours to find a photo of what they chose. That is a variant image filtering job. Rubik Variant Images assigns a separate image set to every variant, so picking Olive filters the gallery down to the Olive photos instead. The two apps solve adjacent problems, and the results page keeps them apart on purpose, because sending someone to the wrong one wastes their install.
The option names that trigger the exclusion are the direct colour words in several languages: Color, Colour, Farbe, Couleur, Kleur, Colore, Cor, Renk, plus Shade, Swatch and Colorway. It's a keyword list, so it isn't exhaustive. A store that named its colour option something inventive will not trip the check, and the tool tells you that rather than pretending the list is complete. If you see a proposed group where every product already offers several colours, that is the failure mode, and it is visible from the group card in one glance.
Why one product per colour happens in the first place
Nobody splits a catalogue by colour for fun. There are four reasons, and none of them are carelessness.
The old variant ceiling. For years a Shopify product allowed 100 variants. Twelve colours by eight sizes is 96, which fits with nothing to spare, and adding two fits takes it to 192 and breaks. Whole categories of apparel could not be modelled as one product, so they were not. The ceiling moved to 2,048 in October 2025, but catalogues built before that are still shaped by the old limit and nobody rebuilds a working catalogue for fun.
Three options is still three options. The option cap did not move. Colour by size by fit uses all three, and a fourth attribute like sleeve length or inseam has nowhere to go except into another product.
SEO and ads. A separate product per colour means a separate URL, a separate title and separate images, which some merchants want for product feeds and for landing pages. That is a real argument, not a mistake, and grouping does not take it away, because the separate URLs survive.
The admin makes it the fast path. Adding a colour to an existing product means editing an option, regenerating variants and reassigning photos. Duplicating the product takes one click. Under time pressure one click wins, every time, and six months later the whole catalogue is shaped by a decision nobody remembers making.
So the split is usually rational. What is missing is the layer that puts it back together for the shopper, and that is what the number at the top of the results is measuring.
What a split catalogue costs, and what grouping gives back
The headline number this tool reports is reclaimed collection grid slots: the products in proposed groups, minus the number of groups. Forty products that are really ten listings frees thirty slots. That number is worth understanding rather than just reading, because it is the cost most merchants never notice.
A collection page shows a fixed number of products before the shopper stops scrolling. When one shirt occupies eight of those slots, seven other products did not get shown. The shopper isn't seeing eight choices. They're seeing one choice eight times, and everything behind it is out of view. Consolidating those eight into one card with eight swatches does not hide anything: the colours are still there, one click away, and seven genuinely different products move up the page.
The second cost is discovery in the other direction. When Sand and Olive are separate listings with no link between them, a shopper who lands on Sand from search or from an ad often never finds out Olive exists. They either buy Sand or they leave. Swatches on the product page fix that specific leak, which is why grouping affects the product page and the collection page rather than just one of them.
The third is social proof. Reviews, sales history and best selling rank all attach to a product record. Eight separate colour listings split all three eight ways. Grouping doesn't merge the records, so it doesn't merge the review counts either, and it would be dishonest to claim otherwise. What it does is make sure the shopper looking at one colour can see the whole range, which is the part that was actually broken.
Merge into variants, or group the listings?
Once the scan hands you a list of groups, there are two honest routes and they are not interchangeable.
| Merge into variants | Group the separate listings | |
|---|---|---|
| What happens | The colour listings are folded into one product with a Colour option | The products stay as they are and a swatch layer connects them |
| URLs | One survives, the rest need redirects | All of them survive, unchanged |
| Reviews and history | Consolidated onto the survivor, if your review app can transfer them | Stay where they are, one set per colour |
| Photos | All colours land in one gallery, so you then need variant image filtering | Each colour keeps its own gallery already |
| Limits to watch | 3 options per product, 250 variants reachable in Liquid, 250 media per product | The number of groups your grouping app allows |
| Risk | Destructive. Deletions and redirects are involved | Additive. Nothing is deleted |
| Best when | The range is small and was split by accident | The range is large, or the split was deliberate |
Merging is the cleaner end state when it fits, and it genuinely does consolidate reviews and inventory in a way grouping cannot. It's also irreversible, and it involves deleting real product records, so it deserves an afternoon of care rather than a bulk action. Work out whether the range fits first with the Variant Combination Calculator, check the option maths with the Variant Limit Checker, and build the redirects with the Redirect CSV Generator before you delete a single handle. A broad view of the catalogue you are about to change is worth having too, and the Store Analyzer gives you that in one pass.
Grouping is the answer for everything that does not fit, and for every catalogue that split on purpose. Rubik Combined Listings links separate colour products into one listing with swatches on both the product page and the collection page, without Shopify Plus. It is metafield based, with real time sync through Shopify metaobject references and no external API calls. It carries 358 theme entries in its compatibility table, seven page builders among them, and it sits at 5.0 stars across 66 ratings on the App Store as of August 2026. The free plan covers 5 product groups, which is enough to try the idea on one range before deciding anything. You can see it running on a live storefront in the combined listings demo store.
How to work through the results
The list is a starting point, not a work order. Here is the order that wastes the least time.
Step 1: read the biggest groups first. A group of eight is worth more attention than four groups of two, both because it reclaims more grid slots and because it is more likely to be a genuine range rather than a coincidence.
Step 2: open two members side by side. Every group card links both products. If they are the same garment in two colours, the group is right. If they are two different products that happen to share a naming pattern, throw the group out, and know that the tool showed you the stem it matched on so you could catch exactly that.
Step 3: check the colour tokens. The token is what the tool believes distinguishes the members. When it reads like a colour, you are almost certainly looking at a colourway split. When it reads like "FINAL SALE" or "2 Pack", the products differ by something other than colour, and grouping them under a colour swatch would mislead the shopper.
Step 4: open the same token members rather than assuming. If two products in a group read the same token, one of two things is true, and the card cannot tell them apart from the outside. Either they are two copies of one listing, or they are two different products whose Colour option uses the same coarse colour name. The second is more common than you would expect on apparel: a range can carry several distinct patterns that all say Light Blue. Open both. If the repeat is in the title tail instead of a colour option, the copy explanation gets much more likely, and the Duplicate Product Finder is the tool for that, because it keeps true duplicates and colour siblings in separate buckets and never treats a sibling as deletable.
Step 5: pick one range and prove it before doing forty. Group one range, look at the collection page on desktop and on mobile, and check that the swatches land where you expected in your theme. Then do the rest. Grouping a whole catalogue and then discovering the swatch position is wrong on mobile is a bad afternoon.
Step 6: plan the naming before the grouping. Swatch labels come from the option value you assign per product. If half the range says "Navy" and the other half says "Dark Blue", the swatch row will say both. Settle that vocabulary before you group anything, because it is a manual decision no tool makes for you: pick one label per colour and apply it across the range.
What this scan cannot see
Being straight about the boundary is more useful than overselling what sits inside it.
- Published products only. The public feed returns products on the Online Store sales channel. Drafts, archived products and anything hidden are invisible, so a half built colourway will not appear.
- Up to 2,000 products. The feed returns 250 products per request and this scan reads up to 8 pages. That is our ceiling, not Shopify's: the endpoint keeps paging well past it. Larger catalogues are scanned to that point and labelled partial at the top of the results, never quietly truncated.
- It cannot see existing groups. Grouping apps store their groups in metafields and metaobjects, which the public product feed does not expose. A catalogue that is already grouped will still show the same candidates here, because from the outside a grouped range and an ungrouped range look identical.
- It cannot read your tags or metafields. Some catalogues encode the range in a tag or a style code rather than in the title. Those splits are real and this scan will miss them, because the title is where it looks.
- The separators are English shaped. A store that writes "Pullover Schwarz" with no separator gives the stem check nothing to work with. Colour first naming has the same effect. Fewer groups will be found, and none of the ones that are found become less reliable, which is the trade we chose.
- Password protected and headless stores return nothing. If the storefront is locked, or a custom frontend serves the domain without the standard endpoint, there is nothing public to read. The myshopify.com domain often still answers.
- It skips records that are not shopper facing products. A record with no images at all and nothing priced above zero is left out of the grouping pass and counted on its own row. Some catalogues keep merchandising tiles in the product feed, and those share a title stem with each other, so leaving them in would fill the group list with rows nobody wants to group. Both conditions are required together, so a real product that is only missing its photos is not dropped.
- It does not judge whether grouping is a good idea for you. It measures the pattern. Whether a range should present as one listing is a merchandising decision with your customers in it, and the tool has no access to those.
Fetched pages are also cached briefly on our side to stay polite to the store being scanned, so re running a scan a minute after a change may show the previous result.
How this fits with our other grouping tools
Four of our tools touch this problem, and two of them overlap, so being straight about where is more useful than claiming a clean split.
This one is whole store and zero input. One URL, the entire published catalogue, one number at the end. Use it to find out whether a grouping problem exists and how large it is. It is the right first stop and the wrong place to plan anything in detail.
The Duplicate Product Finder also scans a whole store and also emits colour sibling groups. That is the overlap, and it is real. The difference is the question each one is built to answer. It asks "are any of these copies I should redirect and delete", so it leads with true duplicates and puts colour siblings in a separate bucket precisely so they do not get deleted. This one asks "which of these are colourways I should present as one listing", so it never proposes deleting anything, and it adds signals the duplicate scan does not use: shared vendor and product type, identical option sets, the negative check that pulls out products whose colours are already variants, and the grid slot arithmetic. Run the duplicate finder when you suspect copies. Run this one when you suspect a split range. On a catalogue where both are true, run both, and note that the two will name some of the same products.
The Collection Analyzer is single collection and much deeper. Point it at one collection URL and it counts products, variants and prices and looks at the grouping pattern inside that collection specifically. Use it after this scan, on the collection that looked worst.
The Product Grouping Planner is manual paste and it is for planning. You paste your product titles, it works out which ones share a stem and shows you the groups it found along with the rule that matched them. Use it last, on the range you decided to group. The option name and the swatch labels are still yours to choose.
So the order is: find the split, rule out copies, examine one collection, then plan the range you picked. If you would rather understand the underlying decision first, the Separate Products vs Variants comparison covers when each structure is correct in the first place.
Related Tools
- Duplicate Product Finder: the other whole store scan, built around whether anything here is a copy worth deleting. It reports colour siblings too, so expect it to name some of the same products this one does.
- Collection Analyzer: product counts, variant counts and grouping patterns for one collection at a time.
- Product Grouping Planner: paste a list of product titles and see which of them share a stem and would group together.
- Variant Combination Calculator: how many variants an option structure produces and where it runs into the option cap.
- Variant Image Checker: see how many images one product carries per variant and which variants have no featured image of their own.
Our Shopify Apps
Rubik Variant Images Rubik Combined ListingsSmart Bulk Image Upload Export Product Images Bulk Delete Products
What is a combined listing on Shopify?
A combined listing is one shopper facing product backed by several separate product records. The shopper sees colour swatches on the product page and on the collection grid, and clicking one moves them to another product URL without it feeling like leaving. Each colour keeps its own record, handle, photos and inventory. Nothing is merged and nothing is deleted, which makes grouping an additive change rather than a destructive one.
How does this tool decide two products are the same listing?
Three signals must all agree. The products must share a title stem after the title is split at the last " - ", " | " or " in " and normalised for case and whitespace. They must share a vendor and a product type. And they must carry the identical set of option names, so a Size only product and a Size plus Fit product are never treated as siblings. On top of that, the group only appears if at least two members carry different colour tokens.
Why does the tool refuse to group a product that already has a Colour option?
Because its colourways are already variants inside one product record, so there is nothing to combine. That product is excluded from the candidate pool and reported separately as a do not group case. It usually still has a problem: with several colours in one product, the gallery shows every colour to every shopper. That is a variant image filtering job, not a listing job, and sending it to a grouping app would achieve nothing.
How many products can it scan?
Up to 2,000. The public feed returns 250 products per request, which is what one page of this scan reads, and the scan reads up to 8 pages. That ceiling is ours rather than Shopify's, since the endpoint keeps paging well past it. If your catalogue is larger, the results say so at the top and report how many products were actually read, so you never see a total that quietly covers part of a catalogue.
Does it use AI to work out the groups?
No. The grouping is plain string comparison running in your browser on public data. No model is called, nothing is sent anywhere for analysis, and the same input always produces the same output. That is deliberate: a heuristic you can read and disagree with is more useful in a tool like this than a suggestion you have to take on trust.
Why did it find nothing on my store?
Four common reasons. Your colourways are already variants of one product, which is the correct setup and would show in the excluded count. Your titles carry no separator, so the stem check has nothing to split on. Your colour listings differ in vendor, product type or option names, so one of the three signals disagreed. Or the catalogue is bigger than the scan window and the range sits past the cut off. Finding nothing on a store with no colour splits is the tool working, not failing.
Why did it group two products that are clearly not related?
Almost always because two unrelated products share a naming pattern, a vendor and a product type. Bundles, sample packs and gift cards do this a lot. Every group card shows the stem it matched on and the token it read for each member, so a wrong group is visible in a couple of seconds. Throw it out. The tool proposes candidates and shows its working rather than issuing verdicts.
What is the colour token and where does it come from?
It is the value the tool believes distinguishes one member of a group from another. If the product has a Colour option with exactly one value, that value is used, which is how catalogues that keep the colour out of the title still get detected. Otherwise the token is the tail that was split off the end of the title. The card labels which of the two sources was used for every member.
Two products in a group have the same token. What does that mean?
It means open both, not that they are duplicates. Two copies of one listing would read the same token, but so would two genuinely different products whose Colour option carries the same coarse colour name, which is common on apparel where several patterns in a range are all labelled Light Blue. The group card flags the repeat without calling it. If the repeat is in the title tail rather than a colour option, a copy is the more likely explanation, and that is the case the card sends to the Duplicate Product Finder, which keeps true duplicates and colour siblings in separate buckets because the fixes are opposite: a duplicate gets redirected and deleted, a colour sibling must never be deleted.
What does "collection grid slots reclaimed" mean?
It is the number of products in the proposed groups minus the number of groups. Forty products that are really ten listings reclaims thirty slots. A collection page shows a fixed number of products before shoppers stop scrolling, so when one shirt takes eight of those slots, seven other products never got seen. Consolidating them into one card with eight swatches puts those seven back in view without hiding a single colour.
Should I merge the products into variants instead of grouping them?
If the range fits comfortably and was split by accident, merging is the cleaner end state, and it is the only route that consolidates reviews and inventory onto one record. It is also destructive: it deletes product records and needs redirects set before anything goes. If the range is large, or the split was deliberate for feeds, ads or SEO, keep the products and add a grouping layer instead. Grouping deletes nothing, so it is the reversible option.
Do I need Shopify Plus to combine listings?
Not for third party grouping apps. Shopify's own Combined Listings app states on its App Store listing that it is "Available on Plus and enterprise commerce plans", so for stores below that it is not available, and that gap is exactly why third party apps in this category exist. Rubik Combined Listings works on any Shopify plan, with a free tier covering 5 product groups.
Will grouping hurt my SEO by creating duplicate pages?
Grouping does not create any pages. The product records and their URLs already exist before you group them and they are unchanged afterwards, so the number of indexable pages is the same either way. What changes is that the pages become linked to each other through the swatch row, which gives crawlers a path between colourways that did not exist before. If you want fewer URLs, that is the merge route, not the grouping route.
Does this change anything in the store I scan?
No. The scan issues read requests for the public storefront feed and the comparison runs in your browser. The fetch is made by our server, which identifies itself as CraftshiftToolsBot, so it appears in the target store's logs like any other crawler. If our server cannot reach the store, the request falls back to a public proxy service, which means the URL you scanned passes through a third party as well. Nothing is written and no login is involved.
Can I scan a competitor's store?
Yes. Everything the scan reads is public data that any visitor's browser can request, so nothing private is involved. Looking at how a large store in your category structures colourways is a reasonable benchmark for how much structure the category expects. Just remember the scan sees only published products, so what you get is their storefront, not their catalogue.
What happens after I group a range?
Check it on the collection page and the product page, on desktop and on mobile, before doing the next one. Swatch position depends on your theme, and finding out that it lands in the wrong place after grouping forty ranges is an avoidable afternoon. Once one range looks right, the app's Bulk Grouping can detect and create the rest in one pass from a title pattern, a tag format or a metafield.