SEORechecknorthwind-shoes.exampleFull report
northwind-shoes.example

Sample report · fictional website

Northwind Shoes and its data are invented to show exactly what you receive. Request your own analysis

Full SEO report · July 21, 2026

northwind-shoes.example

SEO Health
  • 3
    Critical
  • 6
    Important
  • 5
    Opportunities

01 · Executive summary

A solid store that Google can’t fully see

Northwind Shoes has what many small stores lack: real product knowledge, two stores with a free fitting service and clean technical basics. What holds the site back is that Google is being told the wrong things: a setting in the SEO app says all 14 categories are copies of the homepage, and one line in robots.txt hides both store pages. On phones, product photos take almost 6 seconds to appear. None of this is expensive: the three critical fixes take roughly 2–3 developer days.

What already works

  • HTTPS everywhere; http:// and www redirect to the main address in one 301 step.
  • All 48 detailed pages return 200 and are indexable (no stray noindex).
  • Every page has a unique H1; product text is in the HTML, not injected by JavaScript.
  • Real, specific product descriptions written by your staff — not copied from manufacturers.
  • Free in-store gait analysis and free 30-day returns: strong, rare selling points (they only need to be visible as text).
  • Desktop speed is good: product page LCP 1.4 s in the lab.

Do these first

  1. Step 1 · F01Category canonical tags point to the homepageStore admin (setting) + developer (check theme) · 1–2 hours
  2. Step 2 · F03Store pages blocked in robots.txtDeveloper or store admin · 15–30 minutes
  3. Step 3 · F02Slow mobile product pages (LCP 5.8 s)Front-end developer · 1–2 days

This is the order of work, not a promise of rankings. We recommend a recheck 30–60 days after the fixes.

02 · Score & categories

61 out of 100 — what the number means

The SEORecheck index summarises the checks we could measure on the pages we analysed. It is our diagnostic score for this sample, not a Google score and not a ranking forecast. Content, local and AI search are assessed in words, not in the number.

14 findings: 3 critical, 6 important and 5 opportunities. 10 are confirmed issues with evidence, 4 are recommendations.

Category scores (0–100) for 48 pages, July 21, 2026. Weights in brackets; the weighted average is the index of 61. Speed uses the median of 3 mobile lab runs.

03 · Priority actions

What to fix first

All 14 findings, ordered by expected impact on search visibility and effort to implement. Select a finding to jump to its cause, fix and check.

