AboutAll ServicesFree EmailOur WorkGuidesFAQContact
Services
SEO ServicesEcommerce RankingSpeed OptimizationWebsite AuditGoogle Ads ManagementMeta Ads ManagementSocial Media ManagementAnalytics & TrackingShopify Catalogue SEO
Build & Solutions
WordPress DevelopmentEcommerce DevelopmentCustom EcommerceFlying CartFlying AdsFlying Blog
Dedicated Sites
ServicesCareFirstlightTruefeedWoo2ShopifyShopify

Shopify Catalogue SEO

The Shopify fields nobody filled in

A migrated or agency-built Shopify store usually arrives with product type, SEO title and SEO description empty on 90 to 100% of its products. Nothing looks broken, so nobody notices — and meanwhile every Shopping listing competes on Google's guess of what the item is.

The problem, as we usually find it

What is actually going wrong on most of the sites we are called into — before anything about what we would charge.

This is the least glamorous work we do and one of the highest-return. It is not strategy. It is two thousand products that were imported once and never given the fields Google reads.

You will not see it in the admin, because Shopify does not complain about an empty SEO field. You see it in the Shopping feed, where the product type is blank, and in the search snippet, where your title is whatever the product was called in the spreadsheet it was imported from.

On the last catalogue we rebuilt, product type was empty on all 2,686 products — and Shopify's own coverage query reported that every one of them had one.

What is actually empty, on a real catalogue

One store, 2,686 active products, measured by reading every value rather than by asking Shopify for a count. Each ring is the share of the catalogue where that field was blank when we arrived.

0%

Product type

2,686 of 2,686 empty

Every active product. Shopify's own coverage query reported all 2,686 as healthy.

0%

SEO title

2,377 of 2,686 empty

The field the Google Shopping feed sends as the offer title.

0%

SEO description

2,354 of 2,686 empty

The line under your result. Where it was blank, Google wrote its own.

What the work covers

Everything below is included. If something is not on this list, we quote it separately rather than leaving you to find out later.

Full catalogue dump first

Every product exported to a local file so the gap is measured against real values, not against a coverage query that counts empty strings as filled.

Product type on every product

From a rule engine — title patterns first, collection membership second, loose keywords last — with every ambiguous product left empty rather than guessed.

SEO titles and descriptions

Written to the real character budget, after your theme's title suffix is accounted for, and checked against Merchant Center's rules on promotional text.

Theme title suffix handled

One condition so the shop name is dropped on product pages and kept everywhere else, returning around 13 characters to every product title.

Brand collections and menu

Automated collections on vendor, with a minimum product count so you do not end up with forty thin pages, published and verified live.

Redirect map for migrations

If the store moved platforms, the old URLs that still hold the rankings are mapped before anything else is touched.

Verified by re-reading, not by totals

The catalogue is dumped again after the run and diffed against what we meant to write. You get the count of correct, mismatched and drifted products.

The scripts, and what they did

You get the run log and the generated values as files. If you part ways with us, the work does not need redoing to be understood.

What we have actually found

Real numbers from real accounts. We never publish client names, so the businesses are described rather than identified — the figures are exactly as we found them.

2,686 of 2,686

products with no product type on one catalogue — while Shopify's own coverage query reported every one of them healthy

2,415

SEO titles and descriptions written in one run, with 74 existing hand-written descriptions read first and returned unchanged

38

promotional "Buy … Online" titles found already live in the Shopping feed, where they read as non-product data

36

brand collections built and verified live, covering 73% of the catalogue; 87 vendors too small to justify a page were excluded

The detail that decides it

The part most quotes leave out, because it takes experience rather than a price list.

Why the count you are looking at is wrong

Before doing any of this we check how big the gap is. The obvious way is to ask Shopify how many products have a product type. That query is product_type:*, and it is a presence filter — it matches the empty string. On a catalogue where every single value was blank, it reported 100% healthy.

Four hand-checked samples proved it wrong in about a minute. That is the whole lesson: an aggregate count tells you a field exists, never that it contains anything. We dump the entire catalogue to a local file and read real values instead.

It is also why we can tell you the true gap for free before you commit to anything. The dump is an hour of machine time, not a consulting engagement.

The character budget is smaller than you think

