Free Shopify store auditSpeed, SEO and conversion leaks — no cost, no obligation.
Claim it
Thriftizer Solutions LLPShopify Select Partner
Book a Growth Audit
Shopify Aug 15, 2026 9 min read

Google Shopping Feeds for Fashion: Size, Colour and Variant Titles

Variant-level rows, colour mapping, size_type and the custom labels that matter in apparel — the feed attribute rules we apply to fashion catalogues on Shopify.

If you sell apparel and your Shopify feed is sending one row per product, stop there and fix that first. Everything else in Google Shopping feed optimization for fashion depends on the feed being variant-level: one offer per size and colour combination, all of them tied together with item_group_id, each with its own price, availability, image and landing page. Get that wrong and no amount of title tuning will help, because Google is matching a query like "black linen shirt size L" against a row that doesn't exist.

The rest of this is the attribute rules we apply to apparel catalogues, in the order we apply them.

One row per variant, grouped correctly

A style with 3 colours and 6 sizes is 18 offers. Not one. Each row gets:

  • id — the Shopify variant ID. Stable, unique, never reused. Don't key off SKU if your ops team edits SKUs, and they do.
  • item_group_id — the same value across all 18 rows, usually the Shopify product ID. This is what tells Google these are the same garment, so it can show one tile and let the shopper pick a size rather than showing you six near-identical listings competing with each other.

Two failure modes we see constantly. First, item_group_id set to the product handle, which changes when marketing renames a style mid-season and silently splits the group. Second, colourways published as separate Shopify products, so navy and olive never group. If your merchandising team genuinely wants separate PDPs per colour, you can still assign a shared item_group_id through a metafield. It's a five-minute decision that decides whether your Shopping tiles look like a catalogue or a mess.

Titles built to survive truncation

The title field takes 150 characters. Almost nobody sees 150 characters. On a crowded Shopping surface you get a few dozen before the ellipsis, so what sits in the first 40 or so is what does the work.

The template that holds up for apparel:

Brand + garment type + defining attribute + colour + size + fit/length

So: Kora Cotton Poplin Shirt, Indigo, Size L, Relaxed Fit. Not Kora "Midnight Monsoon" Shirt — New Drop SS25, which is the product title your copywriter wrote and which tells Google nothing.

Colour before size, because colour is the more common query modifier. Size last, because it's the part you can afford to lose to truncation once the group is matched. Drop season codes, drop "New", drop exclamation marks. If you sell in a category where a material is the query — linen, merino, leather — put the material ahead of the colour.

Build the title in the feed layer, not by rewriting your Shopify product titles. Your PDP title is for humans reading a page with a photo next to it. The feed title is for a matching engine reading text. They should differ, and keeping them separate means your organic product content doesn't get mangled to serve Ads.

Colour: the attribute fashion brands get wrong most

Google wants a colour value it can bucket. Your merchandiser wants "Ash Rose". Both can win, but only if you map.

The rule we use: the color attribute takes up to three values separated by a forward slash, primary first, 100 characters total. Send the base colour first and the marketing name after it if it's genuinely descriptive — Rose/Pink is fine, Ash Rose alone is not. Multi-colour garments like a printed saree or a colour-blocked jacket should list the dominant colour first, then up to two more. Don't write "Multicolour" and walk away; it matches nothing.

On Shopify this means a lookup table. Option value → base colour, held in a metafield or a supplemental feed keyed on variant ID. We build the first pass from the existing option values, and then we have to redo part of it, because a new drop lands with fourteen colour names nobody has mapped. That's not a one-time job. Assign it to whoever publishes new styles, or it rots by the second season.

British spelling is a related trap. If your Shopify option is named "Colour", plenty of feed tools won't auto-detect it as the colour option. Check the mapping rather than assuming.

Size, size_type and the second-option problem

Three attributes, and they are not interchangeable.

  • size — one value per offer. "L". "32". "One Size" for free-size garments, not "Free Size" or a blank.
  • size_type — regular, petite, plus, maternity, big-and-tall. If you run a plus range under the same style codes as your regular range, this attribute is the only thing keeping them apart in Google's eyes.
  • size_system — US, UK, EU and so on. Check the current supported list before you assume yours is on it; it's short, and it does not cover every market you might sell into. Pick the system your actual size chart is cut to and be consistent across the catalogue. Mixed systems inside one feed produce size filters that lie.

Denim is where this breaks. A jean with waist and inseam as two Shopify options gives you 30/32, 32/32, 32/34 and so on, but Google takes one size value. Concatenate: 32W 34L as a single string, consistently formatted, every time. Same for shoes sold in width variants. If you have three options — colour, size, length — Shopify already caps you at three, and the feed needs colour in color and the other two merged into size.

Gender, age group and the attributes that trigger disapprovals

