Examples

Google Shopping feed examples

A Google Shopping feed is a file with one product per row (CSV or TSV) or per item (RSS or Atom XML), using Google's attribute names. Below are a complete XML item, a downloadable CSV with three verticals, and before/after optimization examples for the fields that most often fail: availability, price, sale price, variants, categories and images. Each one names the rule that produces it from a raw store export.

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; brand is required for new products, gtin is strongly recommended where one exists and mpn is required when there is no gtin; condition only for used or refurbished items.
  • XML feeds use the RSS 2.0 shape with a g: namespace per attribute; CSV and TSV feeds put the same attribute names in the header row.
  • Values are fixed vocabularies: availability is in_stock, out_of_stock, preorder or backorder; price is a number plus an ISO currency code, such as 59.00 USD.
  • Textfinity reads Google-shaped XML or CSV as a source and publishes the Google feed as CSV or TSV on a stable URL; it does not output XML. Merchant Center fetches that CSV directly.

Required attributes in every Google Shopping feed example

AttributeRequiredExample value
idAlwaysSH-LIN-SND-M
titleAlways, 1–150 charactersMarlow Men's Linen Shirt - Sand - M
descriptionAlways, up to 5,000 charactersMen's linen shirt, relaxed fit.
linkAlwayshttps://shop.example.com/p/101
image_linkAlwayshttps://shop.example.com/i/101.jpg
availabilityAlwaysin_stock
priceAlways59.00 USD
brandNew products (not movies, books, music)Marlow
gtinIt depends; strongly recommended when the product has one0012345678905
mpnOnly if there is no gtinOSL-180-OAK
conditionUsed or refurbished itemsrefurbished
item_group_id, color, size, gender, age_groupVariants and apparel in some countriesSH-LIN, Sand, M, male, adult

From Google Merchant Center Help, product data specification, checked 2026-10-27.

XML or CSV: which product feed format to use

Both work. XML suits platforms that already export Google's RSS shape and handles commas and line breaks inside values without quoting. CSV and TSV are easier to read, edit in a spreadsheet and debug; Google recommends TSV over CSV when you send repeated attributes such as product_highlight, because commas inside values complicate CSV.

In Textfinity the choice is about input and output separately. As input, it reads CSV, TSV and other delimited files, Google-shaped XML (RSS or Atom with flat fields) and Google Sheets; it does not read JSON or arbitrary XML schemas. As output, every feed is CSV or TSV.

Google Shopping feed optimization examples that matter most

  • Titles: on the feeds Textfinity has profiled, the average title uses about 20 of Google's 150 characters. Adding brand, type and the variant attribute is usually the largest single fix.
  • Identifiers: a missing gtin on a branded product limits how Google matches it. Map the barcode column, and use mpn only where no gtin exists.
  • Variants: every size and color needs its own id and a shared item_group_id; otherwise variants overwrite each other or look identical.
  • Custom labels: add margin, season or bestseller values in custom_label_0 to 4 so campaigns can bid on them.

Examples

Worked examples, by situation

Two reference examples (one XML item, one CSV row set) followed by fixes, each in a different vertical and store set-up.

Fashion · Google Shopping XML · variants

Google Shopping XML example for one apparel variant

feed.xml (one item)

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
 xmlns:g="http://base.google.com/ns/1.0">
<channel>
 <title>Marlow store</title>
 <item>
  <g:id>SH-LIN-SND-M</g:id>
  <g:title>Marlow Men's Linen Shirt - Sand - M</g:title>
  <g:description>Men's linen shirt, relaxed fit.</g:description>
  <g:link>https://shop.example.com/p/101</g:link>
  <g:image_link>https://shop.example.com/i/101.jpg</g:image_link>
  <g:availability>in_stock</g:availability>
  <g:price>59.00 USD</g:price>
  <g:brand>Marlow</g:brand>
  <g:gtin>0012345678905</g:gtin>
  <g:item_group_id>SH-LIN</g:item_group_id>
  <g:color>Sand</g:color>
  <g:size>M</g:size>
  <g:gender>male</g:gender>
  <g:age_group>adult</g:age_group>
 </item>
</channel>
</rss>

How we set it up

Textfinity reads a feed in exactly this shape as a source (flat fields per item, g: prefix optional). If your platform exports it, we connect it as an XML URL source and every attribute becomes a column we can map and filter.

Mixed catalog · CSV feed · three verticals

Product feed CSV example with apparel, furniture and electronics

feed.csv (header and first row)

id,title,description,link,image_link,
availability,price,sale_price,brand,gtin,
mpn,condition,item_group_id,color,size
SH-LIN-SND-M,Marlow Men's Linen Shirt...,
...,in_stock,59.00 USD,45.00 USD,Marlow,
0012345678905,,new,SH-LIN,Sand,M

How we set it up

The full three-row file is in the download below. We start from the Google Shopping channel template, which pre-fills these columns; Textfinity publishes the result as comma-delimited CSV (or TSV) on a URL that Merchant Center fetches on a schedule.

Electronics · CSV export · stock counts

Availability built from a stock number

Before

stock: 12
stock: 0
stock: (empty)

After

availability: in_stock
availability: out_of_stock
availability: out_of_stock

Advanced transform on availability

if [stock] is empty then "out_of_stock"
else if calc{[stock]} > 0 then "in_stock"
else "out_of_stock"