Google shows roughly 60 characters of a title. Most Shopify themes append – Your Shop Name to every page, which on a typical store eats about 13 of those 60 before you have written a word. Write two thousand titles at 60 characters and every one of them is truncated in the result.

So the theme comes first. On the last rebuild we added one condition in layout/theme.liquid so the suffix is dropped on product pages only — collections, blog and homepage keep it, because there the shop name is the useful part. That single line returned 13 characters to every product title in the catalogue.

Decide the suffix before writing the titles, not after. Doing it in the other order means writing them twice.

Your SEO title is your Merchant Center title

This is the one that costs money. Shopify's Google channel sends seo.title as the feed title, not the product title. So a promotional SEO title is not a style choice — it is feed data.

"Buy X Online in India" reads to Google as non-product data and gets offers disapproved. On the last catalogue we found 38 products with promotional openers already live in the feed, and rewrote them. Nobody had connected the two systems, because in the admin they look like separate features.

The same rule kills most of the title formulas an agency will hand you. If it would look wrong on a Shopping card, it is wrong in seo.title.

The traps that make this skilled work rather than a bulk edit

Shopify replaces the whole seo object wholesale. Send a seo.description on its own and seo.title is silently set to null. Every write has to carry both fields. Our apply script refuses a partial seo object before it makes a network call, because by the time you notice you have wiped two thousand titles.

A wrong-but-real product id does not error, it writes to the wrong product. So every mutation echoes the handle back and the script compares it to what it meant to update.

Rule engines fail quietly. A singular-only pattern for filter missed every plural. A vendor whose name contained a category word filed that brand's adapter rings as filters. Instant film was classified as a camera. None of these show up in a summary total — they are only found by printing every row that matched a pattern and landed somewhere unexpected.

Collections created through the API are not published. They return a 200, they look correct in the admin, and they 404 on the storefront until they are explicitly published to the Online Store channel.

Duplicating a theme is asynchronous. It returns an id immediately, then keeps copying files for about twenty seconds. Write in that window and the file verifies clean — byte for byte — and is then silently overwritten by the background copy. That one cost us two publish cycles before we understood it, and it is now a poll-and-verify-twice step in the process.

The redirect map, and why fuzzy matching is dangerous

If the store moved platforms, the old URLs are usually still the ones Google sends people to. On one migration, 675 product URLs were serving 404s while still earning 67% of the site's search clicks. Nothing on the new store was wrong. The traffic simply arrived at nothing.

The obvious way to rebuild that map is string similarity between the old slug and the new one. It is also the wrong way. At a 0.82 similarity cutoff, the matcher we tested paired a Nikon Z6 III with a Z7 II, and a 35mm lens with an 85mm — both well above the threshold, both sending a buyer to the wrong product.

So matching runs on model tokens rather than overall similarity, and anything that genuinely needs a human decision is handed back as a list to be worked through, not guessed at. A redirect to the wrong camera is worse than a 404, because the 404 at least tells the truth.

Where we stop, and why

We do not guess. On the last catalogue, 23 products were genuinely ambiguous and were left with no product type rather than given a wrong one, because a wrong type is worse in a feed than an absent one.

Existing hand-written copy is read first and sent back unchanged. Every store has a handful of products someone actually wrote about, and overwriting those with generated text is the fastest way to make a rebuild a net loss. On the last one there were 74, and all 74 came through untouched.

We also say when something has to come off. On one store we found a fabricated "rated 4.5/5 from 650+ reviews" strip with stock-photo avatars sitting on every product page — while a real review app was already installed and rendering underneath it. That came off every page. Invented review claims are a legal exposure, not a conversion tactic.

Brand collections were built only for vendors with at least 20 products. 87 of 178 vendors had fewer than five, and a collection page with four items on it is a thin page, not an asset.

Two catalogues, rebuilt

The run sheets from both — what went on, what was deliberately left alone, and what the re-check found afterwards. Kept separate rather than added together, because the two catalogues had different sizes and different faults. Stores are described, never named. The longer catalogue of findings lives on our Shopify site.

A camera and imaging retailer

2,686 active products, 178 brands, moved from WooCommerce

0

products in the catalogue

2,686 of them active

0

products given a product type

