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. |
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).
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 |