What Shopify stores about a variant
Every product in Shopify has up to three options, each with a name and a list of values: Size with S, M, L, XL; Colour with Black, Navy, Sand; Material with Cotton, Linen. Every combination that you actually sell is a variant, and the variant is what carries the SKU, the barcode, the price, the compare-at price, the inventory and, optionally, its own image. A product with no options still has one variant, titled "Default Title".
In the product CSV export this appears as Option1 Name, Option1 Value, Option2 Name, Option2 Value, Option3 Name, Option3 Value, with one row per variant and the option names repeated only on the product's first row. In the Admin API it is options on the product and selectedOptions on each variant. Either way the data is already shaped for a grid; it just is not drawn as one anywhere in Shopify.
Two facts set the boundaries. The classic limit is 100 variants per product, and Shopify has been raising it to 2,048 on stores moved to its newer product model; a catalog template has to cope with both. And option order is per product: one product can be Size then Colour, the next Colour then Size, and nothing in Shopify stops that.
Why one row per variant fails
The simplest way to put variants in a Shopify PDF catalog is to list them: one line per variant with SKU, option values and price. It is what the CSV already looks like and what many catalog apps print. It fails for three reasons that a buyer will tell you about on the first call.
- Length. Apparel averages 15 to 40 variants per style. A 300-style collection is 4,500 to 12,000 lines, or well over 100 pages of lines with the same product name repeated. The buyer wanted to see 300 products.
- No overview. The question at the table is "which colours does this come in, and does the Sand run to XL?" A list makes the buyer scan 40 lines to answer it. A grid answers it in a glance, and the empty cells show which combinations do not exist.
- Nowhere to write the order. A line sheet is an order form. Sales reps write quantities in the cells of a grid and photograph the page. There is no sensible place to write quantities on a 40-line list.
The one case where a list is right is the price list: a document for a buyer who imports it into a purchasing system and needs one SKU, one barcode and one price per line. That is a separate document with a separate purpose, and it is why line sheet apps offer it as a different template rather than as the default.
How the matrix is built from Option1 and Option2
A size × colour matrix is a pivot of the variant list. Building one by hand in a spreadsheet takes four decisions, and they are the same decisions a template makes automatically.
- Which option is the columns, which is the rows. The convention buyers know is sizes across the top and colours down the side, because sizes are short labels and there are usually more of them. The honest rule a template can apply is "first option across, second option down", which matches the way most apparel stores enter their options; the alternative is matching on the option name (Size, Colour, Color, Taille) with the position as the fallback.
- Column order. Sizes must stay in Shopify's option order (XS, S, M, L, XL), never alphabetical, or XL lands between L and XS. Shopify keeps the order you entered; the spreadsheet does not, so a pivot table needs a custom sort. Numeric sizes (36, 38, 40) sort correctly either way.
- What goes in the cell. The SKU. It is the one value the buyer has to copy onto the order. If the variants of a product have different prices (the XXL costs more), the price goes under the SKU in the same cell or in a price-range column beside the grid; if all variants share a price, the price prints once in the row and the cells stay clean. Barcodes do not belong in the cell; they go on the price list.
- Empty cells. A combination with no variant (Sand does not come in XS) is an empty cell, and it should stay visibly empty rather than collapse, because "this colour does not run to that size" is information the buyer needs. Variants that exist but are out of stock are a different question: a line sheet usually shows them, because it is a pre-order document, while a stock list hides them.
In Google Sheets or Excel, the manual version is a pivot table on the CSV: rows = Handle then Option2 Value, columns = Option1 Value, values = Variant SKU. It works for one product. It does not scale, because the pivot produces one giant grid with every size any product has as a column, and because option order and three-option products break it. That is the point at which people stop and look for a template.
Products with three options
A grid has two axes. A product with three options (size, colour and material; or size, colour and fit) needs a rule for the third. There are three, and which is right depends on how many values the third option has.
- Fold it into the row label. If the third option has two or three values, the rows become "Black / Cotton", "Black / Linen", "Navy / Cotton", and the grid stays one block. This is the most readable and the one most templates use.
- One grid per value. If the third option has many values (ten fits), the product gets one small matrix per value, stacked, with the value as a heading. Readable, but the product now takes half a page.
- Drop to a list. If the three options combine into hundreds of variants, no grid fits on a page; the product prints as a list and the catalog notes it. Better to show the real data than a grid that spills off the page.
The same logic covers the simpler cases. A product with one option (Size only) is a grid with one row. A product with no options is a row with one cell, or just the SKU in the product line. A product whose first option is Colour and second is Size prints transposed unless the template matches on names, which is why the name-matching rule matters on a store that was set up by three people over four years.
When the grid does not fit on the row
A line sheet row has a fixed width. Twelve sizes fit; twenty-four do not. The two honest ways out are to split the product across rows, repeating the colour labels so the second row still reads on its own, or to shrink the type until it does fit, which stops being readable at about fourteen columns. Splitting is the better default. What a template should not do is silently drop sizes, and what a catalog maker should do is tell you before the PDF is made which products will be split, so you can decide whether to put that collection in the price list template instead.
How Sheetfolio's compact template handles it
Sheetfolio's compact line sheet template is the automatic version of everything above. For each product it reads the options and variants through Shopify's API, takes the first option as the columns in Shopify's own order and the second as the rows, and prints the SKU in each cell with the retail and wholesale price in the product line. A third option is folded into the row label. Products with one option print as a single row of cells; products without options print the SKU in the line. A product with more variants than fit across the row is split across rows, and the preflight lists those products as "many variants" before you generate, together with variants that have no SKU, because an empty cell that should have had a SKU is the error buyers notice first.
Roughly five products fit on a page, so a 300-style collection is about 60 pages and a 1,500-product catalog about 300. The visual catalog template lists variants under the image instead of as a grid, for products where the picture sells and the variants are few; the price list template prints the one-line-per-variant layout with barcodes, for the purchasing-system buyer. The grid itself has no settings. That is deliberate: the same catalog generates the same rows every time, so "page 12, third row" means the same thing to you and to the buyer in two weeks.
A checklist before you generate
- Option names are consistent across products (Size, not Size on some and size on others), and the first option is the one you want as columns.
- Size values are in the right order in each product's option list. Fix it in the product, not in the catalog.
- Every variant has a SKU. A grid cell without one is useless to the buyer. Our guide on finding products with missing images, SKUs or barcodes shows how to list them in a spreadsheet in five minutes.
- Colour names are what the buyer will say on the phone, not internal codes, because they become row labels.
- If some variants have their own image, decide whether the catalog shows the product image or the first variant image; a line sheet shows one image per style.
Frequently asked questions
How many options and variants can a Shopify product have?
Up to three options per product, for example size, colour and material. The long-standing limit is 100 variants per product; Shopify has been raising it to 2,048 on stores moved to its newer product model. A size × colour matrix handles any count, as long as the template splits a product across rows when the grid gets too wide for the page.
What goes in each cell of a size × colour matrix?
The variant's SKU, because that is what the buyer writes on the order form. If prices differ by variant, the price goes under the SKU or in a separate price-range column. An empty cell means that size and colour combination does not exist as a variant, which is itself useful information for the buyer.
Does Sheetfolio build the matrix automatically?
Yes. The compact line sheet template reads each product's options and variants from Shopify, uses the first option as the columns and the second as the rows, puts the SKU in each cell, and adds rows for a third option. A product with more variants than fit on one row is split across rows and flagged by the preflight before the PDF is made.
Related: Best Shopify line sheet & PDF catalog apps · How to create a wholesale line sheet from Shopify · B2B catalog vs line sheet.
One Row per Style, Not Forty
Sheetfolio prints your Shopify variants as a size × colour matrix with the SKU in each cell, wholesale price beside retail. Free for up to 100 products.
Install Sheetfolio on Shopify