# How do I get my products into Google Shopping's free listings?

> Add Product JSON-LD with name, image and an Offer (price above 0, ISO currency), match the visible price and stock, and add a GTIN or MPN + brand.

Updated 2026-10-21 · https://trysmbuild.com/guides/google-free-listings

Put Product structured data on every product page, in the server HTML. Each Product needs a name, an image and an Offer with a price above zero and a three-letter ISO 4217 currency. Keep the markup price and availability identical to what the page shows. Add a valid GTIN, or an MPN plus brand. Then submit the products in Google Merchant Center, which runs free listings.

## What are free listings and merchant listing rich results?

- **Free listings** come from your product data in Google Merchant Center. You can upload a feed, or let Merchant Center add products automatically from your online store.
- **Merchant listing experiences** come from the Product markup on pages where a shopper can buy. Google's merchant listing documentation (updated 2026-09-08) names the Shopping knowledge panel, popular products and badges in Google Images.

They connect: Merchant Center's automatic item updates read price, availability and condition from your markup, and adding products automatically needs a verified, claimed site with Googlebot allowed on product pages.

Google also says structured data "isn't required for generative AI search". It does recommend Merchant Center if you want products to show in AI responses (AI optimization guide, updated 2026-07-10).

## What does Google require in product markup?

The merchant listing documentation lists three required properties on the Product:

| Property | What Google requires |
|---|---|
| `name` | The product name |
| `image` | At least one image URL that is crawlable and indexable and shows the product |
| `offers` | An `Offer` with `price` greater than zero and `priceCurrency` as an ISO 4217 code, such as USD or EUR |

Two more rules:

1. **`AggregateOffer` alone does not qualify.** A price range ("from $20") is not a merchant listing. Each product needs a real `Offer` with one price.
2. **The merchant has to be the seller.** Google's wording is that "the merchant has to be the seller of the product".

Google also recommends `availability`, `itemCondition`, identifiers (`gtin`, `mpn`, `brand`) and descriptive properties such as `description`, `sku`, `color`, `size`, `material`, `pattern`, `audience` and `category`. Google added `category` on 2026-07-07.

Here is a minimal valid example for one product with one price:

```json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Canvas Tote Bag, Natural",
  "image": [
    "https://example.com/images/tote-1x1.jpg",
    "https://example.com/images/tote-4x3.jpg",
    "https://example.com/images/tote-16x9.jpg"
  ],
  "description": "Heavy cotton canvas tote with an inner pocket.",
  "sku": "TOTE-NAT",
  "gtin13": "4006381333931",
  "brand": { "@type": "Brand", "name": "Example Goods" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/canvas-tote",
    "price": "38.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
```

Put it in a `<script type="application/ld+json">` tag in the page template.

## Why does Google disapprove products when the price or stock doesn't match?

Google checks your data against your page. The merchant listing documentation says "Google may attempt to verify merchant listing product data." Merchant Center goes further: "Automatic crawlers will capture the page after initial loading and any product data displayed on the page at that time will be treated as final." (Merchant Center Help, no date shown on the page, checked 2026-10-17.)

So the price and stock state a shopper sees when the page first loads must match your markup and your Merchant Center data. When they don't, products get disapproved, and automatic item updates can pause.

Common causes:

- The markup shows the first variant's price, but the page opens on a different variant.
- A sale changes the visible price, but the markup keeps the old one.
- The markup says `InStock` while the buy button says "Sold out".
- Availability is free text such as "Available" or "ships soon". Google reads schema.org values only, such as `https://schema.org/InStock`, `OutOfStock`, `PreOrder` or `BackOrder`.

How to fix it:

1. Have the template build the markup price and availability from the same variables as the buy box, for the variant selected when the page loads.
2. Update both in the same place when the price or stock changes.
3. Use schema.org URLs for `availability` and `itemCondition`.
4. If you show a "was" price, mark it as a `UnitPriceSpecification` with `priceType` `https://schema.org/StrikethroughPrice`. Leave `priceType` off the sale price. Give the sale a start and end date (`validFrom` and `validThrough`, or a future `priceValidUntil`). An expired `priceValidUntil` is a fault.

## Do I need a GTIN, or is MPN + brand enough?

Use a GTIN wherever the product has one. Google's merchant listing documentation recommends `gtin`, `mpn` and `brand` in markup. The Merchant Center product data specification (checked 2026-10-17) is stricter:

- `brand` is required for new products, except media.
- `gtin` applies wherever a GTIN exists for the product.
- `mpn` is required only when the product has no GTIN.

GTINs are barcode numbers of 8, 12, 13 or 14 digits. Use `gtin8`, `gtin12`, `gtin13`, `gtin14` or plain `gtin`. The last digit is a GS1 check digit; a GTIN with a wrong check digit is rejected.

How to fix it:

1. Add the real GTIN to each product, or to each variant if variants have their own barcodes.
2. If a product has no GTIN, add `mpn` and `brand.name` instead.
3. Do not invent a GTIN to fill the field.

If you sell variants such as sizes or colours, use `ProductGroup` with `productGroupID`, `variesBy` (full schema.org URLs such as `https://schema.org/size`) and `hasVariant`. Give each variant its own `sku` or `gtin` (product variants documentation, updated 2026-09-08).

## Why isn't Google seeing my product markup?

