SEO Re-Audit · nanobag.com · 2 September 2026

The technical debt is mostly paid.
The catalog debt came back.

Third audit in the series (June 58/100 → July plan → now 64/100). Robots, titles, and product schema offers are genuinely fixed. But the six meta-catalog products slipped back into the sitemap, the review rating still isn't in the schema despite 708 server-rendered reviews, and the July performance fix was written but never shipped to main.

64/100
Overall SEO health
▲ +6 since June (58)
Technical & crawl
82+14
On-page
68+12
Schema
74+10
AI readiness
72+14
Performance
36+1
Images
55+10
Content
62+2
Sitemap hygiene
60−14

What got fixed

11 confirmed

Every item below was verified against the live site today — fetched with a browser UA, not assumed from the repo.

✓
robots.txt blocks internal search. Disallow: /search is live for all crawler groups — open since June (#3 on the original list).
✓
Cart disallow fixed. Disallow: /cart (no trailing slash) now actually matches /cart.
✓
Meta-catalog + TikTok feed products disallowed in robots. Four pattern rules each keep *-meta-catalog and *tiktok* PDPs out of the crawl across all locales.
✓
GMC feed landing pages crawlable again. Longer-match Allow: /products/*?*country=*&*currency=* rules override the parameter disallow — the "Unable to check product pages" Merchant Center blocker is resolved.
✓
PDP title rewritten. "Reusable Shopping Bags – Compact, Strong & Pocket-Sized" (58 chars) — was a 90-char keyword string.
✓
Duplicate PDP titles differentiated. nanobag-uk-1 dropped from 103 chars with "Nanobag" twice to 75; nanobag-int got its own distinct title.
✓
Homepage title clean. "Reusable Bags That Fit in Your Pocket | Nanobag" (47 chars).
✓
Product schema now carries offers. Shopify's native ProductGroup markup renders 110 variants, each with price, currency, availability, and GTIN. The June "no offers in Product JSON-LD" gap is closed.
✓
Font Awesome and Intelligems are gone. Zero references on the live PDP — the unused icon font and the 1.3s render-blocking A/B script from the July perf audit are both off the page.
✓
llms.txt upgraded. Live with markets/catalog structure and per-market PDP recipe (shipped 1 Sept) — plus agents.md and the agentic-discovery sitemap. AI-commerce surface remains a standout strength.
✓
Social meta hardened. og:image on https, og:price follows the selected variant, twitter:site only when a handle exists.

Regressions

2 new

HighMeta-catalog products are back in the product sitemap

June's cleanup had the products sitemap down to 7 URLs. Today it lists 13 products again — all six *-meta-catalog ads-only products returned. The seo.hidden metafield was evidently lost or reverted. Robots.txt now disallows those URLs, which creates the worst combination: in the sitemap but blocked from crawling — Search Console will flag "indexed, though blocked by robots.txt" and the URLs can still index from the sitemap reference alone, with no page content.

sitemap_products_1.xml → reusable-shopping-bags, nanobag-int, -sg, -uk-1, -ca, -eu, nanobag-daypack-us + 6× *-meta-catalog
Fix: re-apply seo.hidden = 1 on the six meta-catalog products (admin metafield — survives in Shopify, not the theme repo, so check what wiped it). Robots disallow alone is not a substitute.

MediumUtility collections leaked into the sitemap

The collections sitemap now carries /collections/eg-gift-app (the free-gift app's internal collection), /collections/sellable-bags, and /collections/nanobag-1 alongside the six placeholder style collections. Internal plumbing is being offered to Google as landing pages.

Fix: seo.hidden on eg-gift-app / sellable-bags / nanobag-1; the style collections get the same treatment or real content (see below).

Still open

8 carried over

Same issues, third audit in a row for most of them. Ordered by expected impact.

HighaggregateRating still missing — 708 reviews invisible in search

Judge.me server-renders data-average-rating='4.84' with 708 reviews (up from 639 in July) right in the HTML, already grouped across duplicates — but neither the ProductGroup schema nor anything else on the page emits aggregateRating. Zero occurrences on PDP and homepage. This is the single cheapest rich-result win on the site: star ratings in product SERPs and eligibility for review snippets.

grep -c aggregateRating pdp.html home.html → 0, 0 data-average-rating='4.84' data-number-of-reviews='708'
Fix: a small snippet reading the Judge.me metafields into an aggregateRating block attached to the ProductGroup @id, or enable Judge.me's rich-snippets toggle. Unblocked since July.

HighJuly's performance fix never shipped

Commit e12ee58 (defer jQuery + slick, async slick.css) is still only on the Shubham branch — not on main. The live PDP head confirms it: jquery.min.js and slick.js load parser-blocking with no defer, while vendor.js and theme.js are deferred around them. PDP HTML is still 1.3 MB, and both Hotjar and Clarity still run together. Today's Lighthouse mobile lab run: homepage 30/100 (LCP 9.0s, TBT 7.5s), PDP 30/100 (LCP 13.8s, TBT 10.0s, 11.7 MB total weight, 34s of script bootup) — essentially where June left it. The two wins that did ship (Font Awesome and Intelligems removed) were eaten by everything that didn't. CLS is a clean 0 on both pages.

<script src=".../jquery.min.js" data-cookieconsent="ignore"> ← no defer <script src=".../slick.js" data-cookieconsent="ignore"> ← no defer Lighthouse mobile: home LCP 9.0s · TBT 7,510ms · 7.3MB — PDP LCP 13.8s · TBT 10,010ms · 11.7MB · unused JS 1.3MB
Fix: cherry-pick the deferral change onto main — but re-verify against the Cookiebot boot-chain invariant first (the Aug 19 EU incident touched exactly these scripts). Then pick one of Hotjar/Clarity.

HighDuplicate product entities — and the MCP catalog still sells the wrong ones

The five market PDPs (nanobag-int/-sg/-uk-1/-ca/-eu) plus nanobag-daypack-us remain live, self-canonical, and in the sitemap next to the canonical reusable-shopping-bags. And the storefront MCP (/api/mcp) still returns 10 products for "reusable shopping bag" — all six meta-catalog products, market dups, now including a new nanobag-au — while omitting the canonical PDP entirely. Any AI shopping agent asking Nanobag what it sells gets the ads-only catalog. (Consolidation is archived per client decision; this is the standing cost of that choice, worth restating once per audit.)

POST /api/mcp search_catalog("reusable shopping bag") → nanobag-au, daypack-us, 6× meta-catalog, eu, ca — canonical absent
Fix (without consolidation): unpublish the meta-catalog products from the Online Store channel — seo.hidden doesn't filter MCP/UCP, channel publication does. Verify the Meta feed doesn't depend on Online Store publication first.

MediumH1 hygiene unchanged: variant-name H1 + the Zipify leak

The PDP's H1 still renders the variant ("Standard Black"), not the product. The literal Zipify template string {!= form_name !} still ships as a real second <h1> on the PDP, homepage (which has 4 H1s total), and pages. Third audit with both present.

<h1 class="zpa-crm-popup-title" style="color:{!= form_name_color !};...">{!= form_name !}</h1>
Fix: H1 = product title with variant moved to a sub-element; the Zipify popup snippet needs its template wrapped in <template> or removed if the popup is dead.

MediumProduct SEO fields still English on all 14 locales

/de-de/products/reusable-shopping-bags serves the byte-identical English title and meta description. Bodies and homepages are translated; the product-level SEO fields never were. Every non-English market competes in Google with an English snippet.

Fix: translate product meta_title/meta_description via the translations API — same translationsRegister kit already used for homepage sections (scripts/ has the pattern).

MediumSchema identity leaks: "Nanobag - US" + a description selling discontinued products

The ProductGroup name is still the internal "Nanobag - US". Its description (shared across 8 products including the Meta ads feed) still describes the discontinued Mini and Air and contradicts the on-page comparison table on weights.

Fix: rename the product's public title field and rewrite the shared description once — it propagates to schema, the ads feed, and the MCP catalog together.

LowPlaceholder and ghost pages still indexable

Six style collections (/collections/standard|xl|sling|micro|air|pack) still serve unmodified Shopify placeholder copy with bare one-word titles. /pages/page is still the stale Winter Sale LP; /pages/go-nanobag-eu is a 200 JS-redirect page with no title tag at all. All in the sitemap.

Fix: seo.hidden the lot, or give the style collections 2–3 sentences of real copy each (they're plausible landing pages for style queries).

LowImage alt coverage ~71%

40 of 138 <img> on the PDP lack alt text — proportionally better than June (58%→71% covered), and part of the remainder is payment icons. The alt-text audit doc in the repo covers the product gallery set.

Fix: work through nanobag-alt-text-audit.html for the product gallery images; ignore the payment/review widget SVGs.

Action plan

Ordered by impact ÷ effort. Items 1–3 are metafield/admin changes — no theme deploy risk at all.

#ActionWhereEffort
1Re-apply seo.hidden to the 6 meta-catalog products; find out what reverted itShopify admin metafields15 min
2Emit aggregateRating (4.84 / 708) in the ProductGroup schematheme.liquid JSON-LD or Judge.me toggle~1 h
3Hide eg-gift-app / sellable-bags / nanobag-1 collections + the two ghost pages from sitemapShopify admin15 min
4Cherry-pick the jQuery/slick deferral to main — after a fresh pre-consent EU QA passe12ee58 → main~1 h + QA
5Fix the Zipify {!= form_name !} H1 leak and the variant-name H1theme snippets~2 h
6Translate product meta title/description for the 8 non-English localestranslations API script~2 h
7Rewrite the shared product description (drop Mini/Air, fix weights) + public product nameShopify admin — copy task~1 h
8Unpublish meta-catalog products from Online Store channel (fixes MCP catalog) — verify Meta feed dependency firstShopify admin channels30 min + check