All findings in priority order
#FindingScopeWho · timeBenefit
F01Category canonical tags point to the homepagecriticalEffort: low42 / 42Store admin (setting) + developer (check theme)1–2 hoursIndexing, category visibility
F02Slow mobile product pages (LCP 5.8 s)criticalEffort: medium24 / 24Front-end developer1–2 daysSpeed, conversion
F03Store pages blocked in robots.txtcriticalEffort: low3 / 3Developer or store admin15–30 minutesLocal visibility, store visits
F04Duplicate titles on colour-variant pagesimportantEffort: medium19 / 24Store admin + developer1 day (template) + 2–3 hours (content)Rankings for product searches
F0517 internal links return 404importantEffort: low9 / 48Store admin1–2 hoursConversion, crawl efficiency
F06Product schema without price or stockimportantEffort: low24 / 24Developer2–4 hoursRicher results, click-through
F07Categories without buying adviceimportantEffort: high12 / 14Owner or staff writer (fitting specialists)2–3 hours per categoryRankings for buying searches
F08Outdated XML sitemapimportantEffort: low63 / 412Developer1 hourFaster indexing of new products
F09Tiny size buttons, unnamed icon buttonsimportantEffort: low48 / 48Front-end developer2–4 hoursAccessibility, fewer wrong-size orders
F10Missing meta descriptionsopportunityEffort: low12 / 24Owner or content manager1–2 hoursClick-through from results
F11Layout shift from reviews widget (CLS 0.18)opportunityEffort: low14 / 14Front-end developer1 hourSpeed, usability
F12Guides without author, date or product linksopportunityEffort: low5 / 5Owner + developer (template)1–2 hoursTrust (E-E-A-T), internal links
F13No store schema, inconsistent phone formatopportunityEffort: low2 / 2Developer + owner (confirms hours)2 hoursLocal visibility
F14Returns and size guide only as imagesopportunityEffort: low2 / 2Owner + developer2–3 hoursAI answers, fewer support questions
  1. F01 critical · low effort
    Category canonical tags point to the homepage

    42 of 42 category URLs · 1–2 hours

  2. F02 critical · medium effort
    Slow mobile product pages (LCP 5.8 s)

    24 of 24 product pages (one shared template) · 1–2 days

  3. F03 critical · low effort
    Store pages blocked in robots.txt

    3 of 3 store URLs · 15–30 minutes

  4. F04 important · medium effort
    Duplicate titles on colour-variant pages

    19 of 24 product pages · 1 day (template) + 2–3 hours (content)

  5. F05 important · low effort
    17 internal links return 404

    9 of 48 pages · 1–2 hours

  6. F06 important · low effort
    Product schema without price or stock

    24 of 24 product pages · 2–4 hours

  7. F07 important · high effort
    Categories without buying advice

    12 of 14 category pages · 2–3 hours per category

  8. F08 important · low effort
    Outdated XML sitemap

    63 of 412 sitemap URLs · 1 hour

  9. F09 important · low effort
    Tiny size buttons, unnamed icon buttons

    48 of 48 pages · 2–4 hours

  10. F10 opportunity · low effort
    Missing meta descriptions

    12 of 24 product pages · 1–2 hours

  11. F11 opportunity · low effort
    Layout shift from reviews widget (CLS 0.18)

    14 of 14 category pages (one template) · 1 hour

  12. F12 opportunity · low effort
    Guides without author, date or product links

    5 of 5 articles · 1–2 hours

  13. F13 opportunity · low effort
    No store schema, inconsistent phone format

    2 of 2 store pages · 2 hours

  14. F14 opportunity · low effort
    Returns and size guide only as images

    2 of 2 policy pages · 2–3 hours

Share of checked pages or URLs affected by each finding (affected ÷ checked). Colour shows severity.

04 · Indexing & crawling

Can Google find and keep your pages?

We checked canonical tags, robots.txt, the XML sitemap and HTTP status codes on every URL in the sample and every URL listed in the sitemap.

F01criticalConfirmed issue42 of 42 category URLs

Category pages tell Google the homepage is the “real” page

All 14 category pages in the sample, and all 28 of their paginated URLs listed in the sitemap, carry two canonical tags. The second one — which Google may treat as the deciding one — points to the homepage.

Evidence

/collections/womens-running

<link rel="canonical" href="https://northwind-shoes.example/collections/womens-running">

<link rel="canonical" href="https://northwind-shoes.example/"> ← added by SEO app

Why it matters
A canonical tag says “this is the main version of the page”. When a category names the homepage instead, Google can drop the category from results and show the homepage — or nothing — for searches like “women’s trail running shoes”. Categories are usually a store’s best landing pages for shopping searches.
Cause
The SEO app’s “Canonical URL” setting is set to “Site root” for all pages, and the theme also prints its own correct canonical, so every category ends up with two conflicting tags.
How to fix
  1. In the SEO app, switch “Canonical URL” to “Page URL” — or turn its canonical output off and keep the theme’s tag.
  2. Make sure each page has exactly one canonical tag pointing to its own URL; paginated pages (?page=2) point to themselves, not to page 1.
  3. In Google Search Console, request indexing for the 14 main categories once the fix is live.
Who · effort
Store admin (setting) + developer (check theme) · Low effort, 1–2 hours
How to verify
Open a category, press Ctrl+U and search for rel="canonical": exactly one result, with the page’s own URL. In Search Console → URL Inspection, “User-declared canonical” equals the inspected URL.
Show 42 affected category URLs
  • /collections/womens-running
  • /collections/mens-running
  • /collections/trail-running
  • /collections/walking-shoes
  • /collections/wide-fit
  • /collections/kids
  • /collections/sandals
  • /collections/boots
  • /collections/sneakers
  • /collections/work-shoes
  • /collections/insoles-socks
  • /collections/sale
  • /collections/new-arrivals
  • /collections/vegan
  • + 28 paginated URLs, e.g. /collections/womens-running?page=2 … ?page=4
