Command Center

The one-paragraph version

I crawled 40 pages of uglyjohns.com through our own NAS crawler. The site renders (it looks branded), but underneath it is thin, duplicated, and aging: every location page is 95–100% identical, the homepage leads with a logo catalog instead of a story, there is no per-location amenity data (the exact thing Eric asked for), it runs 11-year-old jQuery with known vulnerabilities, fails a basic accessibility check, and the whole thing is a DealerSpike rental — the footer even says "© 2026 Dealer Spike." You were right yesterday: we cannot make it worse, and a scaled-down replacement can ship fast.

Severity: 🔴 Critical · 🟠 High · 🟡 Medium · 🔵 Strategic Source: ✅ verified artifact · ⚠️ intermittent/partial · ❓ inference

Findings

🔴 F1 SEO / Content

Every location page is 95–100% duplicate content

The 7 location/marina/storage pages are near-identical boilerplate. marine-slip and marine-slip-and-dry-storage are 100% identical (two URLs, one page). Tulsa ↔ Lake Eufaula ↔ Carlton Landing ↔ Beaver Lake ↔ Lake Travis all measure 96–99% identical. Google reads these as thin duplicate pages — near-zero local-SEO value for a 6-location dealer whose customers search "boat service near [lake]".

✅ SequenceMatcher across crawled markdown + 2 screenshots

🔴 F2 Strategy / UX

Homepage has no value proposition — it opens with a wall of boat-brand logos

On mobile, above the fold is the Ugly John's logo then a stacked grid of manufacturer tiles (Nautique, Monterey, Premier, Harris, Sea Ray, Pardo). No hero, no headline, no "full-service, friction-free boat ownership" story — the exact relationship message Eric said they want. It reads as a catalog, not an experience. (A "View Models" label also visually overlaps the Nautique logo — a layout bug.)

✅ mobile screenshot

🟠 F3 Content gap

Zero per-location amenity data — the precise thing Eric wants surfaced

Location pages carry only hours + a map + a "Contact Us" button. Nothing on slip count, fuel availability, food, on-site vs on-water mechanics, dry storage — the location-uniqueness data Eric flagged on today's call. The site cannot answer "if my boat breaks down, which location helps me?" This is the questionnaire we build for tomorrow.

✅ screenshots + crawl

🟠 F4 Reliability

Intermittent HTTP 500 on the Terms & Conditions page

During the crawl, /read-our-terms-and-conditions--xterms returned a 500 server error under full render. Two spaced plain re-fetches returned 200, so it is flaky-under-load rather than hard-down — but a legal page throwing intermittent 5xx is a reliability smell on aging infrastructure.

⚠️ crawler render = 500, curl ×2 = 200 (intermittent)

🟠 F5 SEO / Hygiene

Sitemap last updated 2020, and contains a malformed URL

sitemap.xml's content map shows lastmod 2020-09-18 and ends with a broken concatenated entry: "uglyjohns.comhttps://twitter.com/UglyJohns". It also lists ghost pages (a Lake Travis / Austin TX location and an electric-cars/collector-cars page) that don't match the live navigation — so the sitemap, nav, and footer disagree about how many locations exist.

✅ raw sitemap.xml

🟡 F6 Security / Tech debt

jQuery 1.10.2 (2013) — end-of-life with known XSS CVEs

The site runs jQuery 1.10.2 plus jQuery-Migrate 1.2.1 on a classic ASP stack (default.asp). jQuery 1.x is unsupported and carries documented cross-site-scripting vulnerabilities. Roughly 10 third-party script origins load on the homepage (GTM, FareHarbor, SnapWidget, DealerSpike modal, multiple CDNs), each one a performance and privacy dependency.

✅ raw HTML

🟡 F7 Accessibility

Mobile pinch-zoom is disabled (WCAG 1.4.4 failure)

