0Health Score

Nanobag SEO Audit

nanobag.com · June 12, 2026 · Shopify · 14 markets · 7 specialist audits
Strong infrastructure (hreflang ×16, SSR, 120ms TTFB, llms.txt) undermined by duplicate product entities, a buy-box-blocking geo modal, megabyte app-embed JS, and review data never reaching search engines.
5Critical
7High
9Medium
9Low

Category Scores (weighted → 58/100)

Technical SEO 22%
68
Content / E-E-A-T 23%
60
On-Page SEO 20%
56
Schema / Structured Data 10%
64
Performance (CWV) 10%
35
AI Search Readiness 10%
58
Images 5%
45
Sitemap (in technical)
74

What's Working

Hreflang ×16 correct with reciprocity + per-market sitemaps
Fully server-rendered — no JS-rendering dependency for indexing
TTFB ~120ms · CLS passes everywhere · 103 Early Hints
llms.txt + agents.md + UCP live; all AI crawlers allowed (verified by live fetch)
Wikidata entity exists; strong r/onebag Reddit comparison presence
Blog: founder bylines, Article schema, fresh dates, 2,300+ word posts
Sitemap: valid XML ×61, 0 broken URLs of 69 checked, in robots.txt
Trust: legal entity + address, full GDPR/CCPA/PIPEDA/APPI legal suite

Quick Wins — highest impact ÷ effort

1. Block /search + noindexCreate robots.txt.liquid, restore the dropped Disallow. ~1 hour.
2. Review schemaJudge.me Rich Snippets toggle or metafield snippet → star results for 687 reviews. ~1–2 hours.
3. seo.hidden on clone productsKills ~104 duplicate URLs, keeps Meta catalog purchasable. ~Half day.
4. Rename "Nanobag - US"Customer-facing product names; stop leaking internal market naming into H1/schema/AI answers. ~Hours.

Action Plan

30 findings · click a card for evidence & fix · click KPI chips or filters to narrow
CriticalUX / Page ExperienceGeo modal completely blocks the product-page buy box

Evidence
For any non-US IP, within ~3s an "International shopper" modal covers title, price, rating, variants, and add-to-cart. It never auto-dismisses and persists on scroll (screenshots: clean buy box at 1.2s → fully obscured at 3–8s+). Exact intrusive-interstitial pattern Google penalizes on mobile.

Fix
Replace with a dismissible top banner or Shopify Markets native geo-recommendation. At minimum: auto-dismiss, once-per-session cookie, never cover the buy box.
CriticalTechnical / Content / AIDuplicate product entities — ~104 indexable clone URLs

Evidence
13 products in sitemap; collections link only /products/reusable-shopping-bags. Orphan clones (nanobag-int/-sg/-uk-1/-ca/-eu, nanobag-daypack-us, 6× *-meta-catalog) are 200 + self-canonical + indexable, several with the identical title "Folding Travel Bag | Reusable Tote Bag…" and 91–93% duplicated body content. ×14 locales ≈ 104 URLs. AI engines see ~7 conflicting "Nanobag" entities with different prices.

Fix
Set seo.hidden = 1 metafield on feed/regional clones (drops from sitemap + noindexes, stays purchasable for Meta catalog ads), or canonicalize to the primary PDP. Write unique per-product copy for real products (Daypack).
CriticalTechnicalInternal search results fully indexable — unbounded crawl space

Evidence
/search?q=tote → 200, no noindex, self-referencing parameterized canonical. The new Shopify agentic-default robots.txt dropped the classic Disallow: /search. Multiplies across 15 locale prefixes.