F08importantConfirmed issue63 of 412 sitemap URLs

The sitemap lists 63 dead or redirected URLs and misses 38 new products

We requested all 412 URLs in sitemap.xml: 41 return 404 and 22 redirect. Meanwhile 38 products linked from “New arrivals” are not in the sitemap at all. Every entry has the same lastmod date: 2026-03-02.

Evidence

sitemap.xml · 412 URLs · lastmod 2026-03-02 on all entries

200 OK: 349 · 404: 41 · 301: 22

missing: 38 products from /collections/new-arrivals

Why it matters
The sitemap is your list of pages you want in Google. When a large share of it is dead, search engines trust it less, and new products are discovered later — often after the season they were bought for.
Cause
A static sitemap file uploaded in March overrides the platform’s automatic sitemap.
How to fix
  1. Delete the static sitemap.xml so the platform’s automatic sitemap is served.
  2. Confirm the automatic sitemap includes products, categories, store pages and guides.
  3. Resubmit the sitemap in Search Console and remove the old one.
Who · effort
Developer · Low effort, 1 hour
How to verify
Every URL in sitemap.xml returns 200; the 38 new-arrival products are listed; lastmod dates differ per page.
Show 63 affected sitemap URLs
  • /sitemap.xml
  • /products/cityglide-1-mens
  • /products/trailpace-gtx-2023
  • /collections/summer-2025
  • /pages/black-friday-2025
  • + 58 more non-200 URLs in actions.csv

05 · Speed & Core Web Vitals

How fast the store feels on a phone

Lab measurements with Lighthouse 13.5 (mobile: simulated slow 4G and 4× CPU slowdown, 3 runs per URL; desktop: 1 run). These are lab values, not real-visitor data.

Largest Contentful Paint (LCP): when the main content appears. Median of 3 mobile runs, 1 desktop run. The dashed line marks 2.5 s, Google’s “good” threshold.
Lighthouse lab measurements, median of runs
Page · device (runs)PerformanceLCPCLSTBT
Product · TrailPace GTXMobile (3) · /products/trailpace-gtx-womens395.8 s5.5–6.30.02610 ms
Category · Women’s runningMobile (3) · /collections/womens-running474.9 s4.6–5.20.18480 ms
HomepageMobile (3) · /554.1 s3.9–4.40.04390 ms
Product · TrailPace GTXDesktop (1) · /products/trailpace-gtx-womens881.4 s0.0190 ms
F02criticalConfirmed issue24 of 24 product pages (one shared template)

Product pages take 5.8 s to show the main photo on a phone

On the product page we measured, the main photo — the largest element on screen — appears after 5.8 s in the median of 3 mobile lab runs (5.5–6.3 s). The same page on desktop: 1.4 s. All 24 sampled product pages use the same template, image size and scripts.

Evidence

/products/trailpace-gtx-womens · mobile · 3 runs

LCP 5.8 s (5.5–6.3) · Performance 39 · TBT 610 ms

LCP element: <img loading="lazy" src="…/trailpace-moss.png"> 1.9 MB, 3000×3000 px

Why it matters
Shoe shoppers compare several stores on their phone. A product photo that takes almost 6 seconds to appear makes the page feel broken, and many people go back to the results. Page experience is one of Google’s signals, although speed alone never guarantees rankings.
Cause
The main product photo is a 1.9 MB PNG (3000×3000 px) sent to 412 px wide screens, with no srcset. It is marked loading="lazy", so the browser deliberately fetches it late. Three font files block the first render, and the reviews widget adds 410 KB of JavaScript before the page is usable.
How to fix
  1. Remove loading="lazy" from the first product image and add fetchpriority="high".
  2. Serve WebP/AVIF through the platform’s image CDN with a width parameter, plus srcset at 480, 960 and 1600 px.
  3. Preload the one font weight used above the fold, set font-display: swap, drop the two unused weights.
  4. Load the reviews widget when the reviews section scrolls into view.
