Quick answer: Product page SEO on Shopify comes down to four things: a title that matches how people actually search, a description that is yours rather than the manufacturer's, structured data that matches what the page shows, and an image that paints fast. Everything else is secondary. The single biggest ranking loss on most stores is duplicate supplier copy across hundreds of products.

A Shopify product page starts with decent bones — clean URL, mobile template, fast CDN. What it does not start with is anything that distinguishes it from the four hundred other stores selling the same SKU with the same supplier description. That is the actual problem, and most product-page checklists never mention it.

The title tag, and the 60-character trap

Shopify defaults the SEO title to the product title. That is usually wrong in a specific way: product titles are written for the catalogue ("Merino Crew — Charcoal"), and searches are written differently ("mens merino wool jumper").

Write the title around the search phrasing, keep the product name in it, and watch the length. Most themes append the store name automatically, so a 58-character title renders at 68 and gets truncated in results. Budget for the suffix or include the brand yourself so the theme skips it.

Descriptions: the duplicate content problem nobody fixes

If your description came from the supplier, it is on every competitor's site verbatim. Google is not penalising you for it — there is no duplicate content penalty — but it has no reason to rank your copy over a larger store's copy of the same text.

Rewriting 800 products by hand is not realistic, which is why most stores do not. The tractable version: rewrite the top 50 by revenue and traffic, and leave the long tail. The 50 are what people actually search for.

What to put in them: what the product is for and who it suits, the specifics a shopper would otherwise have to ask (measurements, materials, care, fit), and the objection that stops the sale. Those are also what AI answer engines quote, because they answer a question.

Structured data that matches the page

A Product JSON-LD block with name, image, offers (price, currency, availability) and brand makes the page eligible for a product rich result. Without offers it is not eligible at all, which catches out a lot of stores whose markup validates cleanly and does nothing.

The rule that gets stores in trouble is the visibility one: do not mark up a rating the page does not display. See structured data auditing for the failure modes and the schema markup guide for the implementation.

The image is usually the LCP element

On almost every Shopify product page the hero image is the largest thing in the viewport and the thing Google times for Largest Contentful Paint. A 1.5 MB hero is a failed Core Web Vitals assessment regardless of how good the copy is.

It should carry fetchpriority="high", explicit width and height, and no lazy-loading. The rest of the gallery should lazy-load. Details in image SEO for Shopify.

Variants, and when they should be their own page

Shopify variants share one URL. That is right when the variant is a colour or size, and wrong when it is effectively a different product people search for by name — a 500ml versus 5L of the same fluid, say.

The test is whether anyone searches for the variant specifically. If they do, it wants its own product with its own title and description. If they do not, keeping it as a variant concentrates signals on one URL, which is what you want.

What to do first

In order, on your top 20 products by revenue: fix titles for search phrasing and rendered length, rewrite descriptions that came from a supplier, confirm offers is present in the markup, and check the hero image size.

Priority Action Reason
1 Rewrite title tags to match search phrasing and keep rendered length under ~60 characters (account for store name suffix) Cheapest change with fastest feedback; avoids truncation and targets real search terms
2 Rewrite supplier descriptions for top products — focus on what the product is for, specifics, and the objection that stops the sale Duplicate copy gives no reason to rank your store over competitors; unique descriptions help top revenue drivers stand out
3 Confirm offers (price, currency, availability) is present in the product JSON‑LD structured data Without offers, the page is not eligible for product rich results even if the rest of the markup validates
4 Check hero image file size; set fetchpriority="high", explicit width/height, and no lazy‑loading Hero image is usually the LCP element; oversized files silently fail Core Web Vitals

That sequence is deliberate — titles are the cheapest change with the fastest feedback, and image weight is the one most likely to be silently failing.

Related