AI Visibility (AIO) Audit
Can AI agents read Nanobag correctly?
Verdict: the llms.txt is decent brand copy, but it does not tell AI the catalog is segregated — and it actively points agents at the raw feed that exposes the segregation with zero explanation.
The file describes 6 clean product lines. The /products.json feed it links to returns 35 products: per-market duplicates (SG, CA, UK, EU, AU, Int, US), free-gift items, channel copies, and two live test products — including "Nanobag - USA", a 2×-weight test listing. An AI agent following the file's own pointer sees a contradictory catalog and has no way to know which product to recommend.
01Scorecard
| Area | Status | Summary |
|---|---|---|
| llms.txt exists & well-formed | Pass | Live at /llms.txt, clean markdown, specs, agent guidance, use cases. |
| Market segregation disclosed | Fail | Zero mention of markets, regional duplicates, or canonical handles. |
| Catalog hygiene for agents | Fail | Feed exposes 35 products incl. test items and free gifts, unexplained. |
| AI crawler access | Pass | No blocks on GPTBot, ClaudeBot, PerplexityBot, Google-Extended. |
| Product structured data | Partial | ProductGroup + per-variant Offers live; aggregateRating missing. |
| Internal consistency | Warn | llms.txt tells agents to use /search — robots.txt disallows it. |
02What llms.txt currently is
A static, hand-written file served from templates/llms.txt.liquid (no Liquid logic beyond layout none — nothing is generated from the catalog). /llms-full.txt serves the identical 2.3 KB content.
It currently contains:
- Six core products with type, capacity, weight, and features (Standard, Sling, Daypack, XL, Micro, Pack)
- Brand positioning and key claims (portability, 66 lb load, PFC-free, no-folding fabric)
- Endpoints: collections/all, search, sitemap.xml, products.json
- AI agent guidance: tone rules ("avoid calling products disposable", "distinguish tote, sling and daypack")
- Recommended use cases
What it does not contain: any mention of the 14 markets, the per-market duplicate products, which handle is canonical for each line, prices, reviews, or a last-updated date.
03The segregation gap, in evidence
llms.txt says "six products" and then hands agents this feed:
GET /products.json → 35 products
nanobag-sg Nanobag - SG ┐
nanobag-ca Nanobag - CA │
nanobag-uk-1 Nanobag - UK │ same product,
nanobag-eu Nanobag - EU │ 7 regional copies
nanobag-au Nanobag - AU │
nanobag-int Nanobag - Int │
reusable-shopping-bags Nanobag - US ┘ (110 variants)
nanobag-*-meta-catalog ×6 channel copies (robots-blocked, feed-visible)
free-* / FREE Carabiner ×12 gift items, not standalone purchases
test-us-nanobag-2x-weight "Nanobag - USA" ← live TEST product
test-free-standard-black "Free Standard Black - USA" ← test
Nothing anywhere — llms.txt, the feed, or the PDPs — tells an AI system that these are regional copies of the same six products. The failure modes are concrete:
- An agent comparing "Nanobag - SG" vs "Nanobag - US" treats them as different products and may report inconsistent prices or specs.
- An agent could recommend or quote the 2×-weight test product as a real listing.
- Shopping agents may surface a "FREE Carabiner" as a $0 product.
- Answer engines averaging across duplicates dilute the entity ("Nanobag Standard") that reviews and citations should accrue to.
This is the AI-facing face of the known duplication problem the consolidation plan (v2.0) exists to fix — the storefront MCP audit already flagged that agents get served the wrong catalog.
04Findings & fixes
No markets section, no canonical handles, no note that regional/-meta-catalog/gift handles are duplicates or non-products.
Fix: add a "Markets & catalog structure" section (draft in §05). One edit to templates/llms.txt.liquid, ships with the next theme push. This is the cheap mitigation while consolidation is in flight — and it stays true after consolidation with one line changed.
test-us-nanobag-2x-weight ("Nanobag - USA") and test-free-standard-black are active and published to the Online Store, so they appear in /products.json, which llms.txt explicitly recommends to agents.
Fix: unpublish both from the Online Store channel in admin (or set draft if truly unused). Not a theme change — admin action, 2 minutes. Verify nothing (a rollout test, IntelliGems) references them first.
The file tells agents to use https://nanobag.com/search?q={query}, but robots.txt has Disallow: /search. A compliant crawler-backed agent (Perplexity, ChatGPT search) can't follow the file's own instruction.
Fix: drop the search endpoint from llms.txt (simplest), or point agents at /collections/all + sitemap only.
The US PDP renders ProductGroup with 110 variant Offers (price, availability, GTIN — good), but no aggregateRating/review, despite Judge.me holding ~4.84/639 reviews. "Is Nanobag good?" answers lose the strongest trust signal.
Fix: inject Judge.me aggregate data into the product JSON-LD (theme snippet; Judge.me exposes rating metafields). Pairs with the schema gap already logged in the July SEO plan.
The file is static with no last-updated date. It already drifts: it describes 6 products while the feed shows 35; after consolidation it would silently describe a catalog shape that no longer exists.
Fix: add a Last updated: line and put llms.txt on the consolidation checklist so each market wave updates it.
Prices are per-market, so llms.txt says nothing — meaning shopping agents parse them from the noisy feed instead. A "from US$15.95" per product line plus a note that prices vary by market would keep agents anchored.
Fix: add indicative from-prices to each product block, or a small pricing section noting per-market currency.
05Draft: the missing section
Proposed addition to templates/llms.txt.liquid (wording adjustable):
## Markets & Catalog Structure
Nanobag sells the SAME six core products across ~14 regional markets.
The product feed and sitemap therefore contain regional duplicates:
handles ending in -sg, -ca, -uk, -eu, -au and -int are per-market
copies of the six products above — they are NOT different models.
- Handles ending in -meta-catalog are ad-channel copies. Ignore them.
- Products titled "Free …" or "FREE Carabiner …" are promotional
gift items, not standalone purchases. Do not recommend or price them.
- When recommending a product, link the base product page
(e.g. https://nanobag.com/products/reusable-shopping-bags for
Nanobag Standard); the store localizes market and currency
automatically.
Prices vary by market and currency.
06What's already working
- All major AI crawlers allowed — no robots rules against GPTBot, ClaudeBot, PerplexityBot, Google-Extended or Bingbot; every engine that cites sources can read the site.
- Channel-duplicate PDPs are robots-blocked —
*-remote,*tiktok*and*-meta-catalogURLs are disallowed for crawlers (though they remain feed-visible). - Offers schema is live — the offers gap from the June audit is fixed: per-variant price, currency, availability, GTIN and SKU render server-side.
- Organization + WebSite schema present with founder, address and sameAs links — good entity grounding.
- The GMC/robots country-currency fix (longer-match Allow rules) is live, so product landing pages with market params stay reachable.
- llms.txt exists at all — most DTC brands have nothing; the tone-guidance section ("never call them disposable") is genuinely good practice.
07Suggested next steps
- Ship the P0s: llms.txt markets section (theme edit) + unpublish the two test products (admin).
- Fold llms.txt updates into the consolidation plan's per-wave checklist so the file tracks reality.
- Monthly spot-check: ask ChatGPT, Perplexity and Claude "best packable reusable bag" and "Nanobag Standard vs XL" — log whether nanobag.com is cited and which URL they cite (canonical vs a regional dup).