Who · effort
Front-end developer · Medium effort, 1–2 days
How to verify
Repeat 3 mobile Lighthouse runs on the same URL: median LCP under 3.5 s as a first milestone, then 2.5 s or less; the product image transfers under 200 KB.
Show 24 affected product pages
  • /products/trailpace-gtx-womens
  • /products/trailpace-gtx-womens-moss
  • /products/trailpace-gtx-womens-slate
  • /products/trailpace-gtx-mens
  • /products/trailpace-gtx-mens-rust
  • /products/cityglide-2-womens
  • /products/cityglide-2-womens-sand
  • /products/cityglide-2-mens
  • /products/cityglide-2-mens-graphite
  • /products/harbor-walker-wide
  • /products/harbor-walker-wide-navy
  • /products/ridgeline-boot-womens
  • + 12 more product pages on the same template
F11opportunityConfirmed issue14 of 14 category pages (one template)

The reviews widget makes category pages jump while loading

On the category page we measured, layout shift (CLS) is 0.18 in the median of 3 mobile lab runs (0.16–0.21); the “good” threshold is 0.1. Star ratings are inserted under each product after the grid has rendered.

Evidence

/collections/womens-running · mobile · 3 runs

CLS 0.18 (0.16–0.21) · shifting element: .product-card__rating

Why it matters
When the grid jumps, shoppers tap the wrong product. It is a small but constant irritation on the pages where people browse the most.
Cause
The rating container has no reserved height, so each card grows when stars arrive.
How to fix
  1. Reserve the space: .product-card__rating { min-height: 20px }.
  2. Or render the star rating server-side with the product card.
Who · effort
Front-end developer · Low effort, 1 hour
How to verify
3 mobile Lighthouse runs on the category page: median CLS 0.1 or lower.
Show 14 affected category pages
  • /collections/womens-running
  • /collections/mens-running
  • /collections/trail-running
  • /collections/walking-shoes
  • /collections/wide-fit
  • /collections/kids
  • /collections/sandals
  • /collections/boots
  • /collections/sneakers
  • /collections/work-shoes
  • /collections/insoles-socks
  • /collections/sale
  • /collections/new-arrivals
  • /collections/vegan

06 · On-page SEO

What searchers see before they click

Titles, meta descriptions and headings on all 48 pages analysed in detail.

F04importantConfirmed issue19 of 24 product pages

Colour versions of a shoe compete with each other

19 of 24 sampled product URLs share their title and meta description with at least one other URL, because every colour is a separate product page with identical text.

Evidence

/products/trailpace-gtx-womens “TrailPace GTX Women’s | Northwind Shoes”

/products/trailpace-gtx-womens-moss “TrailPace GTX Women’s | Northwind Shoes”

/products/trailpace-gtx-womens-slate “TrailPace GTX Women’s | Northwind Shoes”

Why it matters
When several pages look identical, Google picks one and filters the others. You don’t choose which one wins, and links and reviews are split across copies instead of strengthening one page.
Cause
Colours were imported as separate products instead of variants of one product.
How to fix
  1. Preferred: merge colours into variants of one product with one URL, and 301-redirect the old colour URLs to it.
  2. If colours must stay separate: add the colour to the title, H1 and description (“TrailPace GTX Women’s — Moss Green”).
Who · effort
Store admin + developer · Medium effort, 1 day (template) + 2–3 hours (content)
How to verify
A crawl of all product URLs shows no duplicate <title> values; old colour URLs return a single 301 to the merged page.
Show 19 affected product pages
  • /products/trailpace-gtx-womens
  • /products/trailpace-gtx-womens-moss
  • /products/trailpace-gtx-womens-slate
  • /products/trailpace-gtx-mens-rust
  • /products/cityglide-2-womens-sand
  • /products/cityglide-2-mens-graphite
  • /products/harbor-walker-wide-navy
  • /products/ridgeline-boot-womens-oak
  • /products/ridgeline-boot-mens-char
  • /products/tempo-racer-3-volt
  • /products/cascade-sandal-clay
  • /products/stumptown-sneaker-white
  • /products/little-trekker-kids-blue
  • /products/trailpace-gtx-mens
  • /products/cityglide-2-womens
  • /products/cityglide-2-mens
  • /products/harbor-walker-wide
  • /products/ridgeline-boot-womens
  • /products/ridgeline-boot-mens
F10opportunityConfirmed issue12 of 24 product pages

12 product pages have no meta description

