How do I validate my product feed against my product pages?

Take a sample of products and compare each field in the feed row, on the product page and in the page's Product markup. Where a value differs, fix it at the source the others copy from. Recheck after the next feed fetch and crawl.

By Margareta Petrovic, founder of Visibility Mesh. We checked every statement in this guide against its primary source on September 30, 2026.

Accounts payable teams do not pay an invoice until the purchase order, the receiving report and the invoice agree. Auditors call it a three way match, and you can run the same test on product data. The feed row, the page and the markup must agree. Google runs part of that check whether you ask it to or not.

Googlebot compares the price in your Merchant Center data with the price in the HTML your server returns. A mismatch can get the product disapproved. Google's automatic item updates are switched on by default. They can replace the price, availability and condition in your listings with what Google finds on the page. That is helpful right up to the day the page is the one that is wrong.

Before you start

  • Get access to the feed source and to Merchant Center. The Needs attention tab, which Google used to call Diagnostics, lists the products with issues.
  • Pick ten products. Include a product with variants, one on sale and one that is out of stock.
  • Save the raw HTML of each product page. The guide on how to save the product page HTML shows how. Google's price check reads the HTML as your server returns it.
  • Start a sheet with one row per product. Give each field three columns, for the feed, the page and the markup.

Steps

Step 1. List every feed and where it comes from

Write down each feed, where it goes and how it is built. A feed can be a file you upload or an API connection. It can also come from a platform app, such as the Shopify Google & YouTube channel or Google for WooCommerce. Google's automatic item updates read your pages and act as one more source. A ChatGPT product feed follows OpenAI's file upload specification, which has its own rules. Note which source feeds each field. Step 6 depends on it.

Step 2. Compare the sample field by field

Put the feed row, the visible page and the markup side by side for each product. Compare the id and the title, the price and currency, and any sale price with its dates. Then compare the availability, the condition, the identifiers, the image and the product address.

Sources: Google Merchant Center Help, automatic item updates, and Google Search Central, merchant listing structured data, last updated September 8, 2026. Both read September 30, 2026.
Field Feed attribute Where it sits in the markup
Price and currency price offers.price and offers.priceCurrency
Availability availability, such as in_stock, out_of_stock or preorder offers.availability, such as InStock, OutOfStock or PreOrder
Condition condition, as new, refurbished or used offers.itemCondition, as NewCondition, RefurbishedCondition or UsedCondition
GTIN gtin gtin8, gtin12, gtin13, gtin14 or gtin
"offers": {
  "@type": "Offer",
  "price": "79.00",
  "priceCurrency": "USD",
  "availability": "https://schema.org/InStock",
  "itemCondition": "https://schema.org/NewCondition"
}

Google wants the price as a plain number, with no currency symbol and no thousands separator. The currency goes in its own property as a three letter ISO 4217 code. During a sale, Google shows the sale price as the current price. So the sale dates and their time zone have to be right.

Step 3. Check the variants

Open the product address from the feed row of one variant, such as size 11 of a shoe. The page should open on that exact variant. Google lists a page that preselects a different variant among the common causes of availability mismatches.

Step 4. Read what Google found

In Merchant Center, open the Needs attention tab and find your sample products. An issue such as "Mismatched product price" means Googlebot found a different price on the landing page or in its structured data. Google lists four common causes.

  • The site changed before the feed did.
  • The structured data is wrong.
  • Bots see a different price than people do.
  • The sale dates or the time zone are set wrong.

Google adds that a price that JavaScript inserts after the page loads will trigger the error. Googlebot reads the HTML your server returns. Each notice also carries the date and time of the crawl. Your data may have changed since then, so check the product's current status before you fix anything.

Step 5. Validate the identifiers

Check every GTIN before you upload it. A GTIN has 8, 12, 13 or 14 digits, and the last one is a check digit. To test it, start at the digit just before the check digit and move left. Multiply the digits by 3 and 1 in turn, and add the results. The check digit brings the total up to the next multiple of 10.

Google's own example GTIN, 3234567890126, passes the test. The weighted sum of its first twelve digits is 94, and the check digit 6 brings it to 100. This function runs the same test on a list.

def gtin_ok(g):
    d = [int(c) for c in g]
    if len(d) not in (8, 12, 13, 14):
        return False
    s = sum(x * (3 if i % 2 == 0 else 1) for i, x in enumerate(reversed(d[:-1])))
    return (10 - s % 10) % 10 == d[-1]

Google asks you not to submit GTINs from the restricted ranges, which start with 02, 04 or 2. It also excludes the coupon ranges, which start with 05, 98 or 99. OpenAI's specification discards the same prefixes. Never invent a GTIN to fill the field. Google says to leave it out when you are unsure. Each variant needs its own GTIN.

Step 6. Fix each value at its source

Fix a wrong value in the place that creates it. If a channel app builds the feed from your product data, change the product in your platform. A value edited only in the feed may be written over at the next sync. If the markup is wrong, fix the theme or the plugin that writes it, and check the Product markup again afterward.

Step 7. Decide about automatic item updates

Automatic item updates let Google update the price, sale price, availability and condition from your pages. Google switches them on by default. It calls them a fix for sporadic problems on a small share of products. It also says they do not replace regular feed updates.

Turn price updates off if your prices change more than once a day, because Google may then disapprove the product instead of updating it. Turn them off as well when a page shows several strikethrough prices, as Google advises. For availability, Google matches loosely. It treats in_stock, preorder and backorder on the page as compatible with in_stock in the feed.

Step 8. Recheck after the next fetch and crawl

After the feed updates, wait for Google to crawl the pages again. Google says it recrawls disapproved products over the next few hours or days, and approves them once the prices match. A busy server can stretch that. Google does not raise its crawl rate on a domain that is already at capacity.

Check that it worked

The Needs attention tab should show no mismatch for your sample. On every row, the page, the markup and the feed should show the same price in the same currency. Each variant address should open the variant its row describes. Keep the ten row sheet with its date, because it doubles as the test after the next platform update.

If it did not work

  • If prices change several times a day, send updates through the Merchant API or a scheduled feed right after each change. Leave automatic price updates off.
  • If a script writes the price or the markup after the page loads, put both in the HTML the server sends. Google says dynamically generated markup can make Shopping crawls less frequent and less reliable.
  • If the site redirects by country or currency, test the page from the country the feed targets. Google warns that bots may receive a different price and currency than people do. It also asks you not to change availability by the visitor's location.
  • If the page shows several strikethrough prices, keep one reference price on the page. Google may discard the strikethrough price, and it advises against automatic price updates on such pages.
  • If the next sync brought the old value back, the fix probably went into the feed only. Make the change in the product data your channel app reads.

Platform notes

Shopify's help page for the Google & YouTube channel says that if a product has a GTIN, you must add it before you can publish. You add the GTIN in the details of a product variant. A product without a GTIN needs an MPN and a brand in the channel's product data. That page does not cover landing page mismatches, so use steps 2 to 4 for those.

The WooCommerce 9.2 release post, dated August 21, 2024, describes a new field in the classic product editor. The field is labeled GTIN, UPC, EAN or ISBN, and it works for products and for variations. Google for WooCommerce reads that field from version 2.9.0 and offers to migrate GTINs stored elsewhere. WooCommerce recommends a backup before you run the migration.

OpenAI's product feed for ChatGPT has its own specification. OpenAI calls its Stable schema the supported file upload path, and the specification asks you to validate identifiers before you upload. The comparison of feed row, page and markup works the same way for any feed, including one you send to Microsoft Merchant Center.

What Visibility Mesh checks and what it does not

The Visibility Mesh scan reads your product pages and their markup. That covers two of the three columns in step 2, and the feed column comes from your own Merchant Center account. For a Shopify store, the Catalog Assessment reads the Shopify or Matrixify product export you upload, as CSV or XLSX. It reports how many products carry a description, an SEO title, an SEO description and an image. For a WooCommerce, BigCommerce or Magento store, choose the Full Assessment or one of the Essential, Advanced and Agency plans. Each one reads the live pages and gives you the findings and a fix plan.

Questions people ask

How do I fix a price mismatch between my product feed and my product page?

Find the value that is wrong and fix it where it is generated. Google compares the price in your feed with the price in the HTML your server returns and in its structured data. Check for a price added by JavaScript and for a price that differs for bots and people. Check the sale dates and time zone, and the delay between site and feed updates. Update the feed. Google rechecks the product within hours or days.

What should I do if my products have no GTIN?

Leave the GTIN out, and submit an MPN and a brand if the manufacturer assigned an MPN. Google says store brands and products only you sell generally have no GTIN. It also says never to guess or invent one. Its product data specification has an identifier_exists attribute that you set to no when a product lacks a GTIN, an MPN or a brand. On Shopify, the Google & YouTube channel asks for an MPN and a brand when a product has no GTIN.

Why does Merchant Center reject Shopify products for a price or availability mismatch?

Google checks the landing page itself, so the causes are the same on every platform. The price in the HTML may differ from the feed after a price change that has not reached the feed yet. A script may write the price after the page loads. The page may also open on a different variant than the feed row describes, or show another market's price or currency. Compare the feed row, the page and the markup for one rejected product to find the difference.

Related reading: Once the feed validates, we explain which Merchant Center attributes and GTINs Google's AI shopping results read.

Sources

Every page below was read on September 30, 2026.

The Academy explains GTIN, MPN and SKU and why live data matters for price, stock and variants.

Run the free scan, and we read five of your key pages the way an AI crawler reads them, with no card and no call.

See whether this applies to your site

The free scan reads your own pages and shows which of these problems it finds on your site.

The free Visibility Mesh scan checks whether AI crawlers can reach your website and reads the structured data and text of 5 key pages. The scorecard has 3 complete findings, and each one names the page and the fix. No install, no call, no card.

Run the free scan