Product page SEO: what a buyer and a crawler need on the page

This is the checklist for a product page that earns clicks and sales. You will ship each element yourself, from the title to structured data. It follows Google’s ecommerce guidance as of 2026.

By , founder of Porteur · Updated 14 September 2026 · Markdown

What a product page must answer

A buyer arrives with a task: is this the right product, at the right price, from a store I trust. Your page must answer that in one scroll.

  • Name, variant, price, availability, delivery and returns
  • Clear photos for every variant and the main view in high quality
  • A short description that helps a human choose, not a pasted spec sheet
  • Reviews that talk about the product, not your company
  • Technical data the crawler can parse: Product structured data with offers, price, availability and reviews
  • Links that place the product in your site: category, breadcrumbs, related products

When those are present and consistent, you can appear in Search, Images and the Shopping tab. Your Merchant Center feed, if you use one, must match the page.

Title and h1 that match the query

Write the title for the search, the h1 for the buyer. Keep both aligned on the product name and key variant.

  1. Pick the exact product name

    Use what people type. Example: “Blue linen shirt men, regular fit, YourBrand” not an internal code.

  2. Include the deciding variant

    Colour, size range, capacity or model number. Leave filler like “Buy online” out, unless it replaces something weaker.

  3. Keep the title under about 60 characters

    You avoid truncation. Example: “Blue Linen Shirt, Regular Fit | YourBrand”.

  4. Match the h1 to the title

    Use the same words in natural order. Example h1: “Blue linen shirt, regular fit”.

What a fixed page looks like: /products/blue-linen-shirt has a title that names the product and variant, and an h1 that repeats it cleanly.

Meta description written for the buyer

Write one sentence that helps a human choose. Use the benefit, a key feature, delivery or returns, and a CTA verb. Do not keyword stuff.

  1. Start with the benefit

    Example: “Breathable linen that keeps you cool.”

  2. Add one distinctive feature

    Example: “Pre-washed for softness, machine washable.”

  3. State delivery or returns

    Example: “Free 30‑day returns.”

  4. End with an action

    Example: “Choose your size today.”

Keep it within 120 to 155 characters so it displays well. Your Shopify product has a description field you can edit for this snippet and the on-page copy.

Images and alt text that carry the variants

Your largest image is often the LCP. Make it fast and descriptive. One image per variant beats one generic shot for all colours or models.

  • Add alt text that names the product and variant, e.g. “Blue linen shirt, regular fit, front view”
  • Use descriptive file names, e.g. blue-linen-shirt-regular-fit-front.jpg
  • Supply the image in structured data with the Product image property
  • Lazy load below-the-fold gallery shots, keep the main image fast
  • For Shopify, set alt per image in the admin; most themes output it

What a fixed page looks like: the blue variant shows a blue photo on selection, with matching alt and an updated main image URL in the markup and HTML.

Product structured data with offers, price, availability and reviews

Use JSON‑LD. Mark up the product, a live offer, the price, the currency and the availability. Add aggregateRating and review only if you have real product reviews.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Blue Linen Shirt, Regular Fit",
  "image": [
    "https://yourshop.com/images/blue-linen-shirt-front.jpg",
    "https://yourshop.com/images/blue-linen-shirt-back.jpg"
  ],
  "sku": "BLS-REG-BLUE",
  "brand": {
    "@type": "Brand",
    "name": "YourBrand"
  },
  "description": "Breathable linen shirt, regular fit. Pre-washed for softness.",
  "offers": {
    "@type": "Offer",
    "url": "https://yourshop.com/products/blue-linen-shirt",
    "priceCurrency": "USD",
    "price": "YOUR_PRICE",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "priceValidUntil": "2027-12-31"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "REVIEW_COUNT"
  }
}
</script>

Check it in Google’s Rich Results Test. If you run a Merchant Center feed, keep price and availability in sync with the page or your free listings can be limited.

Variants, URLs and canonicals