12 of 24 product pages have no meta description, so Google usually builds the snippet from the first text it finds — on these pages, the shipping banner “Free shipping on orders over $75”.

Evidence

/products/harbor-walker-wide

<meta name="description"> — not present

likely snippet: “Free shipping on orders over $75. Free returns within 30 days…”

Why it matters
The description is your chance to say why this shoe is worth a click: fit, use and a real benefit.
Cause
The description field is optional in the product editor and was skipped for newer products.
How to fix
  1. Write a unique 140–160 character description per product: who it’s for, one standout feature, price or offer.
  2. Example: “Harbor Walker Wide: extra-wide toe box, all-day cushioning for standing jobs. Free in-store fitting in Portland. Free 30-day returns.”
Who · effort
Owner or content manager · Low effort, 1–2 hours
How to verify
View source on each of the 12 pages: one meta description, unique, 140–160 characters.
Show 12 affected product pages
  • /products/trailpace-gtx-womens
  • /products/trailpace-gtx-mens
  • /products/cityglide-2-womens
  • /products/cityglide-2-mens
  • /products/harbor-walker-wide
  • /products/ridgeline-boot-womens
  • /products/ridgeline-boot-mens
  • /products/tempo-racer-3
  • /products/cascade-sandal
  • /products/stumptown-sneaker
  • /products/little-trekker-kids
  • /products/shift-pro-work-shoe

07 · Structured data

Price, stock and reviews in search results

JSON-LD found in the HTML of all 24 sampled product pages, validated against schema.org and Google’s documented requirements.

F06importantConfirmed issue24 of 24 product pages

Product markup is missing price, stock and reviews

All 24 product pages have Product JSON-LD with only name, image and brand. There is no offers block (price, currency, availability) and no rating, although every page shows 4.2–4.9 star reviews.

Evidence

{ "@type": "Product", "name": "TrailPace GTX Women’s",

"image": "…/trailpace.png", "brand": "Northwind" }

missing: offers.price · offers.priceCurrency · offers.availability

Why it matters
Without price and availability, product pages are not eligible for price and stock details in Google results and merchant listings. The competing stores we reviewed show “$139 · In stock · ★ 4.7” directly under their results.
Cause
The theme’s JSON-LD snippet was never extended after the product template was customised.
How to fix
  1. Add an offers block with price, priceCurrency, availability and url to the theme’s Product JSON-LD.
  2. Add aggregateRating only if the rating is printed in the page HTML (not only inside the widget).
  3. Validate one product per template in Google’s Rich Results Test.
Who · effort
Developer · Low effort, 2–4 hours
How to verify
Rich Results Test on 3 product URLs: “Product snippets” and “Merchant listings” detected with no critical errors.
Show 24 affected product pages
  • /products/trailpace-gtx-womens
  • /products/trailpace-gtx-womens-moss
  • /products/trailpace-gtx-womens-slate
  • /products/trailpace-gtx-mens
  • /products/trailpace-gtx-mens-rust
  • /products/cityglide-2-womens
  • /products/cityglide-2-womens-sand
  • /products/cityglide-2-mens
  • /products/cityglide-2-mens-graphite
  • /products/harbor-walker-wide
  • + 14 more product pages on the same template

08 · Content & competitors

Is there enough to rank for shopping searches?

Category and article pages compared with the pages that currently rank for three buying searches in Portland (manual review, July 21, 2026).

Competitor snapshot

The two local stores that appear above you for “trail running shoes portland”, “wide fit walking shoes”, “running shoe store near me (Portland)” (manual review from a Portland location; results vary by person and place).

Northwind Shoes compared with two competitors
SignalYourosecity-runners.examplestride-and-co.example
Words of advice on main category pages0–40310450
Price and stock shown in resultsNoYesYes
Star ratings shown in resultsNoYesNo
Store pages crawlableNo (robots.txt)YesYes
Guides with named authorNoYesYes

Opportunity

Wide-fit shoes: 46 models in stock, no page that says so

You stock 46 wide-fit models and offer free in-store fitting, but /collections/wide-fit has no text at all. A focused page with fitting advice is one of the quickest content wins in this report.

F07importantRecommendation12 of 14 category pages