23 genuinely ambiguous ones left empty rather than guessed

0

product types created

from title patterns, then collections, then keywords

0

SEO titles and descriptions written

both fields on every write, never one alone

0

hand-written descriptions preserved

read first and sent back unchanged

0

brand collections built and published

the store went from 76 collections to 112

0

characters returned to every title

by dropping the theme's shop-name suffix on product pages only

0

products mismatched on re-verification

the whole catalogue was dumped again and diffed

A pro-audio equipment dealer

733 active products, migrated store, priced in INR

0

products rebuilt end to end

title, description and product type on every active product

0

product types created

a smaller catalogue, so a flatter taxonomy

0

brand collections built and published

with a Brands menu and redirects from the old brand URLs, which were all 404ing

0%

of products carried placeholder barcodes

junk values from the migration, which break GTIN and the brand-plus-MPN fallback behind it

0

characters — where the theme was truncating

every hand-written meta description, silently, before Google ever saw it

0

variants unpriced for over twelve months

found in a price audit we raised and have not been asked to action

What we need from you

Short, and worth reading before you start. What delays this work is almost never the work — it is waiting on access or a decision.

A Shopify custom app with API access

Shopify retired the reveal-token button, so this is a client credentials app you create and we configure. Scopes for products, publications and — for the title suffix — themes.

A decision on the title suffix

Whether the shop name stays on product pages. It changes every title we write, so it has to be settled before we start, not after.

Your product vocabulary

What you call your categories, and which vendor names are brands rather than descriptions. Half an hour of this saves a week of misclassification.

Merchant Center and Search Console access

Read is enough. Without them we are improving fields we cannot measure the effect of.

Whether this is right for you

We would rather lose the enquiry than take work we would do badly, so the right-hand column is as honest as the left.

This is for you if

  • You migrated to Shopify and the fields never came across
  • You have more than a few hundred products and editing them by hand is not realistic
  • Your Shopping feed is missing product types, or offers are being disapproved on title text
  • Someone built the store and left, and nobody knows what was filled in
  • You want the run logged and the values handed over, not done invisibly

This is not for you if

  • You have under a hundred products — do it by hand, it will cost you less than we will
  • You want the copy to sell rather than to describe; this is catalogue data, not brand writing
  • You want us to guess a category for every product regardless — we leave ambiguous ones empty on purpose
  • You are on WooCommerce or another platform; the same problem exists there but the tooling is different
  • You need it inside a day on a large catalogue; the writes are rate-limited and rushing them is how stores get half-updated

How it runs

Four steps, in this order, every time.

  1. We dump the whole catalogue and send you the real gap — how many products are missing what. This part is free and it is often where the conversation ends, honestly.
  2. The theme title suffix is decided and changed first, because it sets the character budget for everything written afterwards.
  3. Product types go on, generated then spot-read row by row, with anything ambiguous left empty rather than guessed.
  4. Titles and descriptions follow, both fields on every write, existing hand-written copy preserved. Then the catalogue is dumped again and diffed against what we intended.

The Stack We
Work In Every Day

Every platform below is one we build on, maintain, rank and report from — not a logo wall.

WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console

Questions

No. Product descriptions on the page are a different field entirely and are never touched. The SEO description is the one Google shows in results, and where you have written one yourself we read it first and send it back unchanged.

Budget an hour of wall-clock for the writes themselves — they are deliberately paced so Shopify does not throttle us mid-run — and a few days around that for the classification work and the checking, which is the part that actually takes judgement.

Almost certainly not. When a generated SEO title is identical to the product title, Shopify stores null and falls back to the product title — the page renders correctly. On the last rebuild 1,966 of 2,415 read back that way, and all 2,415 were accounted for. It is worth knowing before you panic at a report.

The generators are store-agnostic; the taxonomy tables that make them right for your catalogue are not, and those are the actual work. You get the run log and every generated value as files, so nothing is locked up with us.

Yes, but not on this page — themes, sections and payment setup live on our Shopify site. This is the catalogue work, which we also do on stores we did not build.

Want free stats on your site first?

Send us the URL. We pull the numbers from your own accounts and tell you what is wrong before there is any quote, and before there is any contract.

No pitch deck, no obligation. Bring your URL and we will look at it together.