Fix
Create robots.txt.liquid restoring Disallow: /search and Disallow: /*/search; add noindex meta to the search template.
CriticalSchema687 Judge.me reviews (4.82★) invisible — no aggregateRating in product schema

Evidence
Judge.me installed (data-shop-average-rating="4.82", data-shop-review-count="687" in HTML) but ProductGroup JSON-LD has no aggregateRating/review. No star rich results — the largest CTR lever available.

Fix
Enable Judge.me "Rich Snippets" OR add snippets/product-rating-schema.liquid using Shopify reviews.rating metafields with absolute @id matching native ProductGroup (snippet in the .md report). One method only; product-level ratings, never the store-wide 4.82.
CriticalPerformanceMobile LCP 7.8s, ~15s main-thread blocking — megabyte inline app embeds

Evidence
Lab (Slow-4G, 4× CPU): home mobile LCP 7.84s, TBT 14.7s, 84 long tasks. HTML 1.4MB (home) / 2.7MB (PDP), 84–87% inline JS: 908KB catalog-dump app embed (3,097 variant JSON entries, every page), EasyGift 523KB, Zipify OCU 206KB, Shoplift 151KB (no active test). Sync jQuery+slick in head. 8 autoplay hero videos (3–6MB) starve the LCP poster. Both Hotjar AND Clarity running. TTFB 120ms and CLS pass — the problem is purely payload/main-thread.

Fix
Remove/replace the 908KB app embed (highest single win) · disable Shoplift between tests · defer jQuery/slick · poster-first videos (preload="none" + intersection load) · drop one session recorder · delay pixels until first interaction. Re-run PSI with API key for field INP.
HighInternationalLocalized pages serve English titles & meta descriptions

Evidence
/de-de and its PDPs: fully English <title> + meta description despite German body chrome; mixed English strings in body. Known market-cloned-sections root cause. Hreflang works perfectly — its relevance benefit is wasted on untranslated metadata across 14 markets.

Fix
Complete per-locale title/description translations; rebuild market-cloned "…EU" sections on base sections so Shopify can translate them.
HighOn-Page / Schema / AIInternal naming leaks: H1 = "Standard Black", schema name = "Nanobag - US"

Evidence
PDP's only H1 renders the selected variant ("Standard Black") while the title tag targets "Reusable Shopping Bags". Product title + ProductGroup JSON-LD name = "Nanobag - US"; variants = "Nanobag - US - Standard / Black". AI answers will literally cite "Nanobag - US".

Fix
Customer-facing names ("Nanobag — Reusable Pocket Tote"); market designation in tags/metafields only. H1 = product title; variant as subtitle span.
HighOn-PageH1 hygiene: promo banner is the first of 3–4 homepage H1s

Evidence
Homepage H1s: "Buy More and Unlock Free Gifts + Free Shipping", "As seen on", "Nanobag and our Quest…". The actual value proposition ("Extreme practicality…") is not an H1, and no H1 is visible above the fold.

Fix
Make the hero headline the single keyword-bearing H1; demote promo/press headings to H2.
HighContent / E-E-A-TNo About page — founder/entity story 404s

Evidence
/pages/about-us and /pages/about → 404. Founder story (Ursus Negenborn & Rune Kippervik) exists only as a homepage section. Post-Dec-2025 core update weighs entity pages heavily for e-commerce.

Fix
400+ word About page: founders, Tiptop Things Limited, manufacturing, tree-planting program. Link in footer/nav; supports blog bylines.
HighContent / IndexationLive placeholder text + stale "Winter Sale" page indexable & in sitemap

Evidence
/collections/products shows "Tagline / Example heading / Give customers details about the banner image(s)…", no meta description. /pages/page = stale Winter Sale LP (it's June); /pages/home duplicates homepage intent. All 200 + self-canonical, in all 15 page sitemaps.

Fix
Complete or remove the placeholder section + add intro/meta; seo.hidden/noindex the ad landing pages or consolidate them.
HighSchema / MerchantOffers missing shippingDetails, return policy, priceValidUntil, itemCondition

Evidence
Every Offer in both ProductGroups carries only price/priceCurrency/availability/url. returnPolicyCountry required since March 2025 for merchant listings.

Fix
Configure org-level shipping & return policies in Search Console (available without Merchant Center since Nov 2025) or in Merchant Center — covers all products, zero theme edits.
HighPerformance / UXHero renders as a blank grey block for the first seconds

Evidence
At ~1.2s the mobile hero area is empty with only the "Nomads Nation 2025" badge floating on nothing; the image appears ~5s+. Space is reserved (no CLS) but it reads as broken and inflates LCP.

Fix
Hero poster eager + fetchpriority="high" + preload hint; LQIP or background color matching the photo.
MediumOn-PageTitle template doubles the brand: "| Nanobag – Nanobag Official Store"

Evidence
Homepage title 73 chars with brand twice; daypack title 97 chars, keyword-listy, identical across two product URLs, doesn't describe a daypack.

Fix
Suffix → "| Nanobag"; unique ≤60-char titles per product.
MediumSchemaBreadcrumb schema fires on collections only — none on products/articles

Evidence
snippets/breadcrumb-schema.liquid gated on page_type == 'collection'. Products and blog articles get no breadcrumb rich results.

Fix
Extend the snippet with product + article blocks (ready-to-paste Liquid in the .md report).
MediumSchemaArticle schema publisher malformed (wrong name, no logo, dates inverted)

Evidence
{{ article | structured_data }} at sections/main-article.liquid:338 emits publisher "Nanobag Official Store" with no logo, unlinked to #organization; dateModified precedes datePublished.

Fix
Replace with custom Article JSON-LD: "publisher": {"@id": "https://nanobag.com/#organization"}.
MediumContent / TrustRefund policy is Shopify boilerplate; "Free Returns" claim unbacked; FAQ thin with typos

Evidence
Policy mentions "downloadable software products"; cart promises "30 Days Free Returns" the policy never states. FAQ = 376 words (gate 800), "Don't hestitate", sitewide footer "Cookie Decleration".

Fix
Rewrite policy for the actual product, reconcile free-returns claim, expand FAQ (sizing, capacity, warranty, per-market shipping), fix typos.
MediumE-E-A-TPress logos & impact claims link to nothing

Evidence
BuzzFeed/Forbes/Wired/Yanko "As seen on" logos unlinked; "1 tree planted per bag" (Eden People + Planet) unlinked; "LOVED BY 200,000+ CUSTOMERS" unsourced. No third-party material certifications (OEKO-TEX, GRS, bluesign) anywhere.

Fix
Link logos to actual coverage, link the Eden partnership, anchor the customer count to review data; pursue fabric certification or a citable load test for the 66 lb claim.
MediumImagesImages: 46/80 empty alt, PNG-heavy (2 WebP), missing dimensions, oversized LCP image

Evidence
56 PNG vs 2 WebP on home; 32–36 imgs/page missing width/height (CLS risk); product LCP image fetched at width=1850 (138KB) on a 412px viewport (~1.7× oversized); several alts read "Load video:".

Fix
Add format=webp to Shopify CDN URLs, width/height on theme image snippets, fix the sizes attribute on the main product image, alt text for non-decorative images.
MediumAI / GEONo citation-shaped content: promo banners are the first paragraphs; comparison table is div-soup

Evidence
First extractable <p> on every page = "Free Shipping on Orders 3+ Bags". Avg paragraph 23 words; ~1 passage site-wide in citation range; zero question headings outside FAQ; "Nanobag Comparison Table" has 0 <table> elements in 2.7MB HTML. Reddit r/onebag already hosts "Nanobag vs Sea to Summit vs Peak Design" threads.

Fix
40–60-word direct-answer block atop home/PDP ("Nanobag is an ultralight reusable bag that packs into a pocket-size pouch, weighs 0.8–1.15 oz, carries up to 66 lb"); rebuild comparison as semantic <table>; publish question-headed comparison articles mirroring the Reddit demand.
MediumSitemapSitemap pollution: JS-redirect page, duplicate DK entries, meaningless lastmod

Evidence
/pages/go-nanobag-eu ("Redirecting you…", no title) in all 15 page sitemaps; nanobag-eu listed twice in da-dk/en-dk product sitemaps; an app bumps all product lastmod daily (all 13 identical timestamps) so Google can't prioritize recrawl.

Fix
seo.hidden = 1 on the redirect page; check nanobag-eu's market/catalog publications; identify the app rewriting products daily.
MediumUX / MobilePDP gallery pagination dots are 6×6px tap targets

Evidence
Ten "Go to item" buttons measure 6×6px; reviews link only 22px tall. Minimum 24px, recommended 44–48px.

Fix
Pad the button hit area to ≥24px (visual dot can stay small) or switch to swipe + thumbnail strip.
LowTechnicalTrailing-slash URLs return 200 (canonicals mitigate)

Note
/de-de/ and /products/…/ serve 200 without redirecting; canonicals consistently point to non-slash versions. Optional 301 normalization; keep internal links slash-free.

LowTechnicalhttp://www → 2-hop redirect chain

Note
http://www → https://www → https://apex. Platform-typical, negligible.

LowSecurityHSTS weak (~91 days, no preload); missing Referrer-Policy / Permissions-Policy

Note
Largely platform-constrained on Shopify; raise via Cloudflare zone settings if DNS-proxied. Positives: x-frame-options DENY, nosniff, clean 301s.

LowTrackingDead pixels on every page: bat.bing.com + lantern.roeye.com both fail

Note
Both render naturalWidth=0 on every capture — failed requests on the critical path, consistent with the known fragmented tracking stack. Remove or repair in GTM/theme.

LowA11yHidden duplicate Add-to-cart button (0×0) + "ShopShop" nav label

Note
Inactive form button visible to screen readers; duplicated nav text. hidden/display:none the dead button; aria-hidden the decorative copy.

LowAI / GEOllms-full.txt is a byte-identical alias; llms.txt lacks deep links

Note
Add canonical product URLs per model, FAQ/blog links, materials detail (diamond ripstop, 0.05mm); make llms-full.txt genuinely expanded.

LowContentHomepage testimonials are first-name-only despite 612+ verifiable reviews

Note
"— Simon", "— Leanna" with no verification, while Judge.me holds 612 verified reviews. Swap in Judge.me-sourced verified reviews.

LowContentBlog nits: heading hierarchy, title/H1 mismatch, one post under word gate

Note
One H3 amid H2 siblings; "10 Simple Habits" vs H1 "10 Daily Habits"; one post 1,326 words vs 1,500 gate; blog index H1 is just "Blogs".

LowTechnicalIndexNow not implemented

Note
Optional — Bing/Yandex/Naver freshness. Third-party app or Cloudflare Worker if desired.

Not Verified This Run

CrUX field data — PSI API quota exhausted; performance findings are lab-only (Playwright, Lighthouse-style throttling). Re-run with an API key; the critical unknown is field INP.
Search Console index coverage / whether duplicate products actually rank.
Full 14-market hreflang reciprocity matrix (spot-checked de-de; Shopify auto-generates, low risk).
EU consent-banner obstruction (tested from non-EU vantage; re-check from an EU IP).
Judge.me client-side JSON-LD injection (static HTML had none; would partially mitigate the review-schema finding).