Category pages are product grids with no helpful text

12 of 14 category pages have fewer than 40 words of text above or below the products. The competing pages that rank for the same searches have 250–450 words of advice on fit, terrain and care.

Evidence

/collections/trail-running 18 words “Shop trail running shoes from top brands.”

/collections/wide-fit 0 words

Competitor average (3 searches, 6 results): 340 words

Why it matters
For searches like “waterproof trail running shoes” Google prefers pages that help people choose. Your fitting staff know exactly what shoppers ask in the store — that knowledge is currently not on the site.
Cause
The category template has an optional description field that was left empty.
How to fix
  1. Start with the 5 categories with the most revenue: write 150–300 words each — who the shoe is for, fit tips, terrain, how to choose.
  2. Add 3–4 real questions your staff answer every week (e.g. “Do I need a half size up for trail shoes?”).
  3. Link each text to one matching guide and 2–3 bestsellers.
Who · effort
Owner or staff writer (fitting specialists) · High effort, 2–3 hours per category
How to verify
Each of the 5 categories has at least 150 words of unique text visible in the HTML; in Search Console, compare impressions for these categories 8–12 weeks later.
Show 12 affected category pages
  • /collections/mens-running
  • /collections/trail-running
  • /collections/walking-shoes
  • /collections/wide-fit
  • /collections/kids
  • /collections/sandals
  • /collections/boots
  • /collections/sneakers
  • /collections/work-shoes
  • /collections/insoles-socks
  • /collections/new-arrivals
  • /collections/vegan
F12opportunityRecommendation5 of 5 articles

Guides have no author, date or links to the shoes they recommend

All 5 guides are signed “Northwind team” with no date. “How to choose trail running shoes” (1,400 words) names 6 models you sell, but links to none of them.

Evidence

/blogs/guides/how-to-choose-trail-running-shoes

author: “Northwind team” · date: none · links to products: 0 of 6 mentioned

Why it matters
Readers — and search engines — trust advice more when they can see who wrote it and when. Your staff’s hands-on fitting experience is a real advantage that is currently invisible.
Cause
The blog template hides the author and date fields.
How to fix
  1. Show a real author with one line of experience (e.g. “Maya Ortiz, fitting specialist, 11 years”) and published/updated dates.
  2. Link every model mentioned to its product page, and each guide to its matching category.
Who · effort
Owner + developer (template) · Low effort, 1–2 hours
How to verify
Each guide shows author and date in the HTML; every model mentioned is a working link.
Show 5 affected articles
  • /blogs/guides/how-to-choose-trail-running-shoes
  • /blogs/guides/best-walking-shoes-for-standing-all-day
  • /blogs/guides/wide-feet-running-shoe-guide
  • /blogs/guides/winter-boots-care
  • /blogs/guides/marathon-training-shoe-rotation

09 · Internal links

Every internal link on the 48 detailed pages was requested and its final status recorded.

F05importantConfirmed issue9 of 48 pages

17 internal links lead to products that no longer exist

9 of 48 pages link to discontinued products that now return 404 — mostly in blog articles and the “Staff picks” block on the homepage. 17 broken links in total.

Evidence

/blogs/guides/how-to-choose-trail-running-shoes

→ /products/trailpace-gtx-2023 404 Not Found

/ (Staff picks) → /products/cityglide-1-mens 404 Not Found

Why it matters
Visitors who click a recommendation hit an error page at the moment they were ready to buy. Search engines also spend crawl time on dead ends instead of your current products.
Cause
Products were deleted when discontinued, without a redirect, and links in older content were never updated.
How to fix
  1. Add a 301 redirect from each removed product to its successor model or, if none, to its category (list of 17 in actions.csv).
  2. Update the links in the 9 pages to point straight to the new URLs.
  3. In future, archive discontinued products or redirect them in the same step.
Who · effort
Store admin · Low effort, 1–2 hours
How to verify
A recrawl of the 9 pages shows 0 internal links returning 404.
Show 9 affected pages
  • /
  • /blogs/guides/how-to-choose-trail-running-shoes
  • /blogs/guides/best-walking-shoes-for-standing-all-day
  • /blogs/guides/wide-feet-running-shoe-guide
  • /blogs/guides/winter-boots-care
  • /blogs/guides/marathon-training-shoe-rotation
  • /collections/sale
  • /collections/trail-running
  • /pages/staff-picks

