Articles — Product data for shops
Product data for shops
Your product lives in three places
For shopping recommendations, the same product often exists as a page for people, a structured block on that page, and a catalog file of price and stock. If they disagree, shopping tools get the facts wrong.
When a shop sells a watch, the same facts sit on the product page, in schema, and in a feed. Schema is that family of structured facts, usually written as JSON-LD, a structured block on the page. A feed is a catalog file of price and stock.
Same product, three places
Illustrative example, not a logged test. The Northloop Trail Watch is a fictional product at €300.
Northloop Trail Watch S - Black
Built for long runs. Contactless pay. Free shipping over €50.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Northloop Trail Watch S - Black",
"brand": { "@type": "Brand", "name": "Northloop" },
"sku": "NL-TRAIL-S-BLK",
"mpn": "NL-TRAIL-S",
"offers": {
"@type": "Offer",
"price": "300.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
- id
- NL-TRAIL-S-BLK
- title
- Northloop Trail Watch S - Black
- price
- 300.00 EUR
- availability
- in_stock
- brand
- Northloop
- gtin
- 0850000123456
- mpn
- NL-TRAIL-S
- condition
- new
- link
- https://example.com/products/trail-watch-s
- image_link
- https://example.com/images/trail-watch-s.jpg
| Fact | Webpage | Schema | Feed |
|---|---|---|---|
| Name | Headline (can market a bit) | name | title |
| Price | Big €300 | price + currency | price |
| Stock | “In stock” badge | availability | availability |
| Identity | Often visual only | sku / mpn | id + gtin or mpn |
| Condition | Rarely said | itemCondition | condition |
The page sells. The block labels that URL for machines. The feed is the catalog those shopping systems read. All three should agree on the price, the stock, and which item this is.
A SKU is the shop’s own product code. A GTIN is a barcode number such as a UPC or EAN. An MPN is the manufacturer’s part number. The letters NL in NL-TRAIL-S-BLK are part of the product code.
Page still shows €300 and “In stock.” Feed still has last week’s promo: 249.00 EUR.
A shopper can be quoted €249, or told the watch is on sale, because that older figure is still in the feed.
The same SKU should carry the same facts in all three places. Those facts have to match. After price and stock match, a shopper who is choosing among options still needs ship-to, returns, and a clear merchant. See You can be recommended and still not get chosen.
Whether the assistant treats the three records as one product is the matching job in The assistant names a product, a shop, or a place.
What e-shops actually do (reality check)
Nobody fills every field in Google Merchant Center.
Typical reality:
- The platform or an app generates a feed
- Core fields get mapped, and extra attributes wait
- Big catalogs are messy: missing barcodes, odd titles, stale stock, duplicate IDs
Good enough usually starts with: stable id, clear title, correct price + availability, brand, a real link + image_link, condition, and an identifier (gtin or mpn + brand) when you have one.
More attributes help later. Wrong or stale basics hurt immediately.
Core feed fields (the ones to understand)
| Field | What it’s for |
|---|---|
id |
Your stable internal product ID in the feed |
title |
What the system should call the product |
description |
Text details (keep factual) |
link |
Canonical product URL |
image_link |
Main image |
price |
Current sell price + currency |
availability |
In stock / out of stock / etc. |
brand |
Brand name |
gtin |
Barcode number when you have one |
mpn |
Manufacturer’s part number, often with brand if there is no barcode |
condition |
new / refurbished / used |
Look up the other fields when your category needs them, such as sizes, shipping, or energy labels.
What gtin, mpn, and condition change
These three say which item this is, and whether the offer is new.
gtin— use a real barcode so a similar name is not treated as this item.mpn— pair it withbrandwhen you have no barcode, which is common for a private-label product.condition— setnew,refurbished, orused. Without that, a cheap used listing can show up in a “best new watch under €300” answer as if it were the new watch.
Without a clear identity, systems mix up variants, regions, and bundles.
Bad row vs good row
Bad — fluff, weak identity
id: 1
title: Best trail watch!!! from €249
price: 249 EUR
availability: in stock
brand: (empty)
gtin: (empty)
Better — clear, match the page
id: NL-TRAIL-S-BLK
title: Northloop Trail Watch S - Black
price: 300.00 EUR
availability: in_stock
brand: Northloop
gtin: 0850000123456
mpn: NL-TRAIL-S
condition: new
A fluffy title, a “from” price, and a missing brand or ID put the wrong facts in the answer. Use a clear identity and the real price, match the page, and update the row when the stock or the promotion changes.
Why you still need the webpage
The page is where a person reads the story, the reviews, and the comparisons. Structured data publishes facts machines can read is what the labeled facts do not do on their own. The page and the feed still have to show the same price.
Practical checklist
- Pick one hero product. Write name, brand, price, currency, stock, and condition once.
- Check that the page, the JSON-LD block if you have one, and the feed row match.
- Fix identity (
gtinormpnplus brand), price, and availability before you hunt rare attributes. - Treat freshness as ongoing, not a one-time task.
You do not need to memorize every Merchant Center attribute. You need the feed, the core fields, and the same facts in all three places. Keep those core fields on one dated note and check the three places against it, the same habit as in Wrong price, wrong shop, fake discount.
Read next if: Structured data publishes facts machines can read · Wrong price, wrong shop, fake discount