Keep one stable URL for the main product. Use clean variants. Canonicalise variant URLs to the parent unless a variant has search demand on its own.

CaseURL and canonicalWhy
Same product, minor variants (size, colour)/products/blue-linen-shirt as the canonical. Variant parameters or paths resolve here.The intent is one product. Avoid thin duplicates.
Variant with demand (e.g. “linen shirt tall fit”)/products/blue-linen-shirt-tall with its own canonical.People search it. Earn a page that answers it.
Shopify collection URLs/collections/linen/products/blue-linen-shirt with canonical to /products/blue-linen-shirt.Shopify does this by default. Keep it.
Parameters for sort or viewKeep parameters minimal, consistent and non-indexable.Prevent index bloat and duplicate content.

If you use filters that create many URLs, allow only combinations with demand to be indexed. Keep the canonical on the unfiltered product or category page. Use robots.txt disallow or noindex for the rest, and avoid infinite combinations.

Out of stock and discontinued products

Do not delete a product that will return. Keep the page live. Show the stock status in structured data and on the page. Offer nearby alternatives.

  • Temporarily out of stock: set availability to OutOfStock in Product offers. Keep the URL live.
  • Backorder or preorder: set the correct availability value, not InStock.
  • Gone for good: 301 to the closest alternative or the parent category, or 410 it.
  • Keep reviews and Q&A visible for returning buyers.

A fixed page shows “Out of stock, back in November” on the page, availability in the markup, and a clear link to “See similar linen shirts”.

Reviews that help buyers choose

Collect reviews about the product. Show the average and the count near the price. Let buyers filter by rating or mention useful traits like fit or battery life.

  • Mark up aggregateRating on the Product, not on unrelated pages
  • Moderate for spam, not for sentiment
  • Do not copy reviews from other sites into your markup
  • Invite review submission after delivery, not at checkout

What a fixed page looks like: an average star rating shown near add to cart, with snippets that mention fabric and fit, and Product aggregateRating in JSON‑LD.

Page speed on a product page

Your main image and theme scripts decide Core Web Vitals. Aim for LCP under 2.5 seconds, CLS under 0.1 and INP under 200 ms on mobile.

  • Serve the hero image in an efficient format and size for the viewport
  • Self host critical fonts or use system fonts, preload the main font
  • Defer non-essential apps and third-party scripts until after interaction
  • Lazy load carousels and below-the-fold reviews
  • Audit with PageSpeed Insights and your theme’s performance settings

What a fixed page looks like: the hero image is under 120 KB, the cart script waits until interaction, and CLS is flat because sizes are set for images and badges.

Worked example: fixing /products/blue-linen-shirt

Start point: title is “Products: Store”, description is empty, one generic image, no structured data, and the page sits only in /collections/all. It gets impressions for “linen shirts” but no clicks.

  • Title: “Blue Linen Shirt, Regular Fit | YourBrand”
  • H1: “Blue linen shirt, regular fit”
  • Meta description: “Breathable linen keeps you cool. Pre‑washed for softness. Free 30‑day returns. Choose your size today.”
  • Images: front and back for blue, plus a shot per colour; alt text updated per image
  • Content: 80 words that say fabric weight, fit, care, returns, and model height for sizing
  • Structured data: Product with offers, availability, price, image and aggregateRating
  • Navigation: breadcrumbs Home > Shirts > Linen; related products grid: 4 linen shirts
  • Variant handling: sizes as options on the same URL; a separate URL for “Tall fit” as demand exists
  • Speed: compressed hero image, deferred review widget, CLS fixed by setting image dimensions

After, Search shows a result with the right title, a relevant description and, when eligible, a price and rating. The category page now links it with exact anchor text. The Shopping tab shows the same price and availability as the page.

Questions

Sources

Check my site, free

Paste one product URL and get a free check that reads your page, the searches around it and rivals on them in about thirty seconds, with three findings shown.

  • Free check, no card
  • Read-only, your own accounts
  • Readable by your agent

Read next