Turn a Shopify or WooCommerce export into a valid Google Shopping feed
A shop export is not a feed: it has one row per variant, no product URL for WooCommerce or Shopify without your store address, and no currency. The Feed Validator maps the export columns to Google’s attributes and shows what is missing. In the example Shopify export, 3 products are read, 2 rows are skipped (an image row and a draft) and the product link is not in the file.
Upload your export, choose the shop type and the currency – the validator shows what is missing for Google.
Open the Feed ValidatorWhat an export has – and what it does not
Shopify (Products → Export) and WooCommerce (Products → Export) write one CSV row per variant. Shopify puts product fields only on the first row of a product and adds rows that only hold an extra image. WooCommerce has a “variable” parent row and “variation” rows that point to it.
Neither export contains what Google needs as a product URL for every row: Shopify can only build it from the product handle and your store address, WooCommerce has no URL at all. Prices come without a currency. Stock is missing in Shopify exports that have no inventory quantity.
Shopify: which column becomes which attribute
The validator reads Shopify’s current column names and the older ones. Draft and archived products and rows without a price are skipped.
| Shopify export column | Google attribute |
|---|---|
| Title | title |
| Description (legacy: Body (HTML)) | description |
| Vendor | brand |
| SKU (legacy: Variant SKU) | id |
| Barcodes (legacy: Variant Barcode) | gtin |
| Price, Compare-at price | price / sale_price |
| Product image URL (variant image first) | image_link |
| Inventory tracker, Inventory quantity | availability |
| URL handle + your store URL | link |
| Option name Color / Size / Material / Pattern | color / size / material / pattern |
WooCommerce: which column becomes which attribute
Variable parents and grouped products are skipped, variations are read as products and inherit title, description, image and brand from their parent where their own cell is empty. Unpublished products are skipped.
| WooCommerce export column | Google attribute |
|---|---|
| Name | title |
| Description (or Short description) | description |
| Brands | brand |
| SKU (otherwise the ID) | id |
| Column with GTIN, EAN, UPC or ISBN in its name | gtin |
| Regular price, Sale price | price / sale_price |
| Images (first one) | image_link |
| In stock? | availability |
| Parent | item_group_id |
| Attribute name Color / Size / Material / Pattern | color / size / material / pattern |
What you still have to add
Check these before you upload; the validator lists each of them once per file instead of once per row:
- Product URL (link): enter your store address for Shopify; for WooCommerce add the URLs yourself or let a feed plugin write them.
- Currency: exports contain prices without a currency, so choose the currency in the validator.
- GTIN: add the barcode where a product has one; products without one need the identifier setting described in the GTIN guide.
- Availability: without an inventory quantity in a Shopify export it cannot be derived.
- Google product category, gender and age group for fashion: Shopify has columns for them, fill them in the Google Shopping fields.
Worked examples: Two small example exports through the validator
Made-up exports: a Shopify file with two variants of one shirt, an image-only row, a draft bag and socks without SKU; a WooCommerce file with a variable tee (two variations), a mug and an unpublished lamp. Example data, not a real shop.
- Shopify: products read
- 3
- Shopify: rows skipped (image row, draft)
- 2
- Shopify: IDs generated (no SKU)
- 1
- Shopify: rejected products without store URL
- 0
- WooCommerce: products read / rows skipped
- 3 / 2
Check the export in the validator before you upload it: it tells you what the export cannot contain, so you fix a few columns instead of hundreds of rows.