For apparel targeting the US, UK, Germany, France, Japan and Brazil, Google requires gender, age group, size and colour. Miss one and the item is disapproved, not demoted. In India and the UAE these are recommended rather than mandatory, but send them anyway: they feed the size and gender filters shoppers actually use.

gender is male, female or unisex. age_group is newborn, infant, toddler, kids or adult. Kidswear brands routinely send "kids" for a 2-year-old's romper when Google's bucket is toddler, and then wonder why they don't show for age-filtered queries.

The other reliable disapproval in fashion is promotional text burned into the image. A "40% OFF" flash on the hero shot, a logo watermark, a border with the campaign hashtag. Google rejects it. Your festive creative can live in your ad assets and on-site banners; the feed image has to be the garment on white or on a model, clean.

You probably don't have GTINs, and that's fine

Most Indian and Gulf fashion labels manufacture their own product and have no EAN. Don't buy a barcode block to satisfy a validator, and never invent one — a wrong GTIN maps your ₹3,200 kurta to somebody else's product and the disapproval that follows is worse than the missing field.

The correct handling: send brand, send mpn if you have a real manufacturer part number, and set identifier_exists to no. You'll lose some rich-matching signals. You'll keep your listings live.

If you resell third-party labels alongside your own line, the resold items almost certainly do have GTINs, and you should send them. A feed can carry both.

Images per colour, availability per size

The image_link on a navy row must be the navy photo. Obvious, and broken on a large share of the catalogues we audit, because the Shopify variant image was never assigned and the feed falls back to the product's first image. Six colourways, one black hero shot, and a click-through rate that quietly halves.

Availability is the more expensive one. It belongs on the variant row, not the product. When XS sells out, that single row goes out of stock and the other five keep serving. If your setup pushes product-level availability, you either keep advertising sizes you can't ship or you kill the whole style over one dead size.

Here's the arithmetic that makes the case internally. Take a hero style pulling 1,200 Shopping clicks a month at a ₹18 average CPC — ₹21,600 in spend. Say S and M are 45% of your size mix and both are out. 21,600 × 0.45 = ₹9,720 a month landing on a page where the shopper's size is greyed out. That's not a conversion rate problem. It's a feed problem, and it repeats on every style with a broken size run.

Also send the variant-specific landing page. Shopify's ?variant= parameter preselects the right colour and size on arrival, and the price on that page has to match the price in the feed exactly, GST-inclusive for India, in the currency of the target country. Currency-converted feeds for the US or UAE off an INR base are a standing source of price-mismatch disapprovals; price each market properly rather than letting a converter do it live.

Post-click, the shopper who lands on a sold-out size usually goes to the collection page next. If that page can't filter by size-in-stock, you've paid for the click twice and got nothing. FilterPro is what we install for that on larger catalogues.

Custom labels that reflect how fashion actually makes money

Five custom label slots, and generic advice wastes them. What earns its place in apparel:

  • custom_label_0 — margin band. Full-price, first markdown, clearance. Bid accordingly.
  • custom_label_1 — return rate band by category. Dresses and fitted trousers come back; tees and accessories don't. If your 30-day return rate on occasionwear is 34% and on knitwear is 9%, those two should not sit at the same target ROAS.
  • custom_label_2 — size curve health. Flag styles where fewer than half the size run is in stock, then exclude or bid down that segment. This single label usually pays for the whole feed rebuild.
  • custom_label_3 — drop or season, so you can push new arrivals hard for three weeks without hand-building campaigns.

Computing the size-curve label needs a nightly job against inventory levels, which is a small piece of work for a developer and not something a feed app will do for you out of the box.

How we build this on Shopify

Shopify's own Google channel handles the basics and maps a handful of metafields. It won't build title templates, it won't map marketing colour names to base colours, and it won't compute size-curve labels. So the practical stack is: metafields for the values a human maintains (base colour, size_type, gender, age_group), a supplemental feed keyed on variant ID for anything computed, and either a dedicated feed tool or a small custom export for the title logic.

Order of work on a rebuild: fix grouping and IDs, fix availability and variant images, fix the required apparel attributes to clear disapprovals, then tune titles and labels. Doing titles first is the common instinct and the wrong one, because pretty titles on disapproved rows earn nothing.

Budget a week for a 300–500 style catalogue if the option structure is clean, longer if colourways live as separate products or the size options are inconsistent between categories. Most of that time is the colour map, and most of the disagreement is with merchandising, not with Google. If you'd rather not staff it internally, this is a well-defined scope for a Shopify developer working alongside your ads team.

Pull your Merchant Center diagnostics, sort disapprovals by attribute, and count how many of your live rows are actually variant-level. If that count is lower than sizes × colours × styles, you know where the money is going. We'll look at the feed and the account together in a free audit if you want a second pair of eyes on it.

Previous postNext post

Ready to scale your D2C brand profitably?

Let's build a growth engine that drives more traffic, more conversions and more profit.

Book a Growth Audit
📅 Free Audit💬 WhatsApp