A product feed is a file that lists the products you sell, each with the attributes a channel needs to advertise them: an id, a title, a link, an image, a price, whether it is in stock. Google Merchant Center, Meta, TikTok, Pinterest, Microsoft and most marketplaces all work the same way — you publish a file at a URL, they fetch it on a schedule, and what is inside decides which of your products can be shown and how well they compete.
That is the whole idea. The difficulty is never the concept; it is that the file has to stay correct while your catalog, your prices and your stock keep moving.
What a feed actually contains
A feed is a list of items, one per product you want to advertise. Each item is a set of named attributes. In XML it looks like this — the Google Merchant Center format, which most other channels resemble:
<item>
<g:id>SKU-1042</g:id>
<g:title>Northwind Trail Runner GTX Waterproof Running Shoe – Slate</g:title>
<g:description>Waterproof trail running shoe with a GORE-TEX membrane…</g:description>
<g:link>https://store.example/p/trail-runner-gtx?variant=slate-42</g:link>
<g:image_link>https://cdn.example/trail-runner-gtx-slate.jpg</g:image_link>
<g:availability>in_stock</g:availability>
<g:price>89.88 EUR</g:price>
<g:brand>Northwind</g:brand>
<g:gtin>4006381333931</g:gtin>
<g:item_group_id>TRAIL-RUNNER-GTX</g:item_group_id>
<g:condition>new</g:condition>
</item>
The same data can be a CSV, where each attribute is a column and each product a row, or JSON. The format matters less than the fields.
The attributes that carry the weight
id identifies the product inside the feed. It must be unique and — this is the part that bites — stable.
Change the id of a product and the channel treats it as a brand new product: its history, its learning and any
performance it had built up start again from zero. Google allows up to 50 characters here.
title is what a shopper reads and what the channel matches against searches. Google allows up to 150
characters, and the first 70 or so are what people usually see. A title is not a slogan: brand, product, the one
attribute that distinguishes this variant.
description can run to 5,000 characters in Google's specification. It informs matching more than it informs
shoppers; write plainly and skip the marketing punctuation.
link is the landing page. It must show the same product, at the same price, with the same availability as the
feed — this is the single most common cause of disapprovals that surprise people.
image_link is the main image. Google is raising its minimum image size to 500 × 500 pixels, with enforcement
starting 31 January 2027, so it is worth checking what your shop's CDN actually serves before then.
availability tells the channel whether it can be bought. Google accepts in_stock, out_of_stock,
preorder and backorder. Meta expects its own wording for the same idea, which is one reason a single file for
every channel gets awkward.
price is a number and a currency, like 89.88 EUR. Whether that number includes VAT depends on the country
you advertise in and on how your shop stores prices — a frequent source of feeds that are wrong in exactly one
market.
gtin, mpn and brand are the identifiers. A GTIN is the barcode number (EAN, UPC, JAN or ISBN).
Channels use it to recognise that your "Trail Runner GTX" is the same shoe three other shops are selling, which is
how comparison and matching work at all. Send them when they exist. When a product genuinely has none, say so with
identifier_exists: no rather than inventing a number.
item_group_id groups variants. Each size and colour is sent as its own product — with its own id, price and
availability — and they share one item_group_id so the channel knows they belong to the same listing.
custom_label_0 to custom_label_4 are five free fields the shopper never sees. They exist for you: margin
bands, seasonality, best-sellers, stock levels. Bidding strategies are built on them, which makes them the most
undervalued fields in the whole specification.
How the file gets to the channel
You publish the feed at a URL. In Merchant Center or Commerce Manager you register that URL and a fetch schedule — daily, or several times a day. The channel downloads the file, validates every item, and updates what it knows about your products.
Three consequences follow, and they explain most feed problems:
- Nothing is real-time. A price change reaches the ads at the next fetch of a correctly rebuilt file. If you rebuild daily and the channel fetches daily, worst case is nearly two days.
- The file must always be valid. A half-written file, a timeout mid-download or an empty export does not produce a gentle warning; it can mean products vanish.
- Validation happens per item. One product missing a required attribute does not break the feed; it removes that product. Which is why the count of accepted items matters more than "the feed worked".
Where the data comes from
Every shop platform can export products. Shopify, WooCommerce, Magento, PrestaShop, BigCommerce and the Turkish platforms — Ticimax, ikas, IdeaSoft, T-Soft — all offer either an API or an export you can schedule. ERP systems and suppliers hand you CSVs. Some teams push products from their own systems through an API instead.
What almost never happens is that the export is exactly what a channel wants. Typical gaps:
- The title is the internal product name, not something a shopper would search for.
- Categories are your categories; the channel wants its own taxonomy.
- Prices are stored without VAT, and the channel needs the price shoppers pay.
- Out-of-stock products are still in the export.
- The description contains HTML from the shop's editor.
- Variants are one row with a comma-separated list of sizes, instead of one row each.
Fixing these in the shop is usually impossible (the shop is right for the shop) and fixing them by hand in a spreadsheet works until the next export overwrites it. That gap — between the export you have and the file each channel wants — is what feed management is.
The shape of a good setup
A setup that survives contact with a real catalog has four parts:
One catalog. Import from every source into a single, normalized product list, so that a rule you write applies to everything, whatever platform it came from.
Transformations that are re-applied every time. Not a one-off edit, but a rule: build the title from brand, product name and colour; map category "Ayakkabı > Koşu" to Google's category 187; add 20% VAT to the price; leave out products with no image. Rules run on every product at every rebuild, so the next import cannot undo them.
Validation before publishing. Check required fields and allowed values while the file is built, so you learn about a problem from your own tool instead of from a disapproval three days later.
A schedule with a safety net. Rebuild often; keep serving the last good file when a build fails; refuse to delete the whole catalog because a supplier's export arrived truncated.
A worked example
Take one variant of that trail shoe. The shop exports:
| Field | Value |
|---|---|
| sku | SKU-1042 |
| name | Trail Runner GTX |
| colour | Slate |
| price_net | 74.90 |
| stock | 0 |
| category | Ayakkabı > Koşu |
Four rules turn it into something a channel accepts:
- Title template —
{brand} {name} – {colour}→ Northwind Trail Runner GTX – Slate. - Price —
price_net × 1.20, rounded →89.88 EUR. - Category mapping — a lookup table turns
Ayakkabı > Koşuinto Google's187. - Filter —
stock = 0→ the product is left out of the feed entirely, because advertising a shoe nobody can buy costs money and annoys shoppers.
Tomorrow the shop restocks the shoe and changes the price. Nothing needs editing: the next sync brings the new numbers, the same four rules run again, and the channel fetches a file that is right.
What to do first
If you are setting this up from scratch:
- Start with Google Merchant Center, even if it is not your main channel. Its specification is the strictest of the mainstream ones, and a catalog that satisfies Google is close to ready for everyone else.
- Get identifiers in order before optimising anything. GTIN, brand, MPN.
- Make titles searchable, not clever.
- Exclude what should not be advertised — out of stock, no image, below a margin threshold — rather than letting the channel reject it for you.
- Then use custom labels to group products for bidding, and only then start tuning.
None of this is difficult in principle. It is repetitive, unforgiving of small mistakes, and it never finishes — which is exactly the kind of work worth automating.
Frequently asked questions
What is the difference between a product feed and a catalog?
The catalog is your product data — everything you know about what you sell. A feed is one file produced from that catalog for one destination, in the fields and format that destination expects. A single catalog usually produces several feeds.
How often should a product feed be updated?
As often as prices and stock change. Daily is the minimum for most shops; hourly or every 30 minutes is normal when stock moves fast. There is no benefit in rebuilding the file more often than the channel fetches it, or in fetching more often than you rebuild.
Do I need GTINs in my feed?
Send them whenever the manufacturer assigns them: channels use them to match your product with the same product from other sellers, and products without identifiers compete less well. For products that genuinely have none — handmade or own-brand goods — say so explicitly with the identifier_exists attribute instead of inventing numbers.
Can I use one feed for Google and Meta?
You can, and many shops start that way, but the two want different wording for the same facts (availability values, for example) and different required fields. Generating one file per channel from the same catalog takes no more effort once the catalog is in one place, and avoids the compromises.
Publish this feed with FeedManager
Connect your store, shape the data with rules and let each channel fetch a valid file — the Free plan covers 500 products with no credit card.
Private beta — accounts by invitation.