Template
Google Shopping feed template
The columns Google Merchant Center requires, the ones that only apply to apparel or variants, example rows for four kinds of store, a CSV for Excel or Google Sheets, the same product as XML, and a plan to fill it from your own catalog.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Every product needs id, title, description, link, image_link, availability and price. New products also need brand, plus a gtin or mpn (or identifier_exists set to no).
- Apparel sold in the US, UK, Germany, France, Brazil or Japan also needs item_group_id, color, size, gender and age_group.
- Titles may run to 150 characters and descriptions to 5,000; Google truncates what it shows, so put the distinguishing words first.
- Merchant Center documents tab-delimited text (.txt/.tsv) and XML as file types. The CSV below is for editing; save it as tab-delimited for a manual upload, or let a feed tool publish it on a URL, where Merchant Center fetches a comma CSV fine.
- Textfinity's Google Shopping channel template pre-fills these headers; we map each one from your store once and the feed rebuilds on a schedule.
What goes in a Google Shopping feed template
A Google Shopping feed is a table with one row per sellable item and one column per product attribute. Merchant Center reads the header row as attribute names, so the headers must use Google's exact spelling, lower case with underscores. The table below is the core set: the attributes Google requires for every product, the ones it requires for new products, and the identifier rules that cause most first-upload disapprovals.
| Column | Requirement | Limit / format | Example |
|---|---|---|---|
| id | Required | Max 50 characters, unique and stable | SKU-10432 |
| title | Required | Max 150 characters, plain text | Nike Pegasus 41 Men's Road Running Shoes, Blue, US 9.5 |
| description | Required | Max 5,000 characters, plain text | Neutral daily trainer with ReactX foam and a wider toe box. |
| link | Required | URL starting with http or https | https://store.example/products/pegasus-41 |
| image_link | Required | URL; JPEG, PNG, WebP, GIF, BMP or TIFF | https://cdn.example/pegasus-41-blue.jpg |
| availability | Required | in_stock, out_of_stock, preorder, backorder | in_stock |
| price | Required | Number + ISO 4217 currency | 129.99 USD |
| brand | Required for new products (not books, movies, music) | Max 70 characters | Nike |
| gtin | Strongly recommended when one exists | Up to 14 digits (UPC, EAN, JAN, ISBN, ITF-14) | 00195866188174 |
| mpn | Required if the product has no GTIN | Max 70 alphanumeric characters | DV3853-400 |
| identifier_exists | Optional; set to no when there is no GTIN or MPN | yes / no | no |
| condition | Required for used or refurbished items | new, refurbished, used | new |
| google_product_category | Optional, recommended | Taxonomy ID or full path, not both | 187 |
| product_type | Optional | Max 750 characters, your own path | Shoes > Running > Road |
Attribute names, requirements and limits from Google's product data specification, checked 2026-10-27.
Apparel, variant and sale columns the template needs in some cases
The second group is conditional. Google requires it for apparel in six countries and for any product that comes in several colors, sizes or materials; everywhere else it is optional but improves matching. Sale pricing lives in its own two columns so the regular price stays visible.
| Column | When required | Limit / format | Example |
|---|---|---|---|
| item_group_id | Variants in US, UK, DE, FR, BR, JP; all free-listing variants | Max 50 characters, same value across variants | PEG41 |
| color | Apparel in those countries; multi-color products | Max 100 characters, primary color first | Blue/White |
| size | Apparel in those countries; multi-size products | Max 100 characters | US 9.5 |
| gender | Apparel in those countries | male, female, unisex | male |
| age_group | Apparel in those countries | newborn, infant, toddler, kids, adult | adult |
| material | When it distinguishes variants | Max 200 characters, up to 3 separated by / | Leather/Rubber |
| pattern | When it distinguishes variants | Max 100 characters | Striped |
| sale_price | Optional | Number + currency, lower than price | 99.99 USD |
| sale_price_effective_date | Optional, with sale_price | ISO 8601 start/end, max 51 characters | 2026-11-20T00:00-05:00/2026-11-30T23:59-05:00 |
| availability_date | Required when availability is preorder | ISO 8601, up to one year ahead | 2026-12-15 |
| product_highlight | Optional | Max 150 characters each, 2 to 100 values | Reflective heel tab |
| custom_label_0 … custom_label_4 | Optional | Five free-text labels for campaign grouping | bestseller |
Google Shopping CSV template or XML feed template?
Merchant Center's file-format page lists tab-delimited text (.txt, .tsv) and XML (RSS 2.0 or Atom 1.0), optionally gzipped. It does not mention comma-separated files, so a CSV you edit in Excel should be saved as tab-delimited text before a manual upload, or pasted into a Google Sheet and added as a Sheets data source. A comma-delimited CSV that Merchant Center fetches from a feed tool's URL is processed without trouble in practice; Textfinity publishes CSV that way and can also publish TSV. XML carries the same attributes with a g: prefix inside an <item> element; it is what most platform plugins emit.
The two formats are interchangeable in what they can express. Pick the spreadsheet if a person maintains the feed and XML if software does. The same product from the CSV download looks like this as an RSS item:
google-shopping-feed.xml (one item)
<item>
<g:id>SKU-10432</g:id>
<g:title>Nike Pegasus 41 Men's Road Running Shoes, Blue, US 9.5</g:title>
<g:description>Neutral daily trainer with ReactX foam.</g:description>
<g:link>https://store.example/products/pegasus-41</g:link>
<g:image_link>https://cdn.example/pegasus-41-blue.jpg</g:image_link>
<g:availability>in_stock</g:availability>
<g:price>129.99 USD</g:price>
<g:brand>Nike</g:brand>
<g:gtin>00195866188174</g:gtin>
<g:condition>new</g:condition>
<g:item_group_id>PEG41</g:item_group_id>
<g:color>Blue</g:color>
<g:size>US 9.5</g:size>
<g:gender>male</g:gender>
<g:age_group>adult</g:age_group>
</item>Google Shopping feed checklist before the first upload
Most first-upload disapprovals come from six mistakes, and all of them are visible in the file before Merchant Center sees it. Run through this list on the template rows, then on a sample of your real export.
- Headers match Google's spelling exactly: image_link, not Image URL; google_product_category, not category.
- price carries a currency code (129.99 USD) and matches the landing page in the same currency; for the US and Canada it excludes tax, for most other countries it includes it.
- availability uses one of the four allowed values. Shopify's stock count and WooCommerce's instock/outofstock need a small lookup or advanced rule.
- Every new product has brand and a GTIN or MPN, or identifier_exists is set to no. Made-up GTINs are a disapproval, not a shortcut.
- Variants share item_group_id and differ in color, size, material or pattern; each variant has its own id and link to the variant page.
- No title is longer than 150 characters and no description longer than 5,000; no title is all caps or starts with the price.
- image_link points at a product image on a plain background, at least 500 × 500 px for the 2027 minimum, with no watermark or promotional text.
Filling the template from Shopify, WooCommerce or an existing CSV
The template is only useful if you never type into it. Every store platform already holds the data; the work is mapping its column names onto Google's. Shopify exposes a product API with variants, so the Textfinity Shopify connection pulls title, body_html, variant price, option values and image URLs directly. WooCommerce, Magento, PrestaShop and BigCommerce connect through an export URL (CSV, or XML in Google's RSS format) that Textfinity re-reads on a schedule. Anything missing from the export, such as GTINs kept in a spreadsheet or a category lookup, is joined on as a merged source by SKU.
Once connected, the Google Shopping channel template in Textfinity creates one output column per attribute above with the right header. You map each column with a transform: rename for a straight copy, combine to build a title from brand, product name, color and size, replace from regexp to normalize values, and advanced for conditional logic such as availability from a stock count. Filters drop products that should not be in the feed at all, like out-of-stock items or gift cards. The feed is then published as a file on a stable URL, which is added to Merchant Center as a scheduled data source so Google fetches it on its own schedule.
Examples
Worked examples, by situation
Four stores, four different column sets. Each one is a row you could paste into the template, with the Textfinity rule that produces it from the store's own data.
Apparel row with variants
Before
Handle,Title,Variant Price,Option1 Value,Option2 Value pegasus-41,Pegasus 41,129.99,Blue,9.5
After
id,item_group_id,title,price,availability,gender,age_group,color,size SKU-10432,PEG41,"Nike Pegasus 41 Men's Road Running Shoes, Blue, US 9.5",129.99 USD,in_stock,male,adult,Blue,US 9.5
How we set it up
Map item_group_id from the Shopify product id and color from the variant option with the rename transform, and size with add prefix "US "; build the title with advanced: [product_vendor] + " " + [product_title] + " " + [product_productType] + ", " + [variant_color] + ", US " + [variant_size], and add the suffix " USD" to the variant price with add suffix.
Tax-inclusive price, shipping and material
Before
sku,name,price_net,vat,material,weight_kg SOFA-220,Linen Sofa 3-Seater,1008.40,19,Linen,42
After
id,title,price,shipping,shipping_weight,material,condition SOFA-220,"Dreisitzer-Sofa Leinen, Beige, 220 cm",1200.00 EUR,DE:::49.00 EUR,42 kg,Leinen,new
How we set it up
Germany expects tax-inclusive prices, so price is advanced: round(calc{[price_net] * (1 + [vat] / 100)}, 2) + " EUR" adds the VAT, rounds and appends the currency in one rule. A merged source (Google Sheet keyed on sku) supplies the German title and material, and add static value fills shipping with DE:::49.00 EUR for every row.
GTIN-first row with unit pricing
Before
SKU,Name,Regular price,Sale price,Stock status,GTIN SER-30,Vitamin C Serum,34.00,27.20,instock,4260123456789
After
id,title,price,sale_price,availability,gtin,unit_pricing_measure,unit_pricing_base_measure SER-30,"Vitamin C Serum 30 ml, 15% L-Ascorbic Acid",34.00 USD,27.20 USD,in_stock,4260123456789,30 ml,100 ml
How we set it up
A two-row replace from google sheet turns instock/outofstock into in_stock/out_of_stock (neither value contains the other, so the substring match is safe); sale_price is mapped only when the export's Sale price is not empty (conditional mapping rule: Sale price matches regexp ^\s*$ → leave empty). unit_pricing_measure is the volume attribute with add suffix " ml".
identifier_exists for unbranded cables
Before
sku,title,brand,ean,stock CBL-USB-C-2M,USB-C to USB-C Cable 2 m,,,37
After
id,title,brand,mpn,identifier_exists,availability CBL-USB-C-2M,"USB-C to USB-C Cable 2 m, 100 W, Braided",,CBL-USB-C-2M,no,in_stock
How we set it up
Advanced DSL on identifier_exists: if [ean] is empty AND [brand] is empty then "no" else "yes". Availability comes from a second advanced rule: if calc{[stock]} > 0 then "in_stock" else "out_of_stock". A filter rule excludes rows where title is shorter than 20 characters so placeholder listings never reach Google.
Copy this plan
From template to a feed URL Merchant Center can fetch
Six steps; we do the setup work with you. A 1,000-SKU catalog typically goes from export to first fetch the same day.
01
Connect your catalog
Connect Shopify directly, or paste the URL of a CSV or Google Shopping XML export from WooCommerce, Magento, PrestaShop, BigCommerce or a custom system. Textfinity profiles the columns it finds and counts the products.
What we set up: We connect your Shopify store, or read the CSV or XML export URL you send us, and check the column profile.02
Start from the Google Shopping channel template
The template pre-fills every column in the tables above with Google's spelling, so the only decision per column is what it maps from.
What we set up: We create the feed from the Google Shopping channel template.03
Map the required columns
Rename for straight copies (id, link, image_link). Combine brand, name, color and size into title. Add the currency as a suffix on price. Use replace from regexp or an advanced rule to turn your stock values into in_stock / out_of_stock.
What we set up: We map title as a combine, add the currency to price as a suffix, and write availability as an advanced rule.04
Add the conditional columns your products need
Apparel: item_group_id, color, size, gender, age_group. Products without barcodes: mpn and identifier_exists. Promotions: sale_price with sale_price_effective_date.
What we set up: We map item_group_id as a rename of the product id, plus the apparel and identifier columns your catalog needs.05
Filter out what should not be advertised
Exclude gift cards, out-of-stock items you will not restock, and anything priced below your minimum margin. Check the feed hygiene report for titles over 150 characters, mixed-language fields and broken image URLs.
What we set up: We add exclude filters with is equal to, is less than and is longer than on your source columns.06
Publish and add the data source
The feed lives on a stable URL and is rebuilt on the shop's sync schedule. Add the URL under Products → Data sources in Merchant Center with a fetch schedule. Approval and the first diagnostics happen on Google's side.
What we set up: We publish the feed and add its URL to your Merchant Center as a scheduled fetch, with access you give us or on a short call where we walk you through it.
Customization tips
Make it yours
Keep price honest and put discounts in sale_price
Google compares the feed price with the landing page and disapproves mismatches. Leave price at the regular amount and send sale_price only while the discount runs; a conditional rule that maps sale_price only when the store's compare-at price is set keeps you out of trouble when the promotion ends.
Use the category ID, not the path, in google_product_category
The numeric ID (187 for Shoes) survives taxonomy renames and translations; the full path breaks the moment Google renames a node. A Google Sheet lookup from your product_type to the ID is one replace from google sheet rule, and it is easy to extend when new categories appear; it replaces substrings, so list longer product types above shorter ones they contain.
Decide what a variant is before you decide item_group_id
One row per color-size pair gives Google the most precise match but multiplies your SKU count, and with it the size of every feed you publish. Grouping by color only (one row per color, sizes in the description) halves the feed and still satisfies the apparel rules for most categories. Pick one convention and keep ids stable.
Write the title for the first 70 characters
Google allows 150 but typically shows far fewer in ads. Lead with brand and product type, then the attribute shoppers search by (color for fashion, capacity for electronics, size for furniture), and leave marketing words out. On the feeds Textfinity has profiled, the average title uses about 20 characters, so most stores have room to add rather than cut.
Submit the XML flavor if a plugin already produces it
There is no ranking difference between XML and tab-delimited text. If your platform emits a Google XML feed, keep it and use a feed tool only for the columns it gets wrong; if nothing emits one, the spreadsheet route is easier to inspect and to fix by hand.
Downloads
Take the files
FAQ
Questions about google shopping feed template
Does Google Shopping need XML or CSV?
Merchant Center's supported file types are tab-delimited text (.txt or .tsv) and XML in RSS 2.0 or Atom 1.0 form, plus gzipped versions of either. A comma-separated CSV is fine for editing in Excel or Google Sheets, but save it as tab-delimited text before a manual upload, add it as a Google Sheets data source, or let a feed tool publish it on a URL for Google to fetch; a comma CSV fetched that way is processed normally.
Which columns are required in a Google Merchant Center feed?
For every product: id, title, description, link, image_link, availability and price. For new products: brand, and a gtin or mpn unless identifier_exists is set to no. For used or refurbished products: condition. For apparel sold in the US, UK, Germany, France, Brazil or Japan: item_group_id, color, size, gender and age_group. Everything else, including google_product_category and custom labels, is optional.
Is there a Google Shopping feed template for Excel?
Google does not publish an Excel file. The CSV on this page opens in Excel and Google Sheets with the correct headers and three example rows; Excel can save it as tab-delimited text (.txt), which Merchant Center accepts. An .xlsx saved without conversion is rejected.
How long can a Google Shopping title be?
Up to 150 characters. Google shows fewer in most placements, so the first 70 characters should carry the brand, product type and the attribute shoppers search by. Descriptions may run to 5,000 characters.
What is the difference between a feed template and the product data specification?
The specification is Google's full list of attributes, their formats and the countries where each is required. A template is the subset you actually fill in, laid out as columns with example values. This page is the template; the specification is linked under sources for the attributes it does not cover, such as shipping tables, loyalty programs and installment pricing.
Set up for you
Have us fill this template from your catalog
Send us your store or export URL. We map the Google Shopping columns once and add the feed URL to your Merchant Center; Textfinity rebuilds it on a schedule so stock and prices stay current.
Tell us your store and channels. We reply within 24 hours.