// page 2 of 4

The two websites

What the audit found on the live WordPress site and on the new Netlify rebuild, and whether the move is safe.

// part a

Part A: Legacy site

Home page of the legacy WordPress site at 1440 pixels
Figure: the legacy home page, marketplacesuitesusvi.com, at 1440 px.

A.1 Summary

The legacy site works and real users get acceptable speed, but the WordPress stack reads as heavy and the lab scores are Needs Improvement, with template medians of 54 to 89 on mobile, and the /marketplace/ page scored 44 in one run. After the switch the legacy site stays online for 30 days as a safety copy, with no links pointing to it (Part F, item 5). Its findings matter for 2 reasons: they can serve as the baseline for the new site, and several content problems were copied to the new site.

25 findings: 2 Critical, 4 High, 11 Medium, 8 Low.

What works

  • Real users pass the LCP and CLS thresholds at the 75th percentile: LCP 1.8 s on phones and 1.4 s on desktop, CLS 0.00 and 0.06 (A.1 table); INP has no field data, so a full Core Web Vitals pass is not shown.
  • Name, address and phone match on the footer and the contact page, and private files and folders are blocked (A.3).

What is wrong

  • 2 Critical items, both also on the new site: a link to a domain that redirects to kebaya4d.org (A-1), and a tracked conversion event that fires on every view of /thank-you/ (A-2).
  • The WordPress stack is slow in lab tests (A-3). The home page loads 24 script files (21 from the site itself and 3 from other domains) and weighs 7,228 KiB in one local Lighthouse run. In one PageSpeed mobile run, LCP was 21.8 s on the home page, 11.7 s on suite 9, 10.7 s on a category page and 10.5 s on a beach page. Other runs gave 3.5 s to 14.8 s for the same pages. Real users see far better numbers, so the lab tests and the real-visitor data differ.
  • Every page fails basic accessibility checks: images with no alt and links with no name. Low contrast (text that is hard to read) affects 33 pages (A-7).
  • The legacy site appears to throttle GPTBot and ClaudeBot although robots.txt allows them (A-23).
  • There are no security headers, and WordPress endpoints such as xmlrpc.php are open (A-11, A-12).

What carries over to the new site

  • These exist on both sites, because content and tracking were copied: A-1, A-2, A-5 (28 dead or unsafe links to other sites on the new site), A-7 (accessibility), A-8 (thin and placeholder pages), A-18 and A-19 (page titles), A-24 (no About page or email) and the legal items in A-25. Fix them once, on the new site.
  • In one burst test, the new site returned 200 to all 6 GPTBot and all 6 ClaudeBot requests, but the accessibility problems remain on the new site: 18 of 91 pages have images with no alt, and the 77 snapshot pages score 87 to 96 for accessibility. The new site adds HSTS, X-Frame-Options, nosniff and Permissions-Policy headers, but still has no Content-Security-Policy and no Referrer-Policy. The new site's own scores are in Part B.
Area Result
Sitemap URLs 93 (Yoast, the WordPress SEO plugin, 6 child sitemaps)
Real-user Core Web Vitals (CrUX origin, p75) LCP 1.8 s phone, 1.4 s desktop. CLS 0.00 phone, 0.06 desktop. LCP and CLS pass. An overall Core Web Vitals pass is not shown. No INP value is in the real-visitor data.
PageSpeed mobile performance, median by page template (layout type; all 93 pages, 1 run each) Home 59, suite pages 54, /suites/ 58, posts 66.5, categories 66, info pages 89, landing and beach pages 69, Marketplace tenants 64. Blog index 67. /marketplace/ 44. Median LCP for posts 10.4 s, for suite pages 11.7 s.
axe accessibility, an automated checker (all 93 pages) Every page fails image-alt, button-name and link-name. color-contrast fails on 33 pages (225 flagged elements). 0 of 93 pages pass every check.
Lighthouse accessibility 65 to 85
Lighthouse SEO 77 to 92
Security headers None
AI crawler access robots.txt allows all 27 tested crawlers, but a test burst got HTTP 429 from GPTBot and ClaudeBot, and the server drops connections from Bytespider. See A-23.
GEO Optimizer score (AI search readiness) 69 out of 100
llms.txt 404
Console errors (browser error messages, 16 page types checked) 0

A.2 Findings

// critical

A-1CriticalA link on /marketplace/ now points to chelseadrugstoreredhook.com, which redirects to kebaya4d.org. (Same on new site.)

Chelsea Drugstore card on /marketplace/ with WEBSITE, FB and CALL buttons
Figure: the Chelsea Drugstore card on /marketplace/. Its WEBSITE button leads to chelseadrugstoreredhook.com, which now redirects to kebaya4d.org.
  • The "WEBSITE" link for Chelsea Drugstore goes to https://chelseadrugstoreredhook.com/. That domain now returns a 301 to https://kebaya4d.org/, a different domain. An ISP (internet service provider) security filter shows a "Suspicious Site Blocked" page for http://kebaya4d.org/. The destination did not load during testing, so its content could not be seen.
  • Impact the link points to kebaya4d.org, a different domain, through a redirect.
  • Fix remove the link now.

A-2CriticalThe /thank-you/ page fires a conversion on every page view. (Same on new site.)

  • Evidence a plain page load of /thank-you/ (no form submitted) sends a GA4 (Google Analytics 4) form_submission conversion (a request to google.com/measurement/1p-conversion/ for a form-submission conversion). The page is also in the XML sitemap and has no noindex.
  • Impact the conversion event fires on a plain load of the /thank-you/ page.
  • Fix add noindex to /thank-you/, remove it from the sitemap, and fire the conversion from the form submit event (or check a one-time token) instead of the page view.

// high

A-3HighSlow mobile pages in lab tests.

  • PageSpeed mobile LCP in one run: home 21.8 s, suite 9 11.7 s, beach page 10.5 s, category 10.7 s. Other runs: home 14.8 s (PageSpeed) and 13.3 s (local Lighthouse), suite 9 11.6 s, beach page 3.5 s, category 9.8 s. Home page weight (total download size) was 7,228 KiB in one local Lighthouse run (about 7.4 MB).
  • 24 script files load on the home page (21 from the site itself and 3 from other domains): jQuery, jQuery Migrate, Backbone, Underscore, wp-api, Bootstrap, Slick, Gravity Forms (5 files), TrustIndex, the Lodgix booking plugin and others. Third-party code (code from other companies) cost an estimated 764 ms on the home page in one Lighthouse run. On the three legacy pages tested, this cost ranged from 565 ms to 800 ms.
  • Suite 9 took 2,055 ms to send the HTML (the page code; this is the server response time) in one Lighthouse run.
  • Real users see much better numbers (A.1). The lab numbers and the real-visitor numbers differ.

A-4HighLayout shift on 2 of the 5 desktop pages tested. /things-to-do/ had CLS 0.481 on desktop and 0.219 on mobile, each in one PageSpeed run, and mobile CLS varies by test run. The home page had CLS 0.112 (about 0.11) on desktop in one PageSpeed run.