The viewport meta is set to user-scalable=no, maximum-scale=1.0 — this blocks pinch-to-zoom, a WCAG 2.1 AA failure. Notably the footer links an "Accessibility" page while the site itself violates a core accessibility requirement.

✅ raw HTML

🔵 F8 Vendor lock-in

The site is wholly DealerSpike — even the footer credits the vendor

CMS, all lead forms, financing (secure-financing.dealerspike.com), popup widgets, and the CDN are DealerSpike. The footer literally reads "Copyright © 2026 Dealer Spike." Ugly John's does not own its own web presence — which is exactly why "a partner who owns this for us" lands.

✅ raw HTML + endpoints

Evidence — content duplication (F1)

Pairwise text-similarity across the location pages. A real multi-location dealer should have distinct, locally-optimized pages; instead these are one template with the name swapped.

Page APage BIdentical
marine-slipmarine-slip-and-dry-storage100%
TulsaCarlton Landing99%
Beaver Lake (Prairie Creek)Lake Eufaula99%
TulsaLake Eufaula98%
Lake EufaulaLake Travis98%
Beaver LakeCarlton Landing95%
Locations indexHours (Grand Lake)90%
Ugly John's Lake Eufaula page
Lake Eufaula — hours + map + button. No photo, no intro, no amenities.
Ugly John's Tulsa page
Tulsa — same skeleton, one photo + one sentence. 98% identical to Eufaula.

Evidence — no homepage story (F2)

Ugly John's mobile homepage
Mobile home, above the fold: brand logo, hamburger, then a stack of manufacturer tiles. No hero, no value proposition. Note "View Models" overlapping the Nautique logo.

Open the full-page desktop capture →

Form endpoints — confirmed: all DealerSpike

Your hypothesis was right. Every lead form submits through DealerSpike, not a self-hosted handler. Each <form> has an empty action="" and a data-ds-form name; DealerSpike's JavaScript posts to pdxelk.dealerspike.com:8201. The recipient inbox (to_email/MAILTO) is filled server-side, per location, and is not visible in the page source — so we'll need each location's lead-destination email as part of intake.

FormDealerSpike namePage
Contact UsxInquiry/contact-email…--xcontact
Schedule a Viewingxsched_ride/schedule-viewing-boats--xsched_ride
Get a Quotexget_quote/price-quote…--xget_quote
Value Your Tradextrade_value/trade-in-value…--xtrade_value
Service Requestxservice_request/service-request…--xservice_request
Parts Requestxparts_request/request-parts…--xparts_request

Other third-party integrations the MVP must account for: FareHarbor (rentals/charters booking widget), SnapWidget (Instagram feed), secure-financing.dealerspike.com (credit app), and a separate orderuglyjohns.com domain for Ugly's Grill ordering. The lead-form schema is inventory-aware (year/make/model/stock#, plus campaign + opportunity IDs) — relevant if the MVP keeps an inventory-inquiry path.

What this means for the MVP

  • Lead capture is the one thing we can't fake. Decide now: keep posting to DealerSpike's pipeline (preserves their current CRM/lead routing) or stand up our own form handler and route leads to the same per-location inboxes. Either way we need the destination emails.
  • Rentals = FareHarbor. Re-embed the widget; don't rebuild booking.
  • Inventory can be punted to a later phase (it's the heaviest DealerSpike-coupled piece); a Phase 1A of home + 6 real location pages + brand story + working contact/quote forms is shippable fast.

Talking points for tomorrow

Methodology & provenance

40 URLs (sitemap + live nav) crawled 2026-06-11 via the Aspire NAS Crawl4AI container (192.168.5.230:11235) with humanistic pacing — full-browser render, 2–6s built-in stealth delay plus 3–7s added jitter, serial (no parallel hammering), ~11 minutes total. Form HTML pulled separately to read <form> actions. 39/40 pages returned 200; 1 intermittent 500 (see F4). Claims are tagged by source above; the only non-verified item is the intermittent-500 severity. No client-facing assets were touched — this is internal strategy.