Shopify Variants and the 2,048-Variant Limit: When to Split Products Into Separate URLs
Shopify now allows 2,048 variants per product, but every variant still shares one indexable URL. Here is how to decide which options stay as variants and which deserve their own product page.

- Since October 15, 2025, every Shopify plan supports up to 2,048 variants per product, but still only three options and 250 media items.
- Liquid returns at most 250 variants from product.variants when unpaginated, so variants beyond that are invisible to theme code and to crawlers reading the HTML.
- Variant URLs with ?variant= canonicalize to the base /products/ URL, so no matter how many variants a product has, it gets one indexable page.
- Split a variant into its own product only when it has independent search demand, meaningfully different content and a SERP that rewards specific product pages.
- Often the better answer is neither: keep the variant, and build a collection for the attribute people search for.
On October 15, 2025, Shopify raised the variant limit from 100 to 2,048 per product, on every plan. For stores that had been splitting products because of the old cap, that was a relief. For SEO, it raised a harder question. Just because you can put 1,500 variants on one product, should you?
The answer depends on one fact about how Shopify handles variants: however many a product has, it gets one indexable URL. Everything in this post follows from that.
The current limits#
These are the numbers as of September 2026. Shopify changes limits more often than most platforms, so confirm them in the Shopify Help Center before planning a catalog restructure.
| Limit | Value | Notes |
|---|---|---|
| Variants per product | 2,048 | All plans, since October 2025. Previously 100. |
| Options per product | 3 | For example Size, Color, Material. Unchanged. |
| Media per product | 250 | Images, videos and 3D models combined. |
Variants returned by product.variants in Liquid | 250 | When unpaginated. Paginated pages can show up to 50 each. |
| Child products in a combined listing | 60 | Plus only. See below. |
Shopify's changelog also warned that apps still using the older REST product APIs may break or behave oddly on products with more than 100 variants. If your catalog relies on older apps for feeds, reviews or inventory sync, test before you consolidate.
How Shopify handles variant URLs#
Every variant can be reached with a query parameter: /products/handle?variant=41234567890. Themes use it to preselect the right size or color when someone clicks a swatch, a Shopping ad or a filtered collection. Shopify's Liquid docs note that in search results and filtered collections, product.url automatically includes the variant parameter of the most relevant variant.
What Shopify does not do is give variants their own canonical. View source on any ?variant= URL and you'll see this:
<!-- /products/slate-pool-table?variant=41234567890 -->
<link rel="canonical" href="https://example.com/products/slate-pool-table">So Google consolidates every variant onto the base product URL. That's correct behavior for true variants: a walnut and an oak version of the same table shouldn't compete with each other. It also means that a variant can't rank on its own for a query the base product page doesn't answer.
What Google wants from variant pages#
Google's documentation on product variants describes two valid structures:
- Single-page: all variants on one URL, preselectable with query parameters, with one canonical URL for the group. This is Shopify's default.
- Multi-page: each variant (or group of variants) on its own URL, connected with structured data.
Either way, Google recommends marking up the group with ProductGroup, listing variants under hasVariant and naming the varying attributes in variesBy (color, size, material, pattern and a few others). Shopify's structured_data Liquid filter outputs a ProductGroup for products with variants, so a modern theme that uses it gets the basics right. Custom JSON-LD in older themes often outputs a flat Product with one offer, which is worth checking.
The 250-variant ceiling nobody mentions#
The backend allows 2,048 variants. Liquid, which renders every theme page, returns at most 250 from product.variants when unpaginated. Anything beyond that:
- isn't in the server-rendered HTML unless the theme fetches it separately with JavaScript
- isn't in JSON-LD generated from Liquid loops
- can't be preselected by a swatch that's built in Liquid
Page weight is the other cost. Themes often print variant data several times (the product form, a JSON blob for the variant picker, structured data, analytics). At a few hundred variants, that adds up.
You can spot risky products in a theme with a quick check:
{%- if product.variants_count > 250 -%}
{%- comment -%} Only the first 250 variants are available to Liquid here {%- endcomment -%}
{%- endif -%}Our working rule: stay under 250 variants per product unless a developer has built and tested the storefront for more, and the products genuinely need it (configurable furniture, for example).
When to split a variant into its own product#
This is the decision that actually affects rankings. Keeping everything as variants gives you one strong page. Splitting gives you more pages that can each target a specific query, at the cost of splitting reviews, links and content.
We split when all four of these are true:
- The variant has its own search demand. People search for it specifically, and the volume is meaningful for your niche.
- Page one rewards specific product pages. Search the query. If page one is full of product pages for that exact attribute, you need one. If it's category pages, you need a collection instead.
- The content genuinely differs. Different specs, dimensions, images, delivery requirements or reviews. If the only difference is the name, a split creates two thin pages.
- The buyer decision differs. A price gap of hundreds of dollars, a different room size or a different installation requirement usually means a different purchase.
Examples from high-ticket categories#
| Product | Attribute | Typical decision | Why |
|---|---|---|---|
| Slate pool table | Size (7, 8, 9 ft) | Split, or build size collections | Buyers search by size, room-size needs differ, prices differ a lot |
| Slate pool table | Cloth color | Keep as variant | Little independent demand, same specs |
| Built-in gas grill | Width (30, 36, 42 in) | Split | Width-specific searches, different cutout dimensions for outdoor kitchens |
| Built-in gas grill | Propane vs natural gas | Keep as variant | Same product, a fuel choice at checkout |
| Barrel sauna | Capacity (2, 4, 6 person) | Split | Capacity-specific searches, different dimensions and heater sizes |
| Barrel sauna | Wood species | Usually variant | Split only if one species has real demand and its own content |
| Greenhouse kit | Footprint (8x10, 10x12) | Split or collections | Size-specific searches, different permits and foundations |
| Sofa | Fabric color | Keep as variant | Same product, same page intent |
For a deeper look at the buyer journey on products like these, see SEO for high-ticket brands.
How to check whether a variant has its own demand#
You don't need expensive tools to run the first test. Three data sources already on hand will tell you most of what you need.
Search Console. Open the Performance report, filter to the product's URL and look at the queries. If "9 ft" or "4 person" appears in dozens of queries with impressions but the page sits on page two or three, the attribute has demand the page isn't fully capturing. That's a signal to split or to build a collection.
Your own site search. Shopify's analytics include top online store searches. If shoppers type "9 ft pool table" into your search box every week, other people are typing it into Google.
A keyword tool. Check the attribute plus the product type ("9 ft slate pool table", "6 person outdoor sauna") and note the volume, then search it and look at page one. Volume tells you whether it's worth a page. The SERP tells you which kind of page.
A useful shortcut: if the attribute appears in your competitors' product titles and URLs, and those product pages rank, Google has already shown you it rewards specific pages for that attribute.
The cost of splitting badly#
A common pattern in catalog audits is a store that split every color into its own product "for SEO" and ended up worse off:
- Duplicate content. Forty products with the same description and specs, differing by one word. Google picks one and ignores the rest. See Shopify duplicate content for how Shopify multiplies this.
- Split reviews. Twelve reviews spread across six products looks weaker than 72 on one.
- Cannibalization. Several near-identical pages rotating in and out of position 8 to 15 for the same query.
- Messier collections. Six copies of the same product in the grid pushes other products off page one of the collection.
If you split, each new product needs its own title, description, images, spec table and FAQs. If you can't justify that content, keep the variant.
Combined listings on Shopify Plus#
Shopify's Combined Listings app, available on Plus, groups separate products so they display as one product with options. There's a parent product and up to 60 child products. Each child is a real product with its own handle, images, description and URL, and the storefront switches between them like variants. Shopify's free themes support combined listings from version 15.0.0.
For SEO, this gives you the multi-page structure Google describes: separate indexable URLs for each child, with a shopper experience that feels like one product. Two things to check on your theme:
- Canonicals. Each child product should canonicalize to its own URL. View source on two children and confirm.
- The parent URL. Parent products can't be purchased and have their own URL. Decide whether that page is useful to searchers or a near-duplicate of the first child, and check how your theme and sitemap handle it.
The non-Plus alternative: sibling products#
On other plans, you can get most of the benefit with a product reference list metafield. Create a definition such as custom.siblings (type: list of products), link each product to its siblings, and render swatches that link between them:
{%- assign siblings = product.metafields.custom.siblings.value -%}
{%- if siblings != blank -%}
<nav class="product-siblings" aria-label="Other sizes">
{%- for sibling in siblings -%}
<a href="{{ sibling.url }}"{% if sibling.id == product.id %} aria-current="page"{% endif %}>
{{ sibling.metafields.custom.sibling_label.value | default: sibling.title }}
</a>
{%- endfor -%}
</nav>
{%- endif -%}These are plain <a href> links in the HTML, so they also work as internal links between related products. More on that in Shopify internal linking.
Restructuring an existing catalog safely#
Merging or splitting products on a live store changes URLs, so plan it like a small migration.
- Export Search Console data for every product you'll touch. Note which queries and URLs get clicks.
- Decide the target structure using the four-question test above.
- Create the new products first, with complete content, before removing anything.
- Add 301 redirects from any retired product URL to its closest replacement. Our guide to redirects at scale covers bulk redirect imports.
- Update internal links in menus, collections and blog posts so they point to final URLs, not redirects.
- Move reviews where your review app allows it, and update Merchant Center if you manage the feed outside Shopify.
- Recheck in four weeks. Look for new products stuck in "Discovered, currently not indexed" and for old URLs still ranking.
Quick reference#
| Situation | Do this |
|---|---|
| Color, finish or fabric with little search demand | Variant |
| Size or capacity people search for, with category SERPs | Variant, plus a collection per size |
| Size or model people search for, with product-page SERPs | Separate products, linked as siblings |
| Product with 250+ variants | Test Liquid output and page weight, or restructure |
| Plus store wanting separate URLs with one product experience | Combined listings |
If your store has thousands of SKUs and a history of splitting and merging, the Shopify SEO checklist is a good place to audit the basics before changing structure.
Questions people ask about this
How many variants can a Shopify product have?
Up to 2,048 variants per product on all plans, since Shopify raised the limit from 100 in October 2025. Each product can still have only three options, such as size, color and material, and up to 250 media items. Liquid themes can access at most 250 variants through product.variants, so very large variant counts need testing on the storefront.
Do Shopify variant URLs get indexed separately?
Not in organic web search. A variant URL like /products/handle?variant=123 canonicalizes to /products/handle by default, so Google consolidates all variants onto the base product page. In Merchant Center and Shopping, each variant is submitted as its own item with the variant URL, so variants can appear individually in free listings and ads.
Is it better for SEO to use variants or separate products?
Variants are better when options share the same content and search intent, such as colors or finishes. Separate products are better when an option has its own search demand, different specs or pricing, and page one shows specific product pages for that query. Splitting without unique content usually creates thin duplicates and splits your reviews.
What are Shopify combined listings and do they help SEO?
Combined listings is a Shopify Plus app that groups up to 60 separate products under a parent so they display as one product with options. Each child keeps its own URL, images and description, so each can rank on its own. Check that each child canonicalizes to itself and decide how to handle the parent product URL.
Why does my Shopify product show only 250 variants?
Liquid returns a maximum of 250 variants from product.variants when unpaginated, even though the admin allows 2,048. Variants beyond 250 are not available to theme code, so swatches, variant pickers and Liquid-generated structured data may miss them. Themes need to load the rest with the Storefront API, or the product needs restructuring.
Want this done on your store?
SEO for Shopify stores with 1,000 to 100,000 SKUs: faceted navigation, variants, crawl budget, programmatic collections with metaobjects and internal linking at scale.
More from Collections & catalog

Shopify Metafields for SEO: Spec Tables, FAQs and Schema Without Another App
Shopify metafields store the product details your theme and Google need: specs, FAQs, schema properties, filters and even your SEO titles. This guide covers how to set them up and use them for SEO without adding another app.

What Is Your Shopify Blog Actually For? A Content Strategy That Sells
Most Shopify blogs are a list of posts nobody searches for. A blog that sells does five jobs: early traffic, links, internal links, conversion and authority. Here is how to plan, write and set one up on Shopify.

Shopify AI Product Descriptions: Writing 1,000+ Without Thin Content
Shopify Magic and description apps can draft 1,000 product descriptions in an afternoon. This is the workflow we use to make them accurate, distinct and useful: spec data first, tiered effort, and QA before anything goes live.