10 · Mobile & accessibility

Can everyone use the store on a phone?

Rendered in a real browser at 412 px (Pixel 7) and 1366 px; tap targets and accessible names checked on 6 key templates.

F09importantConfirmed issue48 of 48 pages

Size buttons are too small to tap and the cart icon has no name

On every page the cart and search icons are buttons without a text name. On the 24 product pages, size buttons are 22×22 px with 4 px gaps — below the 24 px minimum in WCAG 2.2.

Evidence

<button class="header__icon"><svg>…</svg></button> accessible name: (none)

.size-swatch 22×22 px · gap 4 px

Why it matters
On a phone, a mis-tap selects the wrong size and leads to returns. People using screen readers only hear “button”, with no clue that it opens the cart.
Cause
The theme’s icon buttons have no aria-label, and size swatches were restyled smaller than the theme default.
How to fix
  1. Make size buttons at least 44×44 px with 8 px gaps.
  2. Add aria-label="Cart, 2 items" and aria-label="Search" to the icon buttons (the cart count updates with the cart).
Who · effort
Front-end developer · Low effort, 2–4 hours
How to verify
Lighthouse accessibility: “Buttons have an accessible name” and “Touch targets have sufficient size” both pass on a product page.
Show 48 affected pages
  • /
  • /products/trailpace-gtx-womens
  • /collections/womens-running
  • /cart
  • /pages/stores/pearl-district
  • /blogs/guides/how-to-choose-trail-running-shoes
  • + all other pages (shared header)

11 · Local SEO

Can nearby shoppers find your two stores?

Store pages, name/address/phone consistency and local structured data. Your Google Business Profile was not checked (it needs owner access).

F03criticalConfirmed issue3 of 3 store URLs

Your two store pages are blocked from Google by robots.txt

robots.txt contains Disallow: /pages/stores. That single rule blocks the store index and both store pages (Pearl District and Hawthorne), including their address, opening hours and the free gait-analysis fitting service.

Evidence

https://northwind-shoes.example/robots.txt

User-agent: *

Disallow: /pages/stores ← matches every store page

Why it matters
People search for “running shoe store Portland” or “shoe fitting Hawthorne” with the intent to visit today. These are the pages that answer them, and Google is not allowed to read them.
Cause
The rule was most likely added to hide the store locator’s data file (/pages/stores/locator.json), but a prefix rule matches every URL that starts with /pages/stores.
How to fix
  1. Replace the rule with Disallow: /pages/stores/locator.json (or remove it).
  2. Add both store pages to the XML sitemap and link them from the site footer.
  3. Request indexing for both store pages in Search Console.
Who · effort
Developer or store admin · Low effort, 15–30 minutes
How to verify
Search Console → URL Inspection on /pages/stores/pearl-district shows “Crawl allowed: Yes”; the robots.txt report shows no rule matching the store pages.
Show 3 affected store URLs
  • /pages/stores
  • /pages/stores/pearl-district
  • /pages/stores/hawthorne
F13opportunityRecommendation2 of 2 store pages

Store details are not machine-readable and the phone number is written three ways

Neither store page has LocalBusiness (ShoeStore) markup. The Hawthorne opening hours exist only inside an image. The phone number appears as “(503) 555-0142”, “503.555.0142” and “+1 503 555 0142”.

Evidence

/pages/stores/hawthorne

JSON-LD: none · opening hours: image only (hours-hawthorne.jpg)

phone formats found: 3

Why it matters
Consistent, machine-readable name, address, phone and hours help search engines match your website with your map listing and answer “open now” searches.
Cause
Store pages were built as free-form content pages.
How to fix
  1. Add ShoeStore JSON-LD to each store page: name, address, geo, telephone, openingHoursSpecification.
  2. Publish hours as text, and use one phone format everywhere — the same as on your Google Business Profile.
Who · effort
Developer + owner (confirms hours) · Low effort, 2 hours
How to verify
Schema Markup Validator shows a valid ShoeStore on both store pages; hours are selectable text.
Show 2 affected store pages
  • /pages/stores/pearl-district
  • /pages/stores/hawthorne