How we set it up

We map availability with an advanced rule using the expression above. The empty check comes first because a numeric comparison on a blank cell would fail the product instead of falling through to else.

Fashion · Shopify · sale prices

price and sale_price from Shopify's compare-at price

Before

variant_price: 45.00
variant_compareAtPrice: 59.00

After

price: 59.00 USD
sale_price: 45.00 USD

price (advanced) and sale_price (conditional)

price:
if [variant_compareAtPrice] is empty
then [variant_price] + " USD"
else [variant_compareAtPrice] + " USD"

sale_price:
if variant_compareAtPrice matches regexp \d
  → advanced [variant_price] + " USD"
else → leave empty

How we set it up

We map price with an advanced rule, and sale_price with a matches regexp condition (anchored at the start, so \d means the value starts with a digit), else leave empty. Google wants the regular price in price and the discount in sale_price; sending the reduced price alone hides the markdown and can mismatch the landing page.

Furniture · WooCommerce · 600 SKUs

product_type from a pipe-separated category

Before

categories: Furniture|Tables|Dining

After

product_type: Furniture > Tables > Dining

How we set it up

We map product_type with replace from regexp, finding \| and replacing it with " > ". product_type uses your own hierarchy separated by >, and Shopping campaigns can subdivide product groups by it.

Beauty · Shopify · 1,000 SKUs

Products without an image kept out of the feed

Before

3 products with an empty image URL, 1 with a .gif placeholder

After

4 products excluded; 996 sent

How we set it up

We add exclude filters: product.featuredImage.url is empty, and it ends with .gif (filters read Shopify's source columns, not the mapped image_link). Feed hygiene's URL check flags malformed image URLs before Merchant Center disapproves them.

Home and garden · Denmark · DKK

Same product, second-country feed

Before

price: 59.00 USD
link: https://shop.example.com/p/101

After

price: 429.00 DKK
link: https://shop.example.com/da/p/101

How we set it up

We build a second feed with the market set to Denmark, which reads the Shopify market's DKK price, and add the suffix " DKK"; on a CSV source, the suffix goes on a DKK price column. Either way the link gets the Danish path with replace from regexp ^(https://[^/]+)/ → \1/da/, because the market swaps the price only, not URLs. When we register the feed in Merchant Center with you, its feed label and target country are Denmark.

Copy this plan

Plan: from store export to a valid feed

Use the examples above as the target; this is the order to build it in.

  1. 01

    Send us the source

    Shopify connects natively. Other platforms connect through a CSV or Google-shaped XML export URL, over HTTP(S) or SFTP, or a Google Sheet.

    What we set up: We connect the store or export URL and profile the catalog with feed hygiene.
  2. 02

    Start from the Google Shopping template

    The template pre-fills the required and recommended attributes so you only map what differs.

    What we set up: We start from the Google Shopping channel template.
  3. 03

    Map the fields that need values rewritten

    Availability from stock, price with currency, sale_price from compare-at, product_type from your categories.

    What we set up: We write advanced rules for availability, price and sale_price, and a replace from regexp for product_type.
  4. 04

    Filter what should not be advertised

    Products with no image, drafts, gift cards.

    What we set up: We add exclude filters with is empty and is equal to on your source columns.
  5. 05

    Register the feed in Merchant Center

    The feed is a stable URL that Merchant Center fetches on a schedule. Diagnostics stay in Merchant Center; Textfinity does not import them.

    What we set up: We hand you the feed URL and register it in Merchant Center with you: you give us access or we walk you through it.

Customization tips

Make it yours

Fix in the feed, not in Merchant Center rules, when you have both

Merchant Center attribute rules work, but they live in another tool and need the Advanced data source management add-on. Keeping the logic in one place makes it easier to change; split it only if a separate team owns Merchant Center.

Pick TSV for repeated attributes

product_highlight and additional_image_link hold several values. In TSV a comma-separated list in one cell is unambiguous; in CSV the cell has to be quoted correctly.

Use one currency per feed

price must be in the target country's currency unless you use Google's currency conversion. A second country is usually a second feed with its own price column and links.

FAQ

Questions about google shopping feed examples

What does a Google Shopping XML feed look like?

An RSS 2.0 file with a channel and one item per product. Each attribute is an element in the g: namespace (http://base.google.com/ns/1.0), such as g:id, g:title, g:price and g:availability.

Can I use a CSV file instead of XML for Google Shopping?

Yes. Merchant Center accepts delimited text files with Google's attribute names in the header row. Textfinity publishes Google feeds as comma-delimited CSV or as TSV, and Merchant Center fetches them from the feed URL.

What are the required fields in a Google Shopping feed?

id, title, description, link, image_link, availability and price for every product; brand for new products; gtin when one exists or mpn otherwise; condition for used or refurbished items; and variant attributes such as color, size and item_group_id where they apply.

Does Textfinity generate an XML feed?

No. It reads Google-shaped XML as a source and publishes feeds as CSV or TSV, which Merchant Center accepts. If a channel accepts only XML, Textfinity cannot fill it.

Set up for you

Have your store export turned into a feed like these examples.

Send us your store URL. We build the Google Shopping feed from the template, rewrite availability, price and product_type by rule, and register the CSV URL in Merchant Center with you.

Have us build this feedOr email support@textfinity.io

Tell us your store and channels. We reply within 24 hours.