Usually because the markup only exists after JavaScript runs. Some apps and themes inject Product JSON-LD in the browser. Google's guidance on JavaScript structured data (updated 2025-12-10) warns that "dynamically-generated markup can make Shopping crawls less frequent and less reliable, which can be an issue for fast-changing content like product availability and price."

Other causes to check:

- **No markup at all.** Some themes output none, or only on some templates.
- **Blocked images.** The image URL in the markup must return the image (HTTP 200 with an image content type). Your robots.txt must not block it for Googlebot-Image. Google recommends several high-resolution images in 16:9, 4:3 and 1:1 ratios.
- **Small images.** Merchant Center will enforce a 500×500 px minimum for all products from 2027-01-31 and recommends 1500×1500 px. The main image must not carry promotional overlays or watermarks.
- **Googlebot blocked.** Automatic updates and automatic product discovery need Googlebot allowed on product URLs.

How to fix it:

1. View the page source (not the inspector) and search for `"@type": "Product"`. If it isn't there, the markup is injected by JavaScript.
2. Move the Product JSON-LD into the theme template so the server renders it.
3. List the large image URLs in `Product.image` and check they load.

## What product data do free listings need?

Your product pages should supply everything a Merchant Center feed row needs. Merchant Center lists these as required for free listings (checked 2026-10-17):

- `id`, `title`, `link`, `image_link`, `price`, `description`, `availability`
- when they apply: `condition`, `brand`, `gtin`, `mpn`, `multipack`, `bundle`
- apparel: `color`, `size`, `age_group`, `gender`
- variants: `item_group_id`

Length limits: `title` up to 150 characters, `description` up to 5,000, `id` and `item_group_id` up to 50, `brand` up to 70.

Condition matters for used goods. `condition` is required in Merchant Center for used or refurbished items, and automatic updates read `itemCondition` from markup. If a page says "refurbished" or "pre-owned", set `itemCondition` to `https://schema.org/RefurbishedCondition` or `UsedCondition` to match.

## How smbuild checks this

smbuild fetches your home page, robots.txt, sitemaps and a sample of product pages as plain HTML, and reads their JSON-LD and microdata. When the rendered pass runs, it also opens two product pages in a real browser and compares the price and stock shown after JavaScript with the markup. It cannot see your Merchant Center account, feed or free listing status. Those are listed as questions, not scored. These checks in the Google Shopping & free listings group cover this guide:

| Check ID | Title |
|---|---|
| SD-01 | Product markup on product pages |
| SD-02 | Merchant listing required properties |
| SD-03 | Product markup in server HTML (not only JS-injected) |
| SD-04 | Markup matches the visible price and stock state |
| SD-05 | Availability uses schema.org values |
| SD-06 | Product identifiers (GTIN or MPN + brand) |
| SD-07 | Crawlable product images in markup |
| SD-08 | Primary image size (Merchant Center) |
| SD-09 | Sale / strikethrough price markup |
| SD-13 | itemCondition set (required for used / refurbished) |
| SD-19 | Variants marked up as ProductGroup |
| ORG-08 | Feed-ready product data on the page |
| ORG-09 | Automatic item updates compatible |

## Sources

- [Google Search Central: Merchant listing structured data](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing) (page updated 2026-09-08)
- [Google Search Central: Product variant structured data](https://developers.google.com/search/docs/appearance/structured-data/product-variants) (page updated 2026-09-08)
- [Google Search Central: Generate structured data with JavaScript](https://developers.google.com/search/docs/appearance/structured-data/generate-structured-data-with-javascript) (page updated 2025-12-10)
- [Google Search Central: AI optimization guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) (page updated 2026-07-10)
- [Google Merchant Center Help: landing page price and availability matching](https://support.google.com/merchants/answer/4752265) (no date shown, checked 2026-10-17)
- [Google Merchant Center Help: product data specification](https://support.google.com/merchants/answer/7052112) (checked 2026-10-17)
- [Google Merchant Center Help: product data required for free listings](https://support.google.com/merchants/answer/9199328) (checked 2026-10-17)
- [Google Merchant Center Help: automatic item updates](https://support.google.com/merchants/answer/3246284) (checked 2026-10-17)
- [Google Merchant Center Help: add products automatically from your online store](https://support.google.com/merchants/answer/12158480) (checked 2026-10-17)

## Questions

### Do I need Google Merchant Center for free listings?

Yes. Free listings use the product data in your Merchant Center account, from a feed or added automatically from your store. Product markup on your pages keeps that data accurate, but it does not replace the account.

### Do I need structured data if I already upload a Merchant Center feed?

It still helps. Product markup makes your pages eligible for merchant listing experiences in Search, and Merchant Center's automatic item updates read price, availability and condition from it. The markup must match the feed and the visible page.

### Why does Google say my product price doesn't match?

Merchant Center treats what the page shows after initial load as final. If the markup, the feed or the visible price differ, for example because of a sale or a different default variant, the product can be disapproved. Build the markup price from the same data as the buy box.

### What if my products don't have a GTIN?

Add `mpn` and `brand` instead. Merchant Center requires an MPN only when no GTIN exists, and requires brand for new products except media. Never invent a GTIN: an invalid check digit is rejected.

### Can I use AggregateOffer for a price range?

Not on its own. Google's merchant listing rules need an `Offer` with a single price above zero and an ISO 4217 currency. For products with variants, use `ProductGroup` with one Product and Offer per variant.
