WebVitalist Deep Audit: northwind-outdoors.example
Overall score: 65/100. Northwind Outdoors has a credible story (guides who test every product, a 60-day trail guarantee) but the homepage leads with a generic “Gear up for the trail” and hides the guarantee below the fold. Category pages share one meta description, the product reached via a collection URL has no canonical, and nine third-party app scripts push mobile LCP to 3.9 s. Fixing the headline, the shared metadata and the app bloat are the highest-leverage changes.
https://northwind-outdoors.example/ · audited 1 September 2026 at 09:30 UTC
Platform
Shopify (high confidence).
- Shopify: cdn.shopify.com
- Shopify: x-shopid
- Cloudflare: server: cloudflare
Scorecard
| Area | Score | Notes |
|---|---|---|
| Technical SEO | 89/100 | 1 critical and 2 lesser findings. Across 15 pages: 4 failures and 41 warnings. |
| Security Pass | 48/100 | 5 high-priority and 2 lesser findings. Passive checks only — not a pentest. |
| Performance | 47/100 | Lighthouse mobile. LCP 3,850 ms, CLS 0.18. |
| Accessibility | 86/100 | 5 Lighthouse checks failing. |
| Copy & messaging | 64/100 | Solid copy on product and about pages; the homepage undersells the differentiators. |
| UX & conversion | 58/100 | Clear navigation, but the mobile experience is slowed by apps and a few accessibility gaps. |
| AI visibility | 97/100 | 0 critical and 1 lesser findings. |
Site crawl
This Deep Audit crawled multiple internal pages (15). 15 pages · 1 broken · 2 duplicate titles · 2 thin.
Site-wide issues
- broken-page (high): HTTP 404 (https://northwind-outdoors.example/products/alpine-lantern)
- thin-page (medium): Thin content (~54 words) (https://northwind-outdoors.example/pages/size-guide)
- thin-page (medium): Thin content (~42 words) (https://northwind-outdoors.example/products/alpine-lantern)
- redirect-chain (medium): 3 redirects (https://northwind-outdoors.example/collections/tents-and-shelters)
- duplicate-title (medium): Duplicate title: “ridgeline 2p tent – northwind outdoors” (https://northwind-outdoors.example/products/ridgeline-2p-tent, https://northwind-outdoors.example/collections/tents/products/ridgeline-2p-tent)
- duplicate-title (medium): Duplicate title: “tents – northwind outdoors” (https://northwind-outdoors.example/collections/tents, https://northwind-outdoors.example/collections/tents-and-shelters)
- duplicate-description (low): Duplicate meta description (lightweight backpacking tents and roomy…) (https://northwind-outdoors.example/collections/tents, https://northwind-outdoors.example/collections/sleeping-bags, https://northwind-outdoors.example/collections/all, https://northwind-outdoors.example/collections/tents-and-shelters)
Per-page scores
1. Technical SEO
Score 89/100. 1 critical and 2 lesser findings. Across 15 pages: 4 failures and 41 warnings.
| Check | Result | |
|---|---|---|
| ✅ | HTTPS | The page is served over HTTPS. |
| ⚠️ | Page title | The title is 92 characters: “Northwind Outdoors – Tents, Sleeping Bags, Backpacks & Camping Gear | Free Shipping Over $75”. |
| ✅ | Meta description | 136 characters. |
| ✅ | H1 heading | “Gear up for the trail”. |
| ✅ | Heading structure | 5 H2 and 4 H3. |
| ✅ | Canonical | https://northwind-outdoors.example/ |
| ✅ | Indexing | The page can be indexed. |
| ✅ | robots.txt | robots.txt exists. |
| ✅ | Sitemap | Sitemap found: https://northwind-outdoors.example/sitemap.xml. |
| ✅ | Mobile viewport | width=device-width, initial-scale=1 |
| ✅ | Language (html lang) | lang="en". |
| ❌ | Image alt text | 3 of 9 images are missing an alt attribute. |
| ✅ | Structured data | JSON-LD: Organization, WebSite. |
| ⚠️ | Social sharing | Incomplete Open Graph tags. |
| ✅ | Internal links | 20 internal and 1 external links. |
| ✅ | Content length | ~224 words. |
| ✅ | HTML size | 7 kB of HTML. |
| ✅ | Server response time | 612 ms. |
| ✅ | Favicon | A favicon is declared. |
How to fix it
- Page title: Shorten the title to under 60 characters so it is not truncated in search results.
- Image alt text: Give meaningful images descriptive alt text and decorative images alt="".
- Social sharing: Set and test og:title, og:description and og:image (1200×630).
AI visibility
Score 97/100. 0 critical and 1 lesser findings.
This is not part of the overall score.
| Check | Result | |
|---|---|---|
| ✅ | AI search crawlers | All listed crawlers are allowed by robots.txt. |
| ✅ | AI training crawlers | All listed crawlers are allowed by robots.txt. |
| ✅ | Snippet controls | No nosnippet or max-snippet:0 restriction found. |
| ✅ | Readable without JavaScript | 224 words are readable in the HTML. |
| ✅ | Answer near the top | A clear paragraph follows the H1 near the top. |
| ✅ | Business details (JSON-LD) | Organization has the required business details. |
| ✅ | JSON-LD syntax | All JSON-LD blocks parse as JSON. |
| ℹ️ | FAQ markup | No FAQPage markup found. |
| ⚠️ | llms.txt | No /llms.txt found. |
How to fix it
- llms.txt: Publish /llms.txt: a short Markdown file with your business name as a # heading, a one-line summary, and links to your key pages (see llmstxt.org). It is a proposed standard: some AI tools read it, the big search engines do not promise to.
| Crawler | Access | Rule |
|---|---|---|
| OAI-SearchBot | Allowed | Allow: / |
| ChatGPT-User | Allowed | Allow: / |
| PerplexityBot | Allowed | Allow: / |
| GPTBot | Allowed | Allow: / |
| ClaudeBot | Allowed | Allow: / |
| Google-Extended | Allowed | Allow: / |
| CCBot | Allowed | Allow: / |
Search basics (from the technical checks): ⚠️ Page title; ✅ Meta description; ✅ H1 heading; ✅ Canonical; ✅ Indexing; ✅ Sitemap. These are not scored again.
We read robots.txt and your HTML only. Firewall or CDN bot settings (for example Cloudflare's AI crawler controls) can still block AI crawlers; check them in your hosting dashboard.
We do not re-fetch pages with AI crawler user-agents. This would add up to seven requests, impersonate other companies’ crawlers, and can give false failures because CDNs may verify real bots by IP.
AI visibility scoring methodology
Security Pass
Score 48/100. 5 high-priority and 2 lesser findings. Passive checks only — not a pentest.
Passive checks on the public URL only: response headers, cookie flags, TLS, a short allowlist of leak paths, and obvious technology disclosure. This is not a penetration test — we do not scan ports, submit forms, authenticate, or send exploit payloads.
| Check | Severity | Result | |
|---|---|---|---|
| ❌ | HSTS | high | No Strict-Transport-Security header on the final response. |
| ❌ | Content-Security-Policy | high | No Content-Security-Policy header. |
| ❌ | Clickjacking protection | high | No X-Frame-Options header and no CSP frame-ancestors directive. |
| ❌ | Referrer-Policy | low | No Referrer-Policy header. |
| ⚠️ | Permissions-Policy | low | No Permissions-Policy header. |
| ⚠️ | X-Content-Type-Options | low | X-Content-Type-Options: nosniff is missing. |
| ❌ | Cookie flags | high | 1 cookie set. Secure missing on _shopify_s; HttpOnly missing on _shopify_s. |
| ✅ | HTTPS | – | The page is served over HTTPS. |
| ℹ️ | HTTP to HTTPS redirect | – | The audit started on HTTPS, so an HTTP landing-page redirect was not observed. |
| ✅ | Mixed content | – | No obvious http:// assets on the HTTPS page. |
| ✅ | Sensitive path exposure | – | Leak probes were skipped (fixture). Sensitive paths were not fetched. |
| ✅ | Technology disclosure | – | Server: cloudflare. |
Prioritised fixes
- HSTS (high): Send Strict-Transport-Security: max-age=31536000; includeSubDomains on every HTTPS response.
- Content-Security-Policy (high): Add a Content-Security-Policy that sets default-src (or script-src) to a tight allowlist. Start in Report-Only if you need to observe breakage first.
- Clickjacking protection (high): Send X-Frame-Options: DENY (or SAMEORIGIN), or set Content-Security-Policy frame-ancestors 'none'.
- Cookie flags (high): Set Secure and HttpOnly on every cookie that is not meant to be read by JavaScript. SameSite=None requires Secure.
- Referrer-Policy (low): Send Referrer-Policy: strict-origin-when-cross-origin (or stricter).
- Permissions-Policy (low): Send Permissions-Policy to disable unused browser features (camera, microphone, geolocation, payment, …).
- X-Content-Type-Options (low): Send X-Content-Type-Options: nosniff on every response.
2. Performance
Lighthouse (mobile) performance 47/100, best practices 79/100, Lighthouse SEO 92/100.
| Lab metric | Value | Target |
|---|---|---|
| Largest Contentful Paint | 3,850 ms | < 2,500 ms |
| First Contentful Paint | 2,140 ms | < 1,800 ms |
| Total Blocking Time | 640 ms | < 200 ms |
| Cumulative Layout Shift | 0.18 | < 0.1 |
| Speed Index | 5,230 ms | < 3,400 ms |
| Time to first byte (TTFB) | 612 ms | < 800 ms |
| Total page weight | 3.0 MB | < 1.5 MB |
Real-user data (Chrome UX Report, last 28 days, this URL): overall AVERAGE. LCP 3100 ms (AVERAGE), INP 210 ms (AVERAGE), CLS 0.12 (AVERAGE), TTFB 800 ms (AVERAGE).
Biggest opportunities
- Reduce unused JavaScript — ~1,250 ms faster (9 resources)
- Properly size images — ~900 ms faster (6 resources)
- Eliminate render-blocking resources — ~620 ms faster (4 resources)
- Serve images in next-gen formats — ~480 ms faster (5 resources)
- Reduce initial server response time — ~310 ms faster
3. Accessibility
Lighthouse accessibility 86/100.
- Background and foreground colors do not have a sufficient contrast ratio (14 elements)
- Image elements do not have [alt] attributes (3 elements)
- Links do not have a discernible name (3 elements)
- Form elements do not have associated labels (1 elements)
- Buttons do not have an accessible name (1 elements)
4. Copy & messaging
Score 64/100. Solid copy on product and about pages; the homepage undersells the differentiators.
- Headline says nothing a competitor could not say — impact: High, effort: Low
- Evidence: H1: “Gear up for the trail”
- Why it matters: The first three seconds decide whether a cold visitor scrolls. The real differentiators (team-tested gear, 60-day trail guarantee, ships in one day) appear only in the “Why Northwind” section far below the fold.
- Recommendation: Lead with the promise: “Camping gear tested by guides – try it for 60 days on the trail.” Move one line of proof (12,000 campers, 4.8★) directly under it.
- Homepage title is 92 characters and keyword-stuffed — impact: Medium, effort: Low
- Evidence: <title>Northwind Outdoors – Tents, Sleeping Bags, Backpacks & Camping Gear | Free Shipping Over $75</title>
- Why it matters: Google truncates titles around 60 characters; the shipping offer and half the categories are never shown, and the brand is all a searcher sees.
- Recommendation: Use “Northwind Outdoors: Trail-Tested Camping Gear, 60-Day Guarantee” (58 characters) and keep the shipping offer for the meta description.
- Three collection pages share one meta description — impact: Medium, effort: Low
- Evidence: Tents, Sleeping bags and All gear all use “Lightweight backpacking tents and roomy camping tents. Free shipping on orders over $75.”
- Why it matters: Search snippets for sleeping bags talk about tents, which lowers click-through and signals templated content.
- Recommendation: Write one description per collection in Shopify admin (Collections → Search engine listing), naming the category and one concrete reason to buy.
Ready-to-paste rewrites
<title>: Northwind Outdoors: Trail-Tested Camping Gear, 60-Day Guarantee
Meta description: Tents, sleeping bags and packs tested by mountain guides. Free US shipping over $75, ships in one business day, and a 60-day trail guarantee on everything.
H1: Camping gear tested by guides. Try it for 60 days on the trail.
Sub-heading: Every tent, bag and pack we sell has been carried and slept in by our team in Oregon. Ships within one business day.
Primary CTA: Shop trail-tested gear
5. UX & conversion
Score 58/100. Clear navigation, but the mobile experience is slowed by apps and a few accessibility gaps.
- Nine third-party scripts load before the hero image — impact: High, effort: Medium
- Evidence: Klaviyo, Judge.me, Mailchimp, Meta Pixel, Google Tag Manager and a wishlist app load synchronously in <head>; Lighthouse LCP 3,850 ms, TBT 640 ms
- Why it matters: On mobile, every second of LCP beyond 2.5 s measurably reduces add-to-cart rate, and the store is already in the “needs improvement” band in real-user data.
- Recommendation: Remove apps you no longer use (check Settings → Apps and sales channels), defer the rest with
deferor Shopify’s customer-events pixels, and addfetchpriority="high"plus explicit dimensions to the hero image.
- Cart button and newsletter field have no accessible name — impact: Medium, effort: Low
- Evidence: <button class="header__icon header__icon--cart"> contains only an SVG; <input type="email" name="contact[email]"> has a placeholder but no label
- Why it matters: Screen-reader users hear “button” with no purpose, and placeholder-only fields fail WCAG 1.3.1 and disappear as soon as someone starts typing.
- Recommendation: Add aria-label="Cart" to the icon button and a visually hidden <label> to the newsletter input; both are one-line changes in header.liquid and footer.liquid.
- Homepage links to a product that returns 404 — impact: Medium, effort: Low
- Evidence: “New this season” → /products/alpine-lantern → HTTP 404
- Why it matters: A dead link in the merchandising grid wastes a featured slot and erodes trust at the moment a visitor shows intent.
- Recommendation: Redirect /products/alpine-lantern to the replacement product (Online Store → Navigation → URL redirects) and remove the card from the featured collection.
6. 30-day action plan
Week 1 – quick wins
- Replace the homepage H1, sub-heading and primary CTA with the rewrites above
- Shorten the homepage title to under 60 characters and write unique collection descriptions
- Add a 301 redirect for /products/alpine-lantern and remove the dead card from the homepage
- Add aria-label to the cart button and a label to the newsletter field
Week 2
- Audit installed apps; uninstall unused ones and defer the remaining scripts
- Restore the canonical tag on collection-scoped product URLs (theme.liquid)
- Add alt text to the three untagged homepage images and set width/height on the hero
- Fix the three-hop redirect from /collections/tents-and-shelters to a single 301
Weeks 3–4
- Convert hero and product images to WebP/AVIF via Shopify image_url filters
- Expand the size guide beyond 150 words with fit advice per product line
- Add a review snippet (rating + count) to the homepage hero
- Re-run the Deep Audit and compare scores side by side
Appendix: raw signals
| Signal | Value |
|---|---|
| Final URL | https://northwind-outdoors.example/ |
| HTTP status | 200 |
| Title | Northwind Outdoors – Tents, Sleeping Bags, Backpacks & Camping Gear | Free Shipping Over $75 (92 characters) |
| Meta description | 136 characters |
| H1 / H2 / H3 | 1 / 5 / 4 |
| Visible words | 224 |
| Images (missing alt) | 9 (3) |
| Internal / external links | 20 / 1 |
| Forms | 1 |
| Structured data | Organization, WebSite |
| Canonical | https://northwind-outdoors.example/ |
| robots.txt / sitemap | yes / yes |
| Language | en |
| Analysis model | webvitalist-sample-fixture |