Technical SEO Audit · Document № 2026-0610 Eagle Environmental audit →

Site Inspection
Report. SEO Edition

https://www.homeprocontractor.com

Client — HomePro Contractors, LLC Inspected — June 10, 2026 Platform — Duda Pages crawled — 23
ACTION
REQUIRED
1 critical · 4 high

The structure is sound; the migration leaked. The new Duda site has genuinely solid on-page fundamentals — unique titles, clean canonicals, healthy sitemap, valid local-business schema. But the move off WordPress shipped without a redirect map, so URLs Google still ranks are returning 404 and bleeding link equity. Patch that first, then complete the schema, fill the service-area coverage gaps, and put the front-end on a diet.

IndexabilityPass

All 22 sitemap URLs return 200; canonicals correct site-wide.

MigrationFail

Legacy WordPress URLs still indexed by Google 404 on the new site.

Local SEOPartial

Schema present but address incomplete; no NAP in page HTML.

Page WeightHeavy

300 KB HTML, 6 font families, no srcset, minimal lazy-loading.

FINDING 01

Migration 404s

Critical

Google is still serving the old WordPress site's URLs in search results — and they're dead. Every one of these is a page that earned rankings and backlinks, now returning a hard 404. This is active, ongoing loss.

Legacy URL (still indexed)Current statusShould 301 to
/contact-us/404/contact
/roofing-prince-fredrick-maryland/404/service-area/prince-frederick-md
/roofing-homepro-prince-frederick-maryland/404/service-area/prince-frederick-md
/roofing-pros-frederick-maryland/404/roofing-replacements-and-repairs
/about-us/200— slug happened to match
Sample surfaced via live Google results, June 10 2026. The full inventory will be longer.
Fix

Pull the complete old-URL list from Google Search Console (Pages → Not indexed → Not found 404), then add 301 redirects in Duda under Site Settings → URL Redirects, mapping each legacy URL to its closest live equivalent. One sitting, permanent recovery of whatever equity remains.

FINDINGS 02–05

High-Impact Items

High

Incomplete LocalBusiness schema

JSON-LD · RoofingContractor · sitewide

The structured data is a strong start — areaServed (6 cities), opening hours, phone, email, and five resolving sameAs profiles are all present. But the address stops at "Prince Frederick, Maryland." The full NAP is public on Yelp: 5240 Cutter Ct Ste 103, Prince Frederick, MD 20678. The street address also never appears anywhere in the page HTML, which weakens local-pack consistency signals.

Fix

Add streetAddress, postalCode, addressCountry, geo, and priceRange to the schema; add the full NAP to the site footer; add aggregateRating once review markup is sourced.

Service-area pages are a one-service-per-city patchwork