12 · AI search (GEO)

Can AI assistants quote your answers?

Whether key facts (returns, sizing, shipping) exist as crawlable text. robots.txt allows all AI crawlers. AI citations cannot be guaranteed by anyone.

F14opportunityRecommendation2 of 2 policy pages

Returns policy and size guide are images, so search and AI assistants can’t quote them

The returns page is a single 1200 px infographic, and the size guide is a PNG table. Neither page contains the facts as text: “30 days”, “free returns” or any size conversion.

Evidence

/pages/returns visible text: 11 words · image: returns-policy.jpg

/pages/size-guide visible text: 6 words · image: size-chart.png

Why it matters
Shoppers ask “Does Northwind Shoes have free returns?” or “Do TrailPace shoes run small?” — in Google and in AI assistants. Answers are taken from text. Free 30-day returns is one of your strongest selling points, and right now no search engine can read it.
Cause
The pages were designed as graphics for social media and reused on the site.
How to fix
  1. Publish the returns policy as text and the size guide as an HTML table; keep the images as an addition.
  2. Add 5 short questions and answers about returns, exchanges and sizing, written the way customers ask them.
Who · effort
Owner + developer · Low effort, 2–3 hours
How to verify
Ctrl+F “30 days” finds the text on /pages/returns; the size table is readable with images turned off.
Show 2 affected policy pages
  • /pages/returns
  • /pages/size-guide

13 · 30/60/90-day plan

A realistic order of work

Grouped so each step unblocks the next. Plan the recheck around day 60, after the speed work is live.

  1. Days 1–30

    Quick fixes that unblock Google

    • F01 canonical tags
    • F03 robots.txt store rule
    • F08 automatic sitemap
    • F05 redirects for removed products
    • F09 button names and size buttons
    • Start F02: eager main image, fetchpriority

    Depends on: Store admin access; 1 developer day

  2. Days 31–60

    Speed and richer results

    • Finish F02: image CDN, srcset, fonts, lazy reviews widget
    • F11 reserve rating space
    • F06 product offers markup
    • F13 store markup and hours as text
    • F10 12 meta descriptions
    • Recheck around day 60

    Depends on: F13 needs confirmed hours from the owner

  3. Days 61–90

    Content that wins buying searches

    • F07 texts for the top 5 categories
    • F12 authors, dates and product links in guides
    • F14 returns and size guide as text + FAQ
    • F04 merge colour variants

    Depends on: Staff time for writing; F04 needs a redirect plan

This is a sequence of work, not a promise of search results.

14 · Methodology & limits

What we checked — and what we didn’t

Data collected on July 21, 2026 with a polite crawler (1 request at a time, 1.5 s apart, robots.txt respected), a real browser and Lighthouse 13.5. Findings were reviewed by an SEO specialist before publishing.

Number of unique URLs per type of check. A sitemap status check is lighter than a detailed page analysis.

How the sample was chosen

Homepage, all 14 categories, 24 products (bestsellers, new arrivals and colour variants), both store pages, 5 guides, returns and size guide — 48 pages. Plus every URL in sitemap.xml checked for its status code, and pagination, redirects and a 404 test.

Lab vs field. All speed values are lab measurements on a simulated slow phone. Real visitors may see different numbers.

Not checked, and why

Google’s actual index and search queries
No Search Console access. HTTP 200 does not prove a page is indexed.
Real-visitor speed (CrUX, INP)
Not enough Chrome traffic for public field data; all speed values are lab measurements.
Backlinks and domain authority
Not part of this audit scope.
Google Business Profile and reviews on other sites
Needs owner access.
Rankings
Only a manual look at 3 searches; positions change by location and person.
349 of 412 sitemap URLs beyond a status check
Findings describe the sample and are not automatically true for the whole site.

Delivered with a real report

  • This online report, with a language switch when ordered
  • PDF version for sharing with your team
  • actions.csv: every affected URL, fix, owner and check
  • Implementation pack: ready texts, redirects and developer tasks

Want to know if the fixes worked?

Recheck this website after implementing the changes. Recommended: in 30–60 days.

Recheck website (opens the sample comparison)