A-5High29 dead or unsafe links to other sites on the legacy site, most in blog posts. (28 on new site.)

  • 407 different links to other sites were checked on both sites. 22 return a final HTTP 404 (page not found), and 21 of them are also on the new site. Examples: 6 links to nps.gov/viis/planyourvisit/... pages that return 404, 1 link to nps.gov/nr/travel/prvi/pr35.htm, the ftc.gov junk-fee press release and the doh.vi.gov hurricane page. The 404 that appears only on the legacy site is isolashoppes.com on /things-to-do/.
  • 2 domains no longer resolve (grapevinesalon.com, starfishmarketusvi.com). 5 URLs fail on SSL or redirect to other domains (usvitravelportal.com and www.usvitravelportal.com to usvitravelscreening.com, mahocrossroads.com, stjohnmarketplace.com, plus A-1). Total: 29 on the legacy site, 28 on the new site.
  • The legacy site also has a broken link whose address contains page code (HTML) (it starts https://workforceinstitut and contains <p><a href=) on /category/blog/virgin-islands/.
  • 44 more URLs (Tripadvisor, AllTrails, visitusvi.com, vinow.com and others) returned 403 or 429 to automated requests. A person should click a sample.
  • Full list: Part G, G.3.

A-6HighHorizontal scroll on the home page at 390 px width. A browser test found that the page is wider than the phone screen.

// medium

A-7MediumAccessibility.

  • 93 of 93 pages have <img> tags with no alt attribute: 11 or 12 per page on 91 pages, and 17 and 35 on the other 2. On the home page, 28 of the 35 are outside the header and footer (6 are in the footer and 1 in the header or nav).
  • 93 of 93 pages have links with no text or label (3 unnamed links on each of 90 pages, 4 on the home page, and 5 each on /faq/ and /cancellation-policy/).
  • 59 pages show date, byline (author name) and folder icons with alt="Generic placeholder image".
  • "Read more" link text on blog lists. Buttons with no name that a screen reader can read. Lighthouse flags low colour contrast on pages including the home page, suite 9, /things-to-do/, /contact-us/, /marketplace/ and /hawksnest-beach/. No <main> landmark in the raw HTML of 22 of 93 legacy pages, including /contact-us/ and /marketplace/.
  • Text smaller than 12 px on every page type tested (10 small text items on most pages, 44 on /suites/).

A-8MediumPages that search engines list but should not.

  • /thank-you/ (see A-2).
  • /category/level-1/, /category/level-2/, /category/level-3/ (3 words each, no meta description) and /category/uncategorized/.
  • 2 /property-category/ pages with the page title "Suites | Marketplace Suites", the same as /suites/.
  • 6 /marketplace/<tenant>/ pages in the sitemap with 13 to 33 words, and all 6 are orphan pages (no other sitemap page links to them).

A-9MediumOrphan pages. 10 sitemap pages get no internal links from any sitemap page: the 6 Marketplace tenant pages, /top-things-to-do-in-st-john-us-virgin-islands/, /st-john-shines-in-autumn/ and the 2 /property-category/ pages.

A-10MediumInternal links cause extra redirects. Links without the slash (/) at the end of the address: /terms-of-use (186 links), /privacy-policy (186), /blog (155), /contact-us (93) and others. Each one triggers a 301 redirect.

A-11MediumWordPress details visible to outsiders. xmlrpc.php answers (405 to GET, 200 to POST). /license.txt is public. The site feed (a list of recent posts) shows the WordPress version (7.1.4). The /wp-json/wp/v2/users address is correctly locked (401 means access denied).

A-12MediumNo security headers. No HSTS, CSP, X-Frame-Options or nosniff.

A-13MediumReview schema counts on suites 5 to 9 are close to the new site's counts. On the legacy site, suites 5 to 9 list reviewCount (their review total) as 30, 23, 22, 11 and 40. The new site says 32, 24, 22, 12 and 40, close to its own "Read all" links (28, 21, 22, 12 and 38 reviews). Review authors in the page code are named like "Review from Airbnb Guest #346840".

A-14MediumHeading levels skip (headings jump past a level) on 9 pages (for example h1 to h5 on /things-to-do/, h2 to h4 on the home page).

A-23MediumThe server appears to limit 2 AI crawlers that robots.txt allows. Test: 6 quick requests to 6 legacy pages with each crawler's user agent (the name the bot sends):

  • GPTBot: 200 200 429 429 429 429 in one test. Other tests returned 429 on 3 to 6 of 6 requests each
  • ClaudeBot: 200 429 429 429 429 429 in one test.
  • Bytespider: the connection was dropped every time.
  • Googlebot, OAI-SearchBot, ChatGPT-User, Claude-User and PerplexityBot: 200 on all 6 requests each in the test of 6 quick requests. Claude-SearchBot returned 200 on all 6 requests in most tests and 429 on 4 of 6 requests in one test, so its result changes between tests. Requests sent quickly can get 429.
  • In one run, GPTBot and ClaudeBot got 200 when single requests were 3 seconds apart. In another run, ClaudeBot got 429 on 2 requests 3 seconds apart, and GPTBot got 200 on both.

So the legacy server (nginx on WP Engine) appears to rate-limit the 2 AI training crawlers. The limit may be per user agent or per IP address: ClaudeBot got 429 on 3 to 6 of 6 requests in the tests. Search and user-fetch crawlers were mostly unaffected: Claude-User, ChatGPT-User, PerplexityBot and OAI-SearchBot returned 200 on all 6 requests, and Claude-SearchBot did so in most tests (it got 429 in one test). The tests used user-agent names only, not the crawlers' real IP addresses. This finding is LIKELY. The new site on Netlify returned 200 to GPTBot and ClaudeBot in the tests.

A-24MediumNo email address and no About page. (Same on new site.) Neither site shows an email address on /contact-us/ or anywhere in the page code (HTML). /about/ and /about-us/ return 404 on both sites. The contact page has a phone link, a contact form, and Facebook and Instagram links. Google's self-assessment asks about "clear sourcing, evidence of the expertise involved, background about the author or the site that publishes it, such as through links to an author page or a site's About page" (G-12). Add an About page (owners, history, location, photos of the building) and a visible contact email.

A-25MediumLegal and booking risks shared with the new site. The legacy site has the same gaps as the new site on:

  • accessible-room descriptions under the ADA (US disability law) (N-51);
  • headline prices with no fee note beside them, "From $160 / night" (N-52);
  • the shared "Vacation VI" Lodgix booking page (N-53);
  • tracking cookies before consent, including the Universal Analytics cookie _gat_UA-185349894-1 (N-55);
  • stock photos (16 distinct file names on the legacy site, some of them resized copies of one photo, N-58).

See Part B.7 for the evidence and fixes.

// low

  • A-15Low robots.txt has Crawl-delay: 10 above the first User-agent line, so it applies to no group.
  • A-16Low http://www.marketplacesuitesusvi.com/ takes 2 redirects to reach the secure address without www.
  • A-17Low Hotel schema postalCode is "U.S. Virgin Islands". VacationRental entries have no geo, and suite 9's has no address.
  • A-18Low 4 page titles repeat the brand, for example "Fall USVI Escape at Marketplace Suites | Marketplace Suites". (Same on new site.)
  • A-19Low 24 page titles over 60 characters and 4 meta descriptions over 160 characters. (Same on new site.)
  • A-20Low The FAQ page embeds YouTube with third-party cookies (youtube.com/embed, not youtube-nocookie.com).
  • A-21Low No Google Consent Mode default (gtag('consent','default',...)) before the Google Ads and GA4 tags.
  • A-22Low The apple-touch-icon is a .ico file. iOS needs a 180 x 180 PNG.

A.3 What the legacy site does well

  • Real-user LCP and CLS pass at the 75th percentile (A.1); INP has no real-visitor data, so a full Core Web Vitals pass is not shown.
  • Name, address and phone are the same in the footer and on the contact page: "5000-4A Estate Enighed, Route 107, St. John, USVI 00830" and 1-800-727-6610. The schema postalCode is wrong (see A-17). One blog post lists a wrong phone number (see Part E).
  • Date-search URLs (/suites/?ldx_date_range=...) canonicalize to /suites/. UTM URLs canonicalize to the clean URL.
  • Private files and folders (/.git/, debug.log, /wp-content/uploads/ directory listing) are blocked.

// part b

Part B: New site

Home page of the new Netlify site at 1440 pixels
Figure: the rebuilt home page, marketplace-suites-site.netlify.app, at 1440 px.

B.1 Summary

The new site is a careful copy of the legacy site. URL parity is nearly complete: 91 of 93 legacy sitemap URLs return 200, and the other 2 redirect to /suites/. Redirects are in place for 11 of the 22 old WordPress paths that do not load as pages on the new site (the other 11 return 404, page not found), but the ?p=ID short links (old numbered links) are not redirected (75 of 93 legacy pages expose them). Every legacy image file used in page HTML still loads on the new site (11 files listed only in the legacy sitemap do not load: see N-7, on images). The pages on the new templates score 100 for accessibility and SEO.

The main problem is that only 14 of 91 pages use the new templates. The other 77 pages (all 42 blog posts, 13 category pages, 6 Marketplace tenant pages, 8 info pages, 6 landing pages, and the 2 index pages /blog/ and /marketplace/) are snapshot pages (static HTML copies of the old pages). They still load code libraries (jQuery, Bootstrap 4.5.3, Slick, Font Awesome) and the Lodgix plugin script (ldx-public.js, 767 KB uncompressed, about 200 KB gzipped) and the render-blocking ldx-styles.css (422 KB uncompressed, about 80 KB gzipped) and the old theme CSS, with legacy-fixes.js on top. A Google PageSpeed speed test, one run per page, on all 184 pages shows the snapshot pages have a lower median score (the middle value) on the new site (64 against 67 on the legacy site), but 34 of the 77 snapshot pages score higher on the new site (posts: median 62 against 66.5, median LCP 10.4 s on both). The pages on the new templates are much faster (suite pages: median 74.5 against 54, LCP 4.8 s against 11.7 s).

59 findings: 3 Critical, 14 High, 26 Medium, 16 Low.

What is solid (B.2)

  • Four parts are complete: 404 handling, canonicals (the preferred address of each page), the image paths used in pages, and metadata parity. The redirect map is not complete: the ?p=ID short links on 75 of 93 legacy pages are not redirected (N-49).
  • The date search works for the dates tested: it returns availability and totals, and the "Book now" link carries the dates and guest count to Lodgix.
  • The 14 rebuilt pages score 100 for Lighthouse accessibility and SEO. The new site returned 200 to GPTBot and ClaudeBot (AI company crawlers) on 6 pages in tests (/, /suites/, /blog/, /faq/, /contact-us/, /things-to-do/). Only 2 of those 6 use the new templates.

What blocks launch

  • The 77 snapshot pages (N-1). They bring little or no median speed gain until they use the new templates.
  • Tracking that misleads (N-3, N-5, N-6, N-33). Views of /thank-you/ send a form_submission conversion event, and the site's form script never records a real submission. Some page loads send the Google Ads tag twice. The home pages on both sites load a Universal Analytics tag (UA-185349894-1), which Google stopped processing in 2023 (in 2024 for some 360 accounts). The "Book now" click sends no nights value and no total, and no checkout-start event (begin_checkout; the plan leaves that event to the Lodgix page, see item 3).
  • Booking path problems (N-34, N-53). For 2026-12-30 to 2027-01-03, the availability service (an API) returns a 5-night minimum-stay message, and the suite cards show "Booked". Payment happens on a shared "Vacation VI" booking page (see N-53).
  • Legal and approval items (N-32, N-51, N-52). Changed policy text, accessible features described on suite 12 only, and headline prices with fees added in the booking breakdown (N-52).
  • Gaps at the switch (N-10, N-41, N-48, N-49). Both Netlify addresses must redirect, the DNS (domain name system) change needs exact records and a rollback plan (a way to switch back), and 75 WordPress short links need redirects.

What can follow the launch

  • Speed work on fonts, CSS (style files), images and caching (N-4, N-7, N-8).
  • Data that goes stale: review counts, ratings and a rate table that ends in 2026 (N-11, N-36, N-37).
  • Structured data, security headers, accessibility details and consent (N-13, N-19, N-39, N-40, N-55).
Area Result
Sitemap URLs New site: 91 (all 200). 13 more tenant pages (19 in all) under /marketplace/ return 200 on the new site but are in no sitemap
Rebuilt pages New site: 14 of 91 pages use the new templates (home, /suites/, 12 suite pages)
PageSpeed mobile, median by template (all 184 pages, 1 run each), new site / legacy site Home 86 / 59. Suite pages 74.5 / 54. /suites/ 77 / 58. Landing and beach pages 83 / 69. Marketplace tenants 69 / 64. Info pages 79.5 / 89. Categories 64 / 66. Posts 62 / 66.5. Blog index 87 / 67. /marketplace/ 83 / 44.
Mobile LCP on the new site, one PageSpeed run per page 66 of 91 pages above 4 s. 8 pages at 2.5 s or less. On 61 pages the LCP element is a large /wp-content/uploads/ image, and on 13 (the suite pages and /suites/) a Lodgix photo.
Note on lab scores A single run varies a lot. For example, on the new site /blog/ scored 46 in one run and 87 in another. Use the template medians, not single runs. A test of 5 pages (3 runs each, local Lighthouse in headless Chrome) swung by up to 29 points between runs, and it did not always show the new site ahead: the new /suites/ ranged from 40 to 69 and the legacy one from 45 to 65. Read the gap between the sites as a direction, not a fixed number.
Lighthouse accessibility New site: 100 on the 14 rebuilt pages, 87 to 96 on the 77 snapshot pages
Lighthouse SEO 100 on 73 of 91 pages. 18 pages score lower: 92 on /blog/, 6 category pages and 2 posts ("READ MORE" link text on the blog pages, "here" link text on the 2 posts); 92 on 5 pages with no meta description (/category/level-1/ to /level-3/, 2 Marketplace tenant pages); 85 on 4 category pages with both problems.
Security headers HSTS (forces secure connections, with preload), X-Frame-Options, nosniff, Permissions-Policy. No CSP (content security policy, see N-19), no Referrer-Policy (limits the address sent to other sites).
AI crawler access robots.txt (the crawl rules file) allows all 27 tested crawlers, and the server answered 200 with the full page to all 9 crawler user agents (the names bots send) tested, including 6 fast requests in a row from GPTBot and ClaudeBot.
GEO Optimizer score (AI search readiness) 69 out of 100
Browser console errors (16 page types loaded) 0
Field data (CrUX, real-user data from Chrome) None yet. The PageSpeed result has no field data.

B.2 What the new site already does well

Not every item below is fully met. On 9 of 12 suite pages, the review total in the header differs from the Read all link.

  • Redirect map. /property-category/*, /tag/*, /offers/, /author/*, /wp-admin/, /sitemap_index.xml, /page-sitemap.xml, /blog/feed/, /category/blog/feed/, per-post /feed/ URLs and uppercase paths return a single 301 (permanent redirect) to a live page (one test URL per pattern). /wp-admin/ and /author/* (one test author page) go to the home page.
  • 404 handling. Unknown paths return a real 404 (page not found) that is marked noindex (search engines should not list it).
  • Canonicals. Every page that search engines can list points to https://marketplacesuitesusvi.com/... (the noindex pages have no canonical tag). Date-search and UTM URLs canonicalize to the clean URL. The blog list runs to /blog/page/5/, and /blog/page/2/ points to itself as its preferred address.
  • Images. All 121 unique /wp-content/uploads/... paths in the img src (the image address) of the new pages load.
  • Metadata parity (the same page settings). Title, meta description, canonical and robots tag are the same as the legacy site on all 91 shared URLs. Only the /suites/ H1 (main heading) changed ("Suites" to "Suites in Cruz Bay, St. John"), which reads as a more specific heading.
  • Schema fixes. Hotel postalCode is now 00830. The VacationRental reviewCount values match the header review count on all 12 suite pages. The Read all link shows a lower count on 9 of them (suite 9: 38; suite 5: 28; suite 6: 21; see A-13 on review counts). VacationRental entries now have an address.
  • Booking flow. The date search on /suites/ calls /api/ldx. For 10 to 14 Dec 2026 it returned 4 open suites and 8 booked, with totals. The suite page shows the 4-night total and a "Book now" link to Lodgix with the dates and guest count filled in.
  • Orphan pages reduced. The 6 Marketplace tenant pages now have internal links (legacy site: 0).
  • Mobile. No horizontal scroll on any of the 16 page types loaded at 390 px (a phone screen width; the legacy home page has it).
  • Search Console verification. The same google-site-verification code is on both sites. Whether the site stays verified after the switch cannot be seen from the page.
  • No exposed files. /.git/HEAD, /.env, /netlify.toml, /package.json, _redirects and two sampled source map files also return 404.

B.3 Findings

// critical

N-1Critical77 of 91 pages are snapshot pages, not new templates.

A blog post on the new site at phone width, still using the old WordPress post template
Figure: /best-beaches-on-st-john/ on the new site at 390 px. The post is a WordPress snapshot: old template, old scripts, no booking bar.
  • Evidence 77 pages load /wp-includes/js/jquery/jquery.min.js, jquery-migrate, bootstrap.bundle.min.js 4.5.3, slick.min.js, global.js, wp-includes/js/dist/hooks.min.js and i18n.min.js, ldx-public.js (767 KB uncompressed, about 200 KB gzip-compressed), ldx-styles.css, the old theme style.css, Bootstrap CSS, Slick CSS, Font Awesome from cdnjs, and the new /css/site.css, /js/site.js and /js/legacy-fixes.js. Google Fonts load twice on each of the 77 snapshot pages (2 different css2 URLs).
  • Only these 14 pages are free of the old WordPress code: /, /suites/ and /suites/suite-1-marketplace/ to /suites/suite-12-marketplace/.
  • PageSpeed mobile medians over all pages, one run per page, new against the legacy site: posts 62 against 66.5, categories 64 against 66, info pages 79.5 against 89. The median post LCP is 10.4 s on both sites. The new templates show what is possible: suite pages 74.5 against 54, home 86 against 59.
  • Impact the blog posts are written for searches that want information LIKELY. As it stands, the migration brings them little or no median speed gain.
  • Fix build 3 more templates (post, archive/category, simple page) using the same building blocks as the home and suite pages. Keep the post body HTML. Drop every /wp-includes/ and /wp-content/plugins|themes/ file and legacy-fixes.js.

N-2CriticalLink on /marketplace/ to a site that redirects to another domain. (Inherited from the legacy site, see A-1, the same link in Part A.) chelseadrugstoreredhook.com returns a 301 to kebaya4d.org. Remove the link before launch.

N-3Critical/thank-you/ sends a form_submission event on page view and can appear in search results. (Inherited from the legacy site, see A-2.) A plain load sends GA4 form_submission. The page is in the sitemap with index, follow. The contact form's action attribute points to /thank-you/, and the redirect after a submit is not shown. Add noindex, remove the page from the sitemap, and send the conversion when the form is submitted.

// high

N-4HighRender delay is most of LCP, even on the home page, which uses the new templates.

  • Evidence one local Lighthouse run (mobile, home). Simulated LCP is 11.1 s. In the recorded test, render delay after the hero image loaded is 995 ms of 1,360 ms (73%), so render delay is the largest part of LCP. Render-blocking: Google Fonts CSS (est. saving 811 ms) and /css/site.css (estimated saving 171 ms). Third-party blocking time: HubSpot 410 ms, GTM 215 ms (main-thread time 1,092 ms and 485 ms). In one PageSpeed run, LCP for the same page was 3.3 s. The two tests give different numbers.
  • Fix self-host (serve from this site) the 2 font families as subset WOFF2 with preload for the above-the-fold weights. Inline the critical CSS for the header and hero. Load HubSpot on first interaction or idle.

N-5HighDuplicate and dead tracking tags.

  • The Google Ads tag AW-456147901 loads directly in the page header (<head>). On /contact-us/ at 1280 px, the plain tag URL loaded in all 8 runs, and the GTM-parameter version (gtag/js?id=AW-456147901&cx=c&gtm=...) loaded in 4 to 6 of 8 runs (the count varies by run). On the home page at 1280 px, the plain tag URL loaded in all 10 runs, and the GTM-parameter version in 2 to 6 of 10 runs. At 390 px, the home page loaded the plain tag URL once in each of the 10 runs, and the GTM-parameter version in 1 to 5 of the 10 runs. GTM GTM-TH793K7 loads GA4 G-BBJ4DZFX93 and six Universal Analytics tags. The home page and /contact-us/ request google-analytics.com/analytics.js (Universal Analytics, which Google stopped processing in 2023, and in 2024 for some 360 accounts).
  • The <head> has gtm4wp dataLayer text copied from WordPress (for example "pagePostAuthor":"admin" and "pagePostType":"frontpage" on the home page, and an account name or a first name as author on posts).
  • There is no Consent Mode default before the tags.
  • Fix keep GTM as the only way that tags load. Delete the Universal Analytics (UA) tag in GTM. Replace the gtm4wp text with a real dataLayer. Add a Consent Mode v2 default (denied for regions that need consent, granted elsewhere).

N-6HighBooking clicks reach the data layer, but no event carries nights, and only ms_quote carries a total.

  • The "Book now" links use ?selected_reservations=... only after dates are picked. With no dates, the suite 9 link goes to https://www.lodgix.com/6283/?rental_property=84971&referer=.... Whether GA4 cross-domain linking is set up cannot be confirmed from outside. /js/site.js already sends a book_now_click event (link_url, suite_id) on each Lodgix click and an ms_search event on each search. ms_search carries the dates and guests (check_in, check_out, guests); book_now_click carries no dates when none are picked, and its link_url then holds only rental_property and referer; after dates are picked, link_url holds selected_reservations with the check-in and check-out dates and the guest count. Neither event carries the nights or the total, and the site sends no begin_checkout event. The Lodgix booking page itself carries a tag labelled "Google tag (gtag.js) for Marketplace Suites Google Ads", so the Ads tag may record bookings there. The Ads conversion settings are not visible. Confirm in Google Ads which conversion actions are triggered on Lodgix.
  • Fix add the dates, nights and total to book_now_click, and map it to a GA4 key event (a conversion goal) and an Ads conversion in GTM. Add lodgix.com to GA4 cross-domain linking. Ask Lodgix how to record a conversion on the booking confirmation.

N-7HighImages: few modern image formats (WebP, AVIF) and 45 PNG image files. The legacy sitemap also lists 86 image URLs, and 11 of them return 404 on the new site (for example /wp-content/uploads/2026/01/st-croix-scaled.jpg, /wp-content/uploads/2026/03/beach-bag-scaled.png and /wp-content/uploads/2025/11/mps-2-room-delux01.webp). Restore these files, or 301 them to the resized copies that the pages use, so that image search keeps its entries.

  • Of 123 local image files in the img src of the new pages (121 uploads and 2 logos under /img/), 45 are PNG, 76 JPEG, 2 WebP and 0 AVIF. On the home page, Starfish-market-in-St-John@2x.png (232 KB) and sam_jacks_10interior@2x.png (217 KB) are photos saved as PNG. Blog images go up to 3.97 MB (beach-bag-2048x1117.png, used on /best-beaches-on-st-john/). The hurricane file (hurricane-tropical-villa-stormy-art.png) is 2.52 MB.
  • 83 of 91 pages have image tags (<img>) with no width/height.
  • Lodgix photos are hotlinked from pictures.lodgix.com with no cache lifetime (cacheLifetimeMs: 0).
  • Fix use the Netlify Image CDN (/.netlify/images?url=...&w=..., with Lodgix in [images] remote_images) or convert at build time. Keep the old /wp-content/uploads/... URLs live. Add width/height to every image.

N-8HighVisitors' browsers check the site's own JavaScript and CSS files again on each load. /js/site.js, /js/marketplace-suites.js and /css/site.css return max-age=0,must-revalidate. Add a content hash (a version code) to the filenames and serve them max-age=31536000, immutable.

N-9High28 dead or unsafe outbound links on the new site. (Inherited from the legacy site, see A-5.) 21 links return 404, 2 domains no longer resolve, and 5 redirect to other domains or fail on SSL (the secure connection; includes N-2). 44 more return 403 or 429 to bots and need a manual spot check. List: Part G, G.3, which lists all 28 of these links and one link that only the legacy site uses.

N-10HighPlan the switch to the Netlify host. marketplace-suites-site.netlify.app is open to crawlers and is protected only by canonical tags that point to the main domain. The .netlify.app address serves the site now. Whether it keeps serving after a custom domain is added is not confirmed. At launch, add https://marketplace-suites-site.netlify.app/* https://marketplacesuitesusvi.com/:splat 301! to _redirects.

// medium

N-11MediumStatic snapshots of live data go stale. Suite pages show the rating, review count and headline price as static HTML, for example "$195 / night and up" on suite 9. The 12 suite pages show $175, $195 or $245. On suite 9, "4.9 out of 5 stars" and "40 reviews" are separate elements. The rating values are in aggregateRating. Rebuild the site every day so that it pulls reviews, room rates and photos from Lodgix.

N-12Medium/api/ldx error handling and abuse risk. A reversed date range or invalid dates return 200 (success) with a JSON-encoded string (text) body instead of an object. guests=-5 is accepted and returns a normal availability answer (the API ignores guests). GET returns 400 with body 0. There is no caching (a valid call took 1.3 s to 2.4 s in repeated runs). About 42 calls to the availability API in the booking test (see Part D) showed no rate limit response. Return 400 or 502 with a JSON object, cache each answer for 60 to 120 s, and add a rate limit.

N-13MediumJSON-LD leftovers from Yoast.

  • WebSite.potentialAction is a SearchAction to /?s=.... The site has no search feature (/?s=beach returns the home page).
  • Organization and Hotel are 2 unlinked nodes for 1 business. The Hotel image is the SVG logo (a vector image file), which the schema says is 1024 x 1024.
  • VacationRental nodes have no geo and use Lodgix _preview images. The legacy site used the full-size files.
  • 9 Article entries give the author as a single lowercase name and 11 as a first name only.
  • Fix 1 Hotel entry with @id, geo, priceRange, check-in and check-out times, real photos and sameAs (Google Business Profile, Tripadvisor, Facebook, Instagram). Link each VacationRental with containedInPlace. Remove the SearchAction. Use real author names.

N-14MediumThin and placeholder pages are indexable. (Inherited from the legacy site, see A-8.) /category/level-1/ to /level-3/ (3 words each), /thank-you/, and 6 Marketplace tenant pages in the sitemap with 13 to 33 words. 301 the placeholder categories to /blog/ and remove them from the sitemap.

N-15MediumOrphan pages. /top-things-to-do-in-st-john-us-virgin-islands/ and /st-john-shines-in-autumn/ have no internal links from any sitemap page. 39 more pages have only 1 or 2 links from other pages (counting each linking page once), including 29 blog posts (for example /10-travel-tips-for-the-u-s-virgin-islands-during-hurricane-season/, 1 link from another page). Add them to related-post lists.

N-16MediumAccessibility and link text on the snapshot pages. (Inherited from the legacy site.)

  • 59 pages show date, byline (author name line) and folder icons with alt="Generic placeholder image". They are decorative, so they should have alt="".
  • Blog lists use "READ MORE" link text. This costs 8 points of Lighthouse SEO on /blog/ and on 6 category pages. The 2 posts score 92 because one link reads only "here". 4 more category pages score 85 because they also have no meta description. Use the post title or an aria-label.
  • Links rely on colour only (no underline) in body text on several page types, including posts and category pages. Low colour contrast on /contact-us/ and the beach page.
  • 34 links or buttons on /blog/ and 40 on /category/blog/st-john/ are under 24 px (pixels) in width or height at 390 px.

N-17MediumSitemap has no lastmod (last-updated date) and no image entries. sitemap-0.xml lists 91 <loc> values only, although it declares the image namespace.

N-18MediumNo og:image on 36 pages, including the home page, /blog/ and every category page.

N-19MediumSecurity headers: add CSP and Referrer-Policy. Start with Content-Security-Policy-Report-Only that allows GTM, Google Ads, HubSpot, Lodgix, YouTube and Netlify Forms.

N-20MediumForms: check that messages arrive. The contact, inquiry and suite-deals forms post to Netlify Forms. Confirm in the Netlify dashboard that all 3 are found and that notifications reach the owner.

// low

  • N-21Low Internal links to /blog (62 links) and /marketplace (1) without the final slash cause an extra redirect (301).
  • N-22Low /suites/index.html returns 200 (duplicate of /suites/). Add this redirect rule: /*/index.html /:splat/ 301.
  • N-23Low /property-tags/deluxe-2-bedroom-suite/ returns 200 as a noindex, follow snapshot page, and so do /property-tags/standard-suites/ and /property-tags/deluxe-suites/. /property-tags/family-suite/ returns 404 on the new site, but the legacy site redirects it to the deluxe tag. Add this redirect rule: /property-tags/* /suites/ 301.
  • N-24Low /comments/feed/ returns a copied WordPress comments feed. Delete it, or redirect it (301) to /feed/.
  • N-25Low HubSpot loads with ?integration=WordPress. Use the plain embed code.
  • N-26Low The /faq/ YouTube embed uses youtube.com with an empty origin= setting. Use youtube-nocookie.com and a click-to-load facade.
  • N-27Low The apple-touch-icon is favicon.ico. Use a 180 x 180 PNG. There is no web app manifest.
  • N-28Low Heading levels (h1 to h6) skip on some pages (for example h1 to h5 on /things-to-do/, h1 to h3 on /cheap-flights-to-st-john-us-virgin-islands/).
  • N-29Low 4 page titles repeat the brand name, 24 titles are over 60 characters, and 4 meta descriptions are over 160 characters. (Inherited from the legacy site, copy work for the SEO batch.)
  • N-30Low No llms.txt. In this review, it looks cheap to add, but Google's changelog (June 15, 2026) says these files "aren't needed for Google Search".
  • N-31Low No Bing Webmaster Tools verification tag CONFIRMED and no IndexNow string in the home HTML (the IndexNow key file at the site root cannot be checked from outside). Add both at the switch.

B.4 GEO and AI search readiness (new site)

  • Crawler access: robots.txt allows all 27 AI and search crawlers tested, for example GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended, Bingbot and CCBot.
  • Rendering (what the browser shows): full content is in the HTML. On the home page and suite 9 page, the HTML text matches the rendered text.
  • Business identity signals: the GEO tool found no sameAs, no About page and more than one form of the brand name.
  • Facts on suite pages: short plain-text facts such as "Elevator" and "No stairs with luggage" (shown as two separate elements), "24-hour generators" and "Sleeps 4" appear easy for AI answers to quote. Keep them as HTML text.
  • The tool's suggestions for /ai/summary.json, /ai/faq.json and /.well-known/ai.txt do not appear in the IANA registry of well-known URIs, so they are not recommended.

B.5 Findings: tracking, booking and policy

These findings come from browser tests of the suite search and site pages, a scan of all 184 pages and the content review. Items marked CONFIRMED were reproduced on the site.

// high

N-32HighPolicy and service facts changed during the migration. CONFIRMED The owner must approve these before launch.

  • /cancellation-policy/: the legacy site says the balance and "12.5% Virgin Islands Hotel Tax are due 30 days prior to your arrival date". The new site says 60 days. Legacy suite pages already said 60 days, so the legacy site contradicted itself. Confirm against the Lodgix rental agreement.
  • /faq/: the legacy site says "Currently, housekeeping during guest stays is not provided". The new site says housekeeping "can be arranged on request". That reads as a new service promise, so guests may ask for housekeeping.
  • /cancellation-policy/ still has text from a sister property ("The Hills", helicopter transfers) on both sites.
  • Suite pages: the cancellation tiers (5%, 50%, 100%) and the detailed storm clause match the legacy policy text. The short summary line on the suite pages "Full refund less 5% if a named storm heads our way" leaves out the 100-mile distance and 48-hour timing conditions.

N-33HighThe site's own form script never records a form submission. CONFIRMED /js/marketplace-suites.js line 97 skips any form without the data-netlify attribute. The live forms in the page code lack that attribute, so the script never records a submission. Combined with N-3 (GTM fires form_submission on every /thank-you/ page view), the site counts false conversions and also counts real ones, because the contact form posts to that page. Fix: detect the forms by the hidden form-name input, and fire the conversion on submit.

N-34HighMinimum-stay failures are shown as "Booked". For a 4-night New Year stay, all 3 suite cards on /suites/ say "Booked", but the API shows 7 suites open for 5 nights. The real reason appears only in a hover tooltip (the title attribute), not as visible text on the card. Fix: show the reason ("Minimum stay 5 nights") on the card, and suggest the nearest valid stay.

N-35High77 of 91 pages have no visible booking button on phones. On /faq/ and /contact-us/ at 390 px, the mobile header has only the menu button, the logo link and the phone link. The rebuilt pages have a sticky booking bar ("Check dates"). Fix: add the same bar in the new templates (N-1).

Suite 9 on the new site at phone width with the sticky booking bar showing a 4-night total
Figure: suite 9 on a rebuilt template at 390 px, with dates picked. The sticky bar shows the total and a Book now button. Snapshot pages have no such bar.

// medium

N-36MediumNightly "from" prices come from a rate table in the page code, and the table ends in 2026. The rate table ends on 2026-12-25 for 9 suites, on 2026-12-31 for suite 5, and on 2026-11-30 for suites 3 and 9. After that, the default rates show. Fix: the daily rebuild in N-11.

N-37MediumReview counts disagree on the same suite page. CONFIRMED For example suite 1 shows "29 reviews" next to "Read all 28 reviews", suite 5 shows 32 against 28, and suite 9 shows 40 against 38. Counts disagree on 9 of 12 suites (suites 7 and 8 agree, and suite 3 has no "Read all" link). Fix: generate both numbers from 1 value.

N-38MediumSelf-serving review markup. All 12 suite pages add an aggregateRating (an average score built from guest reviews) to the hotel's own VacationRental pages. Google's review snippet guidelines say: "If the entity that's being reviewed controls the reviews about itself, their pages that use LocalBusiness or any other type of Organization structured data are ineligible for star review feature", and "Don't aggregate reviews or ratings from other websites." The stars will not show in search results. Keep the visible reviews. Decide whether to keep the markup.

N-39MediumKeyboard and no-JavaScript problems.

  • On a booked suite, the disabled "Book now" can still be pressed with the Enter key, and it sends the guest to Lodgix.
  • The date calendar is hard to use with a keyboard.
  • The skip link scrolls to #main but leaves focus on the body.
  • Without JavaScript, the date search loses the dates. On phones, the header shows a Menu button and no navigation links, but the footer navigation (9 links) stays visible.
  • The inquiry form has novalidate, and jQuery Validate (in ldx-public.js) runs the checks in place of the browser (not tested by submitting).

N-40MediumLinks in body text are marked by colour alone on 77 pages. axe reports link-in-text-block (serious) on 77 of 91 new pages, mostly the footer link to vacationvi.com. color-contrast fails on 10 new pages (111 nodes, 20 on each beach page). The legacy site is worse overall (0 of 93 clean pages, against 14 of 91 on the new site).

N-41MediumThe Netlify branch address is a public copy. https://main--marketplace-suites-site.netlify.app/ returns 200 with no X-Robots-Tag. Deploy previews correctly send noindex. Add the 301! rule for this host too, or turn off branch deploys for main.

N-42MediumCategory taxonomy is bloated and mislabeled. 13 category pages for 42 posts. /category/blog/bvi/ holds 1 post, and that post is about the USVI. 6 posts sit in "uncategorized". All category pages share the main heading (H1) "Marketplace Suites Blog". Keep 3 to 5 real categories, each with its own H1 and intro text, and redirect the rest (301).

N-43MediumarticleSection is an object, not text, on 3 posts ({"1":"Virgin Islands"}, from Yoast). The Schema.org validator flags it as an error. Same on the legacy site.

N-44MediumThe privacy policy does not mention the tools the site uses. No mention of cookies, Google Analytics, Google Ads, HubSpot or Netlify Forms. The privacy and terms text is hard to read. Same on the legacy site. Legal review needed.

// low

  • N-45Low The API ignores guests; capacity is checked only in the browser. Invalid booking_dates are ignored without a message. A group-size chip that conflicts with the searched guests gives an empty result with no message. The results heading does not show the year.
  • N-46Low Travel booking sites also appear in the brand search results. A search for "Marketplace Suites" St John returns the official home page first, then TripAdvisor, a hotel booking site and Expedia (N-54, search rankings). Each suite also has its own OTA listing, which splits the brand's online presence. Supports the sameAs work in N-13.
  • N-47Low The FAQ rich result no longer appears in Google Search. Google's docs say it no longer appears from May 7, 2026, and the FAQPage doc now redirects to the changelog. The /faq/ pages on both sites have no FAQPage markup (hidden page data).

Checked and clean (no action):

  • No page on either site has 2 canonical (preferred address), title, description or robots tags in its own HTML. (4 suite pages do share 1 title text; see C-7.)
  • og:url matches the canonical on every page.
  • No page blocks zoom, and no page has garbled characters.
  • No LCP image is lazy-loaded (loaded late) except on /suites/, where all content images, including the LCP image, have loading="lazy". All 359 srcset image URLs on the new site return 200.
  • The new site serves the same page to Googlebot, Googlebot smartphone, Bingbot and 6 AI crawlers as to a browser.
  • The RSS feed has the same 10 newest items as the legacy site, with links on the production domain (the main site address).
  • Certificate logs show only marketplacesuitesusvi.com and www..

// medium

N-48MediumDomain name settings (DNS) for the switch, and missing email-security records. CONFIRMED by DNS lookup

  • DNS is at GoDaddy LIKELY. The name servers are ns03 and ns04.domaincontrol.com. The apex A record points to 104.196.63.107 (WP Engine) and www is a CNAME to marketplacevi.wpengine.com. The A and CNAME records have a TTL of 3,600 seconds (1 hour). Lower the TTL to 300 seconds a day before the switch, so that undoing the switch takes effect quickly.
  • Netlify's docs say: for an external DNS provider, use an ALIAS to apex-loadbalancer.netlify.com where the provider supports it, or else an A record to 75.2.60.5, and CNAME www to <site-name>.netlify.app. Netlify recommends a subdomain as the primary domain when DNS is outside Netlify. The site uses the apex everywhere, so keep the apex as primary to avoid changing every canonical address.
  • The domain has no MX, no SPF, no DMARC and no other TXT records. With no MX record, the mail standard (RFC 5321) sends mail to the A record host, so the switch could affect mail. No mail test was run. Without SPF or DMARC records, the domain publishes no rule against mail that claims to come from @marketplacesuitesusvi.com. If the domain sends no mail, add v=spf1 -all, a DMARC record with p=reject, and a null MX. First confirm that the HubSpot newsletter on the new site ("Seasonal specials in your inbox") does not send from this domain. If it does, set up SPF and DKIM (sender signatures) for HubSpot instead.
  • Search Console verification is the meta tag (no DNS TXT record), and the tag is on the new site. Whether the ownership check survives the switch is not tested.

N-49MediumOld WordPress short links break. CONFIRMED 75 of 93 legacy pages publish a short link such as https://marketplacesuitesusvi.com/?p=400281. Legacy answers ?p= links with a 301 redirect. The new site ignores the query and shows the home page with a 200. Links shared in old emails, social posts or bookmarks would land on the home page. A ready redirect list (75 rules, in Netlify's redirect format) is in Part G, G.6. Test it on a deploy preview first.

N-50MediumNo email address and no About page. Same as A-24. Add both in the new templates.

These findings come from a compliance review and a search-visibility review. Items marked "legal review needed" are risk flags, not legal advice.

// high

N-51HighNo description of accessible features (ADA). (Both sites. LIKELY. Legal review needed.) The US ADA rule for places of lodging, 28 CFR 36.302(e)(1)(ii), requires a hotel to "identify and describe accessible features in the hotels and guest rooms offered through its reservations service in enough detail to reasonably permit individuals with disabilities to assess independently whether a given hotel or guest room meets his or her accessibility needs". The rule applies to reservations made by any means, including by telephone, in-person, or through a third party. Only suite 12 describes accessibility, on both sites: "Suite 12 is in compliance with the Americans with Disabilities Act Standards for Accessible Design. This includes an ADA compliant refrigerator, wider openings, transfer shower, elevator and parking", plus "Wheelchair Accessible" under its Suitability heading. /which-marketplace-suite-is-right-for-you/ repeats this. /suites/ and the other 11 suite pages say nothing about accessibility; the new pages list only "Elevator" and "No stairs with luggage". No page gives door widths, bed height, grab bars or communication features. Legacy once had an "ADA Suite" tag page (Wayback capture from June 2023), which now returns 404 on both sites. Fix: name the accessible suite on /suites/ and on the booking path. With the owner, complete the suite 12 description: door widths, bed height, grab bars, shower seat and communication features. State on the other suite pages that they are not accessible rooms.

Suite 12 page text stating ADA compliance, an ADA compliant refrigerator, wider openings, transfer shower, elevator and parking
Figure: suite 12 is the only suite page that describes accessibility. No door widths, bed height, grab bars or communication features.

N-52HighThe headline price leaves out mandatory fees (FTC fee rule). (Both sites. LIKELY. Legal review needed.) The FTC Rule on Unfair or Deceptive Fees (16 CFR Part 464) has applied to short-term lodging since May 12, 2025. The rule's text says a business may not "offer, display, or advertise any price of a covered good or service without clearly and conspicuously disclosing the total price". "Total price" means the maximum total of all fees or charges a consumer must pay, "except that government charges, shipping charges, and fees or charges for any optional ancillary good or service may be excluded."

Suite 9 price panel: 195 dollars a night and up, then 4 nights 1,028 dollars, discount, cleaning fee 95 dollars, processing fee 56.54 dollars, damage insurance 45 dollars, taxes 121.10 dollars, total 1,191.43 dollars
Figure: suite 9, 10 to 14 December 2026. The headline says $195 / night and up; the total adds a cleaning fee, a processing fee and damage insurance before tax.
  • The new site shows "$195 / night and up" and "from $175 a night"; the legacy site shows "From $160 / night".
  • For suite 9, 10 to 14 December 2026 CONFIRMED, the price breakdown after dates are picked is: 4 nights $1,028.00, discount −$154.20, Cleaning Fee $95.00, Processing Fee $56.54, Damage Insurance $45.00, taxes $121.10, total $1,191.44, the amount shown at Lodgix checkout (the price panel on the site shows $1,191.43).
  • Cleaning, processing and damage insurance are not government charges. If they are mandatory, the advertised nightly price should include them, or the page should show the total more prominently than the nightly rate.
  • Fix confirm with the owner and Lodgix which fees are mandatory, then show a nightly or stay price that includes all mandatory fees wherever a price appears (home, /suites/, suite pages, ads).

N-54HighThe official site wins its brand search but does not appear for the main hotel searches. CONFIRMED. In a Google results check for "marketplace suites st john", the home page is the first organic result, ahead of TripAdvisor and Expedia (4th). Other pages of the site appear at organic positions 7 (the blog index), 8 (the Starfish Market page) and 9 (a category page). For "marketplace suites usvi" the first organic result is the /things-to-do/ page, and the site also appears at positions 2, 4, 8, 9 and 15 with other pages (the home page is not among them). Google shows many of these results as redirect links, and each one leads to the page named here. For "hotels in cruz bay st john", "where to stay in st john usvi", "st john usvi suites with kitchen", "st john usvi hotels" and "cruz bay st john vacation rental" the official site is not in the top 20. A Google Business Profile exists and is claimed (Part I). Fix: link the brand pages (blog index, tenant pages) to the home page, and give the home page and /suites/ the text that hotel searches use (Part I). Check Search Console for brand-query impressions before and after the switch. Ask Lodgix whether it can supply data for Google's free hotel booking links. Extends N-46.

// medium

N-53MediumGuests book on a shared "Vacation VI" page. (Both sites use it. CONFIRMED with a screenshot.) The "Book now" links in the page code go to https://www.lodgix.com/6283/ with only the parameters rental_property and referer. A script adds the stay dates after the guest picks dates. That page's <title> is "Vacation VI - Online Booking", and its og:title and og:site_name are "Vacation VI". Its header shows 3 logos together (Vacation VI, The Hills and Marketplace Suites). Its availability calendar, which loads inside the page, also lists other businesses' rentals (The Hills, Rockroom, Snorkel Gear, Rotunda, villas such as Villa Seagate and Cay Syrah). A guest who leaves the hotel's site to pay lands on a page that shows several companies. The booking steps were opened, and the link with stay dates shows checkout steps Your trip, Agreement and Payment, with Suite 9 Marketplace nightly charges. Fix: ask Lodgix for a Marketplace Suites-only booking page (its own property group or a filtered booking widget) with its own title and logo. The same page carries a tag marked "Google tag (gtag.js) for Marketplace Suites Google Ads", so some ad tracking already runs on the booking step (see N-6, booking-click tracking).

The Lodgix booking page with Vacation VI, The Hills and Marketplace Suites logos and a calendar of several businesses' rentals
Figure: lodgix.com/6283/: 3 logos, and a calendar shared with The Hills, villas and snorkel-gear rentals.

N-55MediumTracking cookies are set before any consent. (Both sites. CONFIRMED in a headless browser.) 15 cookies are set on page load with no guest action, including _ga, _gid, _gcl_au, HubSpot cookies and DoubleClick (a Google ad cookie). HubSpot's banner script loads, and no visible cookie banner appeared on the page as a browser displayed it. Both home pages also set _gat_UA-185349894-1, a Universal Analytics cookie. This extends A-21 and N-5. Fix: Consent Mode v2 defaults, a working banner for the regions that need one, and removal of the old Universal Analytics tag. EU behaviour was not tested.

N-56MediumNo hotel-level rating. The official site shows per-suite ratings, and the home page shows a TripAdvisor range and "278 guest reviews across our 12 suites", but no single hotel-level rating. Fix: a hotel-level review summary on the home page, and consistent property data on every OTA.

N-57Medium"The first and only suites located in the heart of Cruz Bay". LIKELY. This claim appears on the suite pages and could not be verified. Remove "first and only" unless the owner can support it.

// low

  • N-58Low Stock photos (judged by file name): 14 image files on the new site and 16 on the legacy site come from Shutterstock, Unsplash or Pexels (for example shutterstock_725153041_cruzbay_small@2x.png on the home page). Some files are resized copies, so there are fewer distinct photos. Keep the Shutterstock licences on file. Unsplash and Pexels images are free to use.
  • N-59Low Some OTA listing titles still carry old promo text such as "10 Off January Stays". Update the OTA listings with the promo calendar.

Checked and clean

  • No secrets, API keys or internal URLs in the 3 JavaScript files that the site owns.
  • /api/ldx sends no CORS headers, so other websites cannot read its answers, and its errors leak no internal details. It still has no cache. No dedicated rate-limit test was run (N-12).
  • Interaction speed at 4x CPU slowdown: the worst measured click-to-paint was 104 ms on the new home page (second date pick), and 88 ms on suite 9 and the legacy menu. The search click could not be measured on the new pages. Google's "good" INP limit is 200 ms.
  • Name, address, phone, 12 rooms and check-in 15:00 / check-out 10:00 (the times are in the JSON-LD only, not in visible text) match across the site and Trip.com.

// part c

Part C: Migration check

C.0 Summary

The technical migration is complete for URLs, page metadata and image paths. Every legacy sitemap URL gets a page or a redirect on the new site. Titles, descriptions, canonical addresses and robots tags are identical on all 91 shared URLs. All 159 legacy image paths in the img src of the legacy pages load, and the Search Console ownership check carries over. 11 other image files that only the legacy sitemap lists return 404 on the new site (N-7).

What changed is content and features, and some of it needs a decision:

  • Policy text changed and no source is cited for the change: the balance due on the cancellation policy page moved from 30 to 60 days, and the FAQ now says housekeeping can be arranged on request (N-32). The owner must approve.
  • Page content changed on /things-to-do/: 2 places were dropped and 1 was added.
  • Features were removed or replaced: the availability calendar on suite pages is replaced by a new calendar, and prices now show after dates are picked. The new home page's own reviews block replaces the TrustIndex widget.
  • Speed is mixed: the rebuilt pages score higher than the legacy site in PageSpeed mobile runs; the 77 snapshot pages do not (see N-1 for the medians).

C.1 Results

Check Result
Legacy sitemap URLs on new site 91 of 93 at 200. The other 2 (/property-category/*) return 301 to /suites/.
Historic legacy URLs (Wayback Machine archive of old pages, 131) 109 at 200, 11 redirected, 11 at 404. 10 of the 11 also return 404 on the legacy site. The 11th, /property-tags/family-suite/, redirects on the legacy site (see N-23, tag pages).
Legacy image paths on new site 159 of 159 at 200 (in the img src of the legacy pages); 11 of 86 image URLs listed in the legacy sitemap at 404
Title, description, canonical, robots on shared URLs Identical on all 91
H1 (main page heading) on shared URLs Identical except /suites/ (adds the place name)
Main content on shared URLs Mostly kept. Word counts drop on /contact-us/, /privacy-policy/, /things-to-do/, /suites/, /marketplace/, /cancellation-policy/, /terms-of-use/, /faq/, /inquiry/, /cruz-bay-suites-with-kitchenettes/ and all 12 suite pages. On /contact-us/ and /privacy-policy/ the header, footer and booking pop-up text differs. /things-to-do/ changed: it dropped "Wharfside Landing" and "Isola Shoppes" and added "ZoZo's at Caneel Bay". Policy and FAQ text also changed (see N-32).
JSON-LD (hidden page data for search engines) types on shared URLs Same types on 79 of 91 shared URLs. On the 12 suite pages the legacy site has Person, Rating and Review JSON-LD types that the new site lacks.
Search Console ownership check Same meta tag on both. Whether the ownership check survives the switch is not tested.
NAP (name, address, phone) Same address and phone on both
Features removed or replaced The availability calendar on the legacy site suite pages. The new pages show live prices after dates are picked, and the new suite pages have a date picker in the booking bar. TrustIndex reviews widget on the home page (the new home page has its own reviews block).
PageSpeed mobile, rebuilt pages (separate run on 11 page types, one run each) New scores higher: home score 87 against 58, /suites/ score 85 against 73, suite 9 score 64 against 56
PageSpeed mobile, snapshot pages (separate run on 11 page types, one run each) New scores lower on 6 of 8 tested. The medians over all pages are in N-1 (the snapshot pages).

// part d

Part D: Method and limits

Tools and data:

  • Crawl: every sitemap URL on both sites (93 legacy, 91 new), with titles, descriptions, canonicals, robots tags, headings, structured data (hidden page details for search engines), images and links recorded for each page.
  • Link and parity checks (same value on both sites): title, description, canonical and robots parity on all 91 shared URLs; 407 unique outbound links (links to other websites); heading levels; structured data fields.
  • Rendering: 16 page types per site rendered in Chromium (the Chrome browser engine) at 390 x 844, with console errors, failed requests, scroll width, tap targets and text size recorded. Key results were checked in a real browser on all 91 new pages.
  • Historic URLs: 131 unique old page addresses from the Wayback Machine (an online archive of past web pages), tested against the new site.
  • Speed: the PageSpeed Insights API (a Google speed test service) on 11 page types per site, and local Lighthouse (Google's page speed tool) 12.6.0 mobile on 3 pages per site, 6 runs in total, plus local Lighthouse 13.6.0 mobile on 5 pages per site, 3 runs each (30 runs). CrUX field data (real visitor speed data from Chrome) is in the PageSpeed response for the legacy site. The PageSpeed response for the new site has no field data. Lab numbers (scores from simulated tests) vary between runs. Use them for direction, not as exact values.
  • Full-site scan: PageSpeed and axe (an accessibility checker) on all 184 pages, plus structured data checks. validator.schema.org limited requests after 27 pages. The other 157 pages were checked against the structured data fields that Google requires, using a local script.
  • Booking flow: about 42 calls to the availability API (cap 60), all 12 suite pages, Chromium, Firefox and WebKit at 2 sizes, keyboard and no-JavaScript checks.
  • AI search readiness: robots.txt (the crawler rules file) has one rule group (User-agent: *, empty Disallow) that allows all 27 crawler user agents tested, live responses for 9 crawler user agents on each site (legacy: GPTBot and ClaudeBot returned 429 in one run; new: all 9 returned 200), and a GEO (AI search readiness) review of both home pages. Bytespider was not in the new site's 9-agent test. In a separate 6-request burst on the legacy site, its connection dropped each time.
  • Content review: all 91 new site pages against 187 requirements drawn from 14 Google sources (Part E).
  • Search data: third-party search data for the legacy site (US market, Google): modelled traffic and rankings (estimates), backlinks (links from other sites), live results pages, a 112-page crawl, the Google Business Profile, a local map-rank grid and 25 AI answers (Part I).

Quality control: the findings reflect the sites as they stood when tested. Some findings were checked again in a browser before they were included.

Notes on the data:

  • The "failed requests" in the rendering check are tracking requests that the browser cancelled. They go to Google advertising and analytics servers.
  • 44 outbound links returned 403 (access refused) or 429 (too many requests) to automated requests. In a browser, three AllTrails links and one championtraveler.com page returned 403, so these codes do not prove a broken link. These 44 links are not counted as broken.

Not checked: EU cookie behaviour and screen reader testing were not run.

  • Google Search Console (search traffic data) and GA4 (Google Analytics): this review had no access to the client's properties. Part I uses modelled third-party data in their place, which shows estimates, not real clicks. The hotel owner needs to grant access to both before the switch.
  • Form delivery: no live form submissions were sent, so nothing reached the client's inbox.
  • The content of kebaya4d.org (the site that a link on /marketplace/ redirects to): the domain did not load in a live test or in Chromium.
  • Citations (business listings) on directories other than Google, Tripadvisor and Trip.com: not checked.