/service-area/* · 6 city pages

Each city page targets a different single service — so a search like "roof replacement Waldorf MD" has no matching page at all. The Annapolis page (general roofing services) is the right model; the rest cover one cell each of a 5×6 matrix:

City pageCoversCoverage gap
Prince FrederickRoof replacementinspections · coatings · gutters · storm
WaldorfRoof inspectionsreplacement · coatings · gutters · storm
Silver SpringRoof coatingsreplacement · inspections · gutters · storm
La PlataGuttersreplacement · inspections · coatings · storm
Fort WashingtonStorm damagereplacement · inspections · coatings · gutters
AnnapolisAll roofing services— correct template
Building out the service × city matrix is the largest organic-growth lever available.

Also: the /service-area hub itself is thin at ~178 words.

/contact missing from sitemap.xml

sitemap.xml · 22 URLs listed

The contact page is live, linked in navigation, and properly canonicalized — but absent from the sitemap. Separately, every URL declares priority 1.0, which flattens the signal entirely.

Fix

Add /contact to the sitemap; tier priorities if Duda allows (home/services 1.0, cities 0.8, blog 0.6).

Duplicate H1 on the homepage

/ · two <h1> elements

"Trusted Roofing Contractors Serving Southern Maryland" is a good primary H1 — but "Financing options available!" is also marked up as an H1. Heading structure below it is shallow: one H2 across ~1,150 words.

Fix

Demote the financing banner to an H3 or styled text; break the homepage body into keyworded H2 sections (services, service area, why-us, financing).

FINDINGS 06–09

Medium Priority

Medium

Front-end weight

Performance · homepage

Homepage HTML alone is 300 KB with 62 KB of inline CSS across 15 <style> blocks. The font request pulls six families (Anton, Raleway, Roboto, Montserrat, Poppins, Oswald) — most Duda templates actively use two or three. Images ship as 1920-wide JPG/PNG with no srcset and a single loading="lazy" attribute; only 3 webp references found.

Fix

Prune unused families in Duda theme settings, re-export gallery imagery as webp, and run PageSpeed Insights to baseline Core Web Vitals (keyless API quota blocked automated measurement during this audit).

Empty image alt attributes

/ · 3 content images

Three homepage gallery images (template leftovers, IDs 1541778943, 1266163065, 1340604030) carry alt="". A site-wide alt pass is warranted since these originated from the template.

Unclaimed schema opportunities

/faqs · blog articles

The FAQs page (~845 words of genuine Q&A) is a textbook FAQPage markup candidate. The three blog posts — well-targeted at "{service} in {city}" queries — should carry BlogPosting markup.

Case-sensitivity duplicates (contained)

URL handling

/About-Us serves 200 instead of redirecting to lowercase — but the canonical correctly points to /about-us, so the risk is contained. No action strictly required.

VERIFIED

What's Already Sound

Pass
REMEDIATION

Order of Attack

  1. Build the 301 redirect mapPull legacy URLs from Search Console → Duda URL Redirects. Stops the bleeding.~1 hr · Critical
  2. Complete the schema NAPFull street address, postal code, geo, priceRange + NAP in the footer.~1 hr · High
  3. Sitemap hygieneAdd /contact; tier priorities.~15 min · High
  4. Fix homepage heading structureDemote second H1; add keyworded H2 sections.~30 min · High
  5. Build out the city × service matrixClone the Annapolis template per city; expand the /service-area hub.Ongoing · Growth
  6. Font & image dietDrop to 2–3 font families, webp + srcset on gallery imagery, alt-text pass.~2 hrs · Medium
STRUCTURE

Page Restructure

Plan

The site doesn't have too many pages — it has overlapping ones. The fix is consolidating cannibalizing pages and rebuilding the city pages, not deleting content.

Pages Today23

7 services · 7 service-area · 6 utility · 3 blog

After Consolidation~19

Blog folds into city pages; thin /resources merges

Core Marketing17

The pages that target a query & convert

Net Cut4

Folded, not deleted — equity preserved via 301s

Merge / FoldIntoWhy
…roof-replacement…prince-frederick-md (blog)/service-area/prince-frederick-mdSame query, same town — the two cannibalize each other
…roof-inspection…waldorf-md (blog)/service-area/waldorf-mdBoth target "roof inspection Waldorf"
…coatings…silver-spring-md (blog)/service-area/silver-spring-mdBoth target "roof coatings Silver Spring"
/resources (301 words, thin)/faqsToo thin to rank alone; FAQs is the stronger keeper
All four folds use 301 redirects, so ranking signals transfer rather than disappear.

The bigger lever is restructuring, not cutting. Each city page currently covers only one service (Prince Frederick = replacement, Waldorf = inspections, Silver Spring = coatings), so "roof replacement Waldorf" has no matching page. Don't delete the 6 city pages — rebuild each into a full "Roofing in {City}" page. The Annapolis page is already the right template.

Real core: 17 pages. Home (1) · Services (7: roofing, siding, gutters, coatings, inspections, fire/storm restoration, service agreements) · Service Areas (1 hub + 6 cities) · About + Contact (2). Supporting: FAQs, Gallery. And add /contact to the sitemap — it's live but missing.

APPENDIX A

Crawl Record

All URLs from sitemap.xml plus the contact page, fetched June 10, 2026. T = title length, D = description length, W = approximate visible word count.

URLStatusTDH1W
/20040140×21,152
/roofing-replacements-and-repairs200521221767
/siding-replacements-and-repairs20049831762
/gutters-replacements-and-repairs200491461773
/roof-coatings200351381776
/roof-inspections200381351768
/fire-smoke-water-and-wind-damage-repair200611371942
/service-agreements-and-maintenance-programs200631531926
/service-area200361171178
/service-area/prince-frederick-md200581541563
/service-area/waldorf-md200311601547
/service-area/silver-spring-md200341621557
/service-area/la-plata-md200501631540
/service-area/fort-washington-md200641681576
/service-area/annapolis-md200551551698
/about-us200301241798
/contact (not in sitemap)200321101
/faqs200341211845
/gallery200461041182
/resources200311251301
/protecting-commercial-buildings…silver-spring-md200711651814
/when-to-schedule-a-roof-inspection-in-waldorf-md200491661812
/understanding-roof-replacement…prince-frederick-md200631701780