The product page an AI can recommend
What an assistant reads on a product page to recommend a product, block by block, with a markup example and a 17-point checklist.
Updated on October 9, 2026 · by the skoup team
What an assistant looks for on a product page
When ChatGPT, Gemini or Perplexity recommend a product, they describe it: a price, one or two specifications, a reason to pick it. That information comes from somewhere. If your product page does not state it clearly, the assistant takes it from elsewhere, or recommends another product.
This guide reviews the product page block by block and ends with a checklist. The robots to allow and the product feed are covered in the ChatGPT Shopping guide, the overall approach in the ecommerce GEO guide. The facts about Google, Shopify and WooCommerce come from their documentation, read on October 9, 2026.
One point first, so as not to overrate markup. Google writes in its AI optimization guide that structured data isn't required for its generative answers, and that there is no special markup for them. It does recommend Merchant Center feeds. Markup is still useful: it states the price and availability without ambiguity, and it makes the page eligible for rich results. But the text of the page is what gets read first.
The text of the page
Everything is in the HTML
Run the test on one product page: view the page source (Ctrl+U) and look for the product name, its price and a sentence of the description. What is not there is not read by most assistant robots.
The most common traps:
- customer reviews loaded by a widget after the page is displayed;
- a "Specifications" tab whose content only arrives on click;
- a variant price computed by a script;
- a description, a size chart or a comparison published as an image.
A name that stands on its own
"The Classic" means nothing outside your site. "The Classic urban e-bike, aluminium frame" makes sense in an answer. A good product name holds four parts: the brand, the product type, the model, and the attribute that sets the variant apart (color, size, volume). When the variant changes the price, it belongs in the variant's name.
Numbers with their condition
Writing "120 km range" beats an icon. Writing "120 km range in eco mode, 70 km in sport mode" is better still: an assistant often repeats a number as it is, and a number without its condition becomes a promise the product does not keep.
Group the specifications in a real HTML table, with the same unit everywhere: the weight in kilos on the page, in the feed and on the marketplaces.
Answering shopping questions
Customers do not ask "tell me about model X". They ask for a product for a use, a budget, a constraint. A page that answers those questions gives the assistant something to justify a recommendation with. Add a short paragraph for each one that applies:
- Who it is for: the intended use, and also who it does not suit. A limit stated plainly makes the rest more credible.
- Compared with what: what sets it apart from your other model, or from the category.
- Compatibility: sizes, devices, parts, standards.
- Care and lifespan: what to do, what wears out, what is under warranty.
- What's in the box: what is included, what is not.
- Shipping and returns: delays, fees, number of days to return.
Images and reviews
Every image carries alt text that describes the product and its variant: "The Classic e-bike in sage green, side view". At least one image per variant.
Customer reviews are a source assistants readily quote ("buyers point out…"). They only help if they are readable in the page. And they should only be marked up in that case: Google asks that marked-up reviews be "readily available to users from the marked-up page", per its review snippet guidelines. Never an aggregateRating for a rating that is not displayed.
Structured data
Google spells out what it expects from a merchant page in its merchant listings documentation:
- required:
name,imageand an offer (offers) withprice, greater than zero, andpriceCurrency, in ISO 4217 format (EUR); - recommended: an identifier (
gtin,gtin13…, ormpn),brand,hasMerchantReturnPolicy,shippingDetails,aggregateRatingandreview.
Availability uses a schema.org value: InStock, OutOfStock, PreOrder, BackOrder, Discontinued… A strikethrough price is declared separately, with "priceType": "https://schema.org/StrikethroughPrice"; the active price has no priceType.
The rule above all others, in Google's general guidelines: "Your structured data must be a true representation of the page content." The markup says what the page shows, no more, no less.
Here is a minimal example for a single-product page, shipping and returns included:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "The Classic urban e-bike, sage green",
"image": ["https://www.example.com/images/the-classic-green.jpg"],
"description": "Urban e-bike, aluminium frame, 21 kg, 120 km range in eco mode.",
"sku": "CLASSIC-GREEN-M",
"gtin13": "3760123456784",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"url": "https://www.example.com/products/the-classic",
"price": 2490.0,
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": { "@type": "MonetaryAmount", "value": 0, "currency": "EUR" },
"shippingDestination": { "@type": "DefinedRegion", "addressCountry": "FR" },
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 4,
"unitCode": "DAY"
}
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "FR",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}
}
Shipping and returns can also be declared once for the whole store. Google provides for it: "consider configuring your shipping settings and return policies in Google Merchant Center", or else at account level in Search Console. A policy declared there does not need repeating on every page.
Variants
Black at €2,490 and green at €2,590 are two different offers. Google's documentation on product variants (updated September 8, 2026) describes two ways to present them:
- a single page for all variants, with one URL parameter per variant (
?color=green&size=m); - one page per variant, each with complete markup.
Either way, the markup groups the variants in a ProductGroup, with productGroupID (the parent reference), variesBy (what changes: color, size…) and hasVariant (the list of variants). Each variant has a unique identifier, sku or gtin. And each variant needs a URL that shows it preselected, with the right image, price and stock as soon as the page loads.
Shopify and WooCommerce: what is already in place
Shopify
Shopify's official Dawn and Horizon themes insert the markup with the structured_data Liquid filter. According to Shopify's documentation, it outputs a Product for a product without variants and a ProductGroup as soon as there are variants. The documentation's example holds brand, category, description, image, name, offers and url. It does not say whether the GTIN is included: check it in your product pages' source.
Two admin fields are worth filling in:
- the barcode of each variant: Shopify accepts up to 20 per product or variant, of type GTIN, EAN, UPC, ISBN or ASIN (Shopify Help);
- the category, picked from Shopify's Standard Product Taxonomy: it unlocks category metafields, predefined attributes (material, size, color…) that describe the product in a structured way.
A third-party theme or an app can add its own Product block. Search the page source for "@type": "Product": two blocks giving two different prices are one more contradiction.
WooCommerce
WooCommerce core outputs a Product block itself (class WC_Structured_Data, source code read on October 9, 2026): name, URL, description (the short description if there is one), image, SKU, GTIN from the "GTIN, UPC, EAN, or ISBN" field, price, currency, availability and the average review rating. Two limits to know:
- a variable product with no variant selected shows a price range (
AggregateOffer, withlowPriceandhighPrice), not a price; - the core markup holds no brand (
brand).
An SEO plugin can add its own block or replace WooCommerce's. Same check as on Shopify: one Product block per page, with the displayed price.
One page, one price, one address
The ChatGPT Shopping guide details consistency between the page, the markup, the feed and the marketplaces. Two details add to it on the page itself:
- a stable URL: if you change a product page's address, redirect the old one to the new one;
- a promotion that really ends: the strikethrough price, the badge and the feed's
sale_pricego away on the same day.
What skoup checks
skoup's technical audit checks these points on your product pages: content and product name present without JavaScript, Product markup with a valid price and availability in the sense of Google's merchant listings, shipping and return policy (never an error, since they can be declared in Merchant Center), feed compliance page by page. From the Growth plan, write-back fixes the description, the SEO title, the meta and the barcode; on WooCommerce, the SEO title and meta only with Yoast SEO or Rank Math. Never the price. The details are on the Product page.
The checklist
- The name, price and description are in the page source.
- The product name states the brand, type, model and variant.
- Numeric specifications are written as text, with their unit and their condition.
- An HTML table groups the specifications, not an image.
- The page says who the product is for, and who it is not for.
- Compatibility, care, box contents, shipping and returns each have their answer.
- Every image has alt text naming the product and the variant.
- Customer reviews are readable in the page's HTML.
- One
Product(orProductGroup) block per page. name,image,priceandpriceCurrencyare present; availability uses a schema.org value.- Each product or variant has a GTIN, or failing that a manufacturer part number.
- The brand is declared (
brand). - Shipping and returns are marked up, or declared in Merchant Center or Search Console.
aggregateRatingonly appears if the rating is displayed.- Each variant has its URL, showing its price, image and stock.
- The price is the same on the page, in the markup, in the feed and on the marketplaces.
- A page that changes address redirects the old one.
To know whether these fixes change what the assistants answer, measure before and after, with the same questions: that is the method of the Track your products in ChatGPT guide. The free audit gives a first starting point.