Since 28 September 2026, the colour, fabric and fit values sitting in your product category metafields are available as dimensions inside Shopify's analytics reports. You can group units, revenue and sessions by colour without exporting orders, exporting products, and matching them on SKU in a spreadsheet. For a Canadian apparel brand sitting down to plan a spring buy, that turns a two-day data job into a report you read with coffee. The catch is that Shopify category metafields analytics only reports what you actually populated, and most catalogues we open have maybe 40% of the taxonomy fields filled in.
So the work is mostly backfill. The reporting part is easy now.
What the product taxonomy actually gives you
When you assign a product to a category in Shopify's standard taxonomy — say Apparel & Accessories > Clothing > Shirts & Tops — Shopify offers a set of attributes that belong to that category. Colour, size, fabric, sleeve length, neckline, pattern, target gender, age group. These are category metafields. Some accept a controlled list of values, some accept free text, and some can point at a metaobject you define yourself.
That controlled list is the whole point. Your variant options already contain colour, but as free text, which is how a 300-SKU catalogue ends up with Navy, navy, Midnight, Dark Blue and Indigo all describing the same roll of fabric. Group a report by variant option and you get five rows that should be one. Group by the taxonomy colour attribute and you get one row, because the value came from a list.
Metaobject fields are now reportable too, which matters more than it sounds. Define a Fabric metaobject with fields for composition, weight in GSM, mill, care instructions and the French name. Reference it from every product. Now you can ask which GSM band sells through fastest in October, or whether the 60/40 cotton-poly blend outperforms the 100% cotton at the same price. That question used to require a developer and a CSV.
Clean the data first, or the report lies to you
Here is the failure we see most often. A brand switches the reports on, groups by colour, sees Black at 38% of units and Oatmeal at 4%, and concludes Oatmeal is dead. Then somebody checks and finds Oatmeal was only tagged on eleven of the forty products that come in Oatmeal. The other twenty-nine landed in a null bucket nobody looked at.
Before you trust a single number, run three checks:
- How many products have no category assigned at all? Those produce no category metafields, full stop.
- What percentage of active variants have the colour attribute populated? Under 95% and your rankings will move when you fix it.
- Is colour set at variant level or product level? A product-level value on a four-colour tee is wrong and will attribute all units to one colour.
Backfilling a few thousand variants is tedious but not hard. A Matrixify import against an export of your existing option values, with a mapping table for the synonyms, gets most of it. Budget a day for the mapping and half a day for QA. If you'd rather not do it in-house, this is the kind of thing a Shopify developer on a short engagement can clear in a week, and it only has to happen once if you then lock the fields into your product setup checklist.
Sell-through analysis by attribute, with the arithmetic
Reporting by colour is only interesting when you divide by what you bought. Sell-through, not units.
Take a fleece crew from a fall drop. You received 1,200 units: Black 480, Oatmeal 300, Olive 240, Rust 180. Eight weeks later the colour dimension shows Black 336 units sold, Oatmeal 255, Olive 108, Rust 126.
- Black: 336 ÷ 480 = 70%
- Oatmeal: 255 ÷ 300 = 85%
- Olive: 108 ÷ 240 = 45%
- Rust: 126 ÷ 180 = 70%
Black moved the most units and is the least interesting number on the page. Oatmeal is the story: you underbought it by a wide margin and it will be gone before Boxing Day. Olive is the one you keep repeating because it looked good on the range plan. Move Olive's 240 into Oatmeal next buy and you've made a decision from one report instead of a fight in a planning meeting.
Now subtract returns, because gross sell-through flatters apparel. If Rust came back 18 times, net is 108 ÷ 180 = 60%, and Rust is suddenly closer to Olive than to Black. Shopify's returns data carries a reason code, so you can run net sell-through by colour rather than gross. Do that before you commit fabric.
Province, season and the two Canadian peaks
Cross colour with shipping province and the picture gets more useful and more dangerous at the same time. Useful, because a brand selling across Ontario, Quebec, BC and Alberta is selling into four different climates and four different dress cultures. Dangerous, because once you split 1,200 units by four colours, five size curves and ten provinces, half your cells have eight orders in them and you're reading noise.
Our rule of thumb: don't make a buy decision on a cell with fewer than about 50 units, and roll the small provinces into regions. Ontario, Quebec, BC and Prairies as four buckets will hold up. Ten provinces and three territories will not.
Season needs a hard split at the discount boundary. Canadian apparel has two peaks, BFCM and then Boxing Day into the first week of January, and a colour that only clears at 40% off is not a colour that works. Segment full-price sell-through from promotional sell-through and treat them as separate questions. The second-markdown performance of a shade tells you what to buy for the outlet channel, nothing more.
One more Canadian wrinkle. When Canada Post disruption stalls parcels, velocity reports go strange for a fortnight and then overshoot when the backlog clears. Report on order date, not delivery date, and keep a note of the weeks where fulfilment was abnormal. We've watched a brand nearly cut a style because its week-three numbers collapsed during a service interruption that had nothing to do with the product. If your carrier fallback rules already reroute to Purolator or UPS past a threshold, record the week the switch happened so the sell-through curve can be read properly later.
Material and fit reporting: returns say more than sales
Sales by fabric is mildly interesting. Returns by fabric is where the money is.
Set fit as a category attribute — slim, regular, relaxed, oversized — and composition on the fabric metaobject. Then look at return rate by fit, and at the split between "size too small" and "size too large" within each fit. A relaxed block returning 9% with returns skewing to "too large" means your size chart is lying about that block, and the fix is a chart edit and a PDP note, not a new sample. A slim block returning 14% with reasons spread evenly across size, style and colour means the problem is the product.
Composition matters for a second reason if you ship south. US de minimis treatment of low-value parcels no longer works the way Canadian brands got used to, so fabric content drives the tariff line on every cross-border order. If your composition already lives in a structured metaobject field rather than in a paragraph of description text, your customs data and your merchandising data come from the same place. That's one less reconciliation.
Metaobjects carry French, which makes Bill 96 cheaper
Colour names are commercial documentation. In Quebec that means French, and "Oatmeal" on a filter chip is not a marketing preference you can defer.
If colour and fabric are metaobjects with a French field alongside the English one, the translation lives in one record and flows to the PDP spec table, the filter label, the size chart and the report dimension at the same time. Change it once. The alternative — French strings scattered across theme locale files, product descriptions and a filter app's own settings — is how brands end up with a bilingual storefront that's 80% translated and the missing 20% is all customer-facing.
Reports stay grouped on the underlying handle, so Avoine and Oatmeal remain one row. Which is what you want when you're counting units.
Use the same fields to filter collection pages, not just to report
The structured data you just built for reporting is the same data a shopper needs to narrow a 400-piece collection. Shopify's Search & Discovery app will turn a metafield into a storefront filter without a developer, and for a mid-size catalogue with a sane number of facets that's the right answer. Variant-level colour filters correctly; product-level colour will filter the whole product, which is usually not what you meant.
Where it gets tight is a large catalogue with many facets, synonym handling on search, or merchandising rules that change by season. That's when a purpose-built filter layer earns its fee — our own FilterPro reads the same metafields and adds AI search on top, so the taxonomy work you did for the buying plan also does a job on the collection page.
The reason to connect the two is that filter usage is itself a demand signal. If 22% of collection sessions apply the Linen filter and linen is 6% of your buy, you have a gap that no sales report will show you, because people can't buy what you didn't order.
Shopify dimensions and GA4 custom dimensions are not the same thing
People search for custom dimensions in Shopify analytics and find conflicting answers, so to be plain: Shopify doesn't have a user-defined custom dimension system the way GA4 does. What it has now is reporting dimensions backed by category metafields and metaobject fields, which covers the apparel attribute case without any tagging work.
GA4 custom dimensions are still worth setting up for the pre-purchase side — item-scoped parameters for colour and fabric pushed on view_item and add_to_cart let you measure which shades get viewed and abandoned, not just which get bought. Shop Pay's high adoption in Canada means a chunk of your checkouts complete fast and off the usual funnel steps, so lean on the Shopify-side numbers for anything revenue-related and treat GA4 as the browsing-behaviour layer.
Short answers to the questions this raises
Can I report by product colour in Shopify without an app? Yes, if colour is set as a category metafield on the variant. Group a sales report by that dimension. If you've only got colour as a variant option, you'll get the same shade split across several rows under different spellings.
Do metaobject fields appear in reports? Yes, for the fields on metaobjects referenced by products. Define the metaobject once, reference it consistently, and GSM or mill or composition becomes groupable.
How far back does the data go? The dimension reads the current value on the product, not the value at the time of sale. Backfill a colour attribute today and last season's orders roll up under it, which is handy. It also means that if you rename a colour, history moves with it.
What's the minimum useful setup for a buying plan? Category assigned on every product, colour and size at variant level, fabric as a metaobject reference, fit as a category attribute. Four fields. Everything above runs off those.
Start with one category — your highest-volume one, usually tops — and populate it properly rather than doing a thin pass across the whole catalogue. Run net sell-through by colour on last fall's buy and see whether the numbers argue with your range plan. They usually do. If you want a second pair of eyes on the taxonomy setup before you commit a season to it, our Canada team will look at the catalogue and tell you what's missing, and a free store audit is the quickest way to get that started.


