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.
All 22 sitemap URLs return 200; canonicals correct site-wide.
Legacy WordPress URLs still indexed by Google 404 on the new site.
Schema present but address incomplete; no NAP in page HTML.
300 KB HTML, 6 font families, no srcset, minimal lazy-loading.
Migration 404s
CriticalGoogle 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 status | Should 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 |
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.
High-Impact Items
HighIncomplete 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.
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 page | Covers | Coverage gap |
|---|---|---|
| Prince Frederick | Roof replacement | inspections · coatings · gutters · storm |
| Waldorf | Roof inspections | replacement · coatings · gutters · storm |
| Silver Spring | Roof coatings | replacement · inspections · gutters · storm |
| La Plata | Gutters | replacement · inspections · coatings · storm |
| Fort Washington | Storm damage | replacement · inspections · coatings · gutters |
| Annapolis | All roofing services | — correct template |
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.
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.
Demote the financing banner to an H3 or styled text; break the homepage body into keyworded H2 sections (services, service area, why-us, financing).
Medium Priority
MediumFront-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.
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.
What's Already Sound
Pass- All 22 sitemap pages return 200 — zero crawl errors
- Unique, well-lengthed titles in keyword + brand format
- Unique meta descriptions on every page (one truncated: siding page cuts off mid-sentence)
- Correct self-referencing canonicals site-wide
- Trailing-slash, http→https, and non-www→www all 301 cleanly
- HSTS with preload; proper 404 status handling
- Single H1 on every page except the homepage
- Service pages carry healthy 750–950 word counts
- robots.txt clean, with sitemap reference
- Open Graph + Twitter Card tags with image, all pages
- GA4 (G-4JBJR5L0TR) and Meta Pixel installed
- All five sameAs social profiles resolve
- Three blog posts well-targeted at "{service} in {city}" queries
- RoofingContractor schema with areaServed, hours, phone, email
Order of Attack
- Build the 301 redirect mapPull legacy URLs from Search Console → Duda URL Redirects. Stops the bleeding.~1 hr · Critical
- Complete the schema NAPFull street address, postal code, geo, priceRange + NAP in the footer.~1 hr · High
- Sitemap hygieneAdd /contact; tier priorities.~15 min · High
- Fix homepage heading structureDemote second H1; add keyworded H2 sections.~30 min · High
- Build out the city × service matrixClone the Annapolis template per city; expand the /service-area hub.Ongoing · Growth
- Font & image dietDrop to 2–3 font families, webp + srcset on gallery imagery, alt-text pass.~2 hrs · Medium
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.
| URL | Status | T | D | H1 | W |
|---|---|---|---|---|---|
| / | 200 | 40 | 140 | ×2 | 1,152 |
| /roofing-replacements-and-repairs | 200 | 52 | 122 | 1 | 767 |
| /siding-replacements-and-repairs | 200 | 49 | 83 | 1 | 762 |
| /gutters-replacements-and-repairs | 200 | 49 | 146 | 1 | 773 |
| /roof-coatings | 200 | 35 | 138 | 1 | 776 |
| /roof-inspections | 200 | 38 | 135 | 1 | 768 |
| /fire-smoke-water-and-wind-damage-repair | 200 | 61 | 137 | 1 | 942 |
| /service-agreements-and-maintenance-programs | 200 | 63 | 153 | 1 | 926 |
| /service-area | 200 | 36 | 117 | 1 | 178 |
| /service-area/prince-frederick-md | 200 | 58 | 154 | 1 | 563 |
| /service-area/waldorf-md | 200 | 31 | 160 | 1 | 547 |
| /service-area/silver-spring-md | 200 | 34 | 162 | 1 | 557 |
| /service-area/la-plata-md | 200 | 50 | 163 | 1 | 540 |
| /service-area/fort-washington-md | 200 | 64 | 168 | 1 | 576 |
| /service-area/annapolis-md | 200 | 55 | 155 | 1 | 698 |
| /about-us | 200 | 30 | 124 | 1 | 798 |
| /contact (not in sitemap) | 200 | 32 | 110 | 1 | — |
| /faqs | 200 | 34 | 121 | 1 | 845 |
| /gallery | 200 | 46 | 104 | 1 | 182 |
| /resources | 200 | 31 | 125 | 1 | 301 |
| /protecting-commercial-buildings…silver-spring-md | 200 | 71 | 165 | 1 | 814 |
| /when-to-schedule-a-roof-inspection-in-waldorf-md | 200 | 49 | 166 | 1 | 812 |
| /understanding-roof-replacement…prince-frederick-md | 200 | 63 | 170